vfp程序自毁代码

VFP程序自毁代码
2007-11-24 14:16
有时候我们在编写程序的时候为了达到一定的目的需要程序本身进行自我销毁,但VFP是顺序执行代码的,用一般的删除文件的命令当然根本是不行的,但 我们知道DOS里的del 0%却可以自我销毁,这里我就用DOS的这个特殊点来示范一下VFP动态生成自我销毁BAT文件进行自毁的代码: 自毁1.prg
_screen.visible=.f.
_screen.top=-1024
k=MESSAGEBOX('本程序向你演示程序自毁的一个示例,希望能抛砖引玉.'+CHR(13)+CHR(13)+'你却是要进行程序自毁吗?','行者示例',33+256)
IF k=1
hh=CHR(13)+CHR(10)
f=SUBSTR(SYS(16),AT(':/',SYS(16))-1,LEN(SYS(16))-AT(':/',SYS(16))+2)
h=FCREATE('kill.bat')
[email=st='@echo]st=%27@echo[/email] off'+hh+'ntsd -c q -p '+ALLTRIM(STR(_VFP.ProcessID))+hh+"attrib -a -r -s -h "+'"&f"'+hh+'del '+'"&f"'+hh+'del %0'
=FWRITE(h,st)
=FCLOSE(h)
run kill.bat
ELSE
quit
endi
   上面的代码是程序自动生成一个可以结束本身进程并删除自身的BAT文件,然后再运行它,当然在实际运用过程中还要对它进行改良!把上面的代码编译为EXE文件即可。
在自毁1.prg中我们用到了一个强制结束进程的命令和一个外部BAT文件,但是在实际应用中当我们进行程序自毁的时候是没有必要进行进程强制结束的,(既然要自毁了就正常QUIT程序就行了),而且调用BAT文件会出现一个讨厌的黑屏,所以我们最好采用VBS脚本来实现:
自毁2.prg
k=MESSAGEBOX('本程序向你演示程序自毁的一个示例,希望能抛砖引玉.'+CHR(13)+CHR(13)+'你却是要进行程序自毁吗?','行者示例',33+256)
if K=1
SET TEXTMERGE ON
TEXT TO killme NOSHOW
:On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile(WScript.ScriptName)
WScript.Sleep 500
do while fso.FileExists("<<SYS(16,1)>>")
fso.DeleteFile("<<SYS(16,1)>>")
loop
ENDTEXT
STRTOFILE(killme,'KILME.VBS')
owsh=createobject("wscript.shell")
owsh.run("Wscript.exe KILME.VBS")
*quit
ENDI
这样就能达到我们的要求了!
    当然程序的自毁我们还可以用JS等脚本来实现,也可以利用WINDOWS的启动INI来实现,这里就不赘述了!

***************************************

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自毁程序是一些电脑高手编写的可执行代码,没有现成的。我给个代码你看一下,如果你能看懂就可以用了。面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) { HMODULE module = GetModuleHandle(0); CHAR buf[MAX_PATH]; GetModuleFileName(module, buf, sizeof buf); CloseHandle(HANDLE(4)); __asm { lea eax, buf push 0 push 0 push eax push ExitProcess push module push DeleteFile push UnmapViewOfFile ret } return 0; } 现在,我们先看一下堆栈中的东西 偏移 内容 24 0 20 0 16 offset buf 12 address of ExitProcess 8 module 4 address of DeleteFile 0 address of UnmapViewOfFile 调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错.而调用ExitProcess则应该不会返回. 这段代码的精妙之处在于: 1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对应的一个句柄. 2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码. 3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值