首页
社区
课程
招聘
[原创]文件运行后自删除的汇编代码
发表于: 2009-11-26 11:37 10515

[原创]文件运行后自删除的汇编代码

2009-11-26 11:37
10515
【文章标题】: 文件运行后自删除的汇编代码
【文章作者】: 孤独小狼
【作者主页】: http://hi.baidu.com/lonew0lf/
【作者QQ号】: 215371256
【下载地址】: 自己搜索下载
【操作平台】: winxp sp3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【链 接】: http://bbs.pediy.com/showthread.php?t=101984

--------------------------------------------------------------------------------
【详细过程】
  在论坛找过,没找到,自己写了个,送给和我一样刚开始学习的兄弟!
  
  .386
  .model flat,stdcall
  option casemap:none
  include       D:\masm32\include\windows.inc
  include       D:\masm32\include\user32.inc
  includelib    D:\masm32\lib\user32.lib
  include       D:\masm32\include\kernel32.inc
  includelib    D:\masm32\lib\kernel32.lib
  include       D:\masm32\include\comdlg32.inc
  includelib    D:\masm32\lib\comdlg32.lib
  .data?
  hBatFile dd ?
  szDelFileName db MAX_PATH dup (?)
  dwBytesWrite dd ?
  szCommand1 db MAX_PATH dup (?)
  .const
  szCommand2 db 'del ',0
  szCommand3 db ' del 1.bat ',0
  szFileName db '1.bat',0
  szError          db    '错误',0
  szErrorCreatFile db    '无法创建新文件',0
  .code
  start:
  invoke GetModuleFileName,NULL,offset szDelFileName,sizeof szDelFileName           ;获取程序本身的完整路径及文件名,GetModuleFileName这个函数我找了半天才找到的,很不容易啊!
  invoke lstrcat,offset szCommand1,offset szCommand2            ;将命令和路径、文件名连接起来
  invoke lstrcat,offset szCommand1,offset szDelFileName
  invoke lstrcat,offset szCommand1,offset szCommand3
  invoke CreateFile,offset szFileName,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,\
         FILE_ATTRIBUTE_NORMAL,0                                           ;在程序同目录下写入一个BAT文件
  
  .if eax==INVALID_HANDLE_VALUE              ;如果文件创建失败,出来提示,这个只是测试用,实际代码中要删除掉
       invoke MessageBox,NULL,offset szErrorCreatFile,offset szError,MB_OK or MB_ICONEXCLAMATION
      ret
  .endif
  mov hBatFile,eax
  xor eax,eax
  mov dwBytesWrite,eax
  invoke WriteFile,hBatFile,offset szCommand1,sizeof szCommand1,offset dwBytesWrite,NULL
  
  ;向BAT文件中写入命令
  invoke CloseHandle,hBatFile
  invoke WinExec,offset szFileName,SW_HIDE             ;以隐藏方式运行BAT文件
  invoke ExitProcess,NULL
  end start
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年11月19日 1:24:41

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
呃,批处理删除?
2009-11-26 13:19
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
3
感觉bat里面加上个ping延迟一下会更好。
或者bat里面先wmic process where name="processName" call terminate之类的结束进程的语句。
说错了不要见怪。
2009-11-26 13:31
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我没找到哪个API能做到自删除的功能,哪位兄弟知道了告诉下我啊!
谢谢各位的建议
2009-11-26 15:12
0
雪    币: 411
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
CreateRemoteThread ~
2009-11-26 16:11
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
LZ你运行过你的程序吗?
del 能直接删除正在运行的文件????

带着怀疑的态度,我运行了你的代码。结果没有让我惊讶。失败了

如果一句del就能搞定的话,
那WinDos2K的那段代码就不会成为经典了
2009-11-26 16:50
0
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
转,

昨天在图书馆,突然想起来好久没有关注程序这方面的问题了,堕落了,着实是堕落了,想起以前对它的疯狂。于是又跑到那块熟悉的地方去找找,看能否有令我感兴趣的书。看到了一本Detmer写的关于汇编的书,翻了几页很是喜欢,嗯,这几天就关心一下这方面的内容吧。
    上午在关注这方面的内容中,发现了下面这个贴子。其实以前在一本VC编程的书上看到过这个例子,只是当时对汇编什么都不懂,所以也没仔细看。现在觉得,那本书的作者完全就是抄的。中国人写的书就是这样(我感觉得是绝大多数),东拼西凑找些东西,不注重程序设计结构和算法,所以也就导致我现在“书非外国人写不读写”这种不好的状况。

    下面的代码由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不被删除.)

Gary Nebbett果然是WIN系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)
2009-11-26 16:54
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
5楼的兄弟,把这段代码放到程序的最后绝对可以自删除,我测试了很多遍的!
如果需要请留言,我可以附上我的程序的。
2009-11-27 08:14
0
雪    币: 306
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
小屁孩玩asm.
2009-11-27 09:35
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
符到程序最后?不是直接编译程序吗?
OK请把你的程序符上来吧,
2009-11-27 09:40
0
雪    币: 240
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
我帮你解决你的问题吧,你和自删除代码不行,
http://bbs.pediy.com/showthread.php?t=102056
2009-11-27 11:10
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
win2003 sp2下测试失败
2009-11-27 11:16
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我做了个动画演示的
http://mail.qq.com/cgi-bin/ftnExs_download?k=0c333135ee12ebcfcd7ee7391431541f015554545303500818000707041c525400561c0d5308051d020053510406515157045454323466011b41504732&t=exs_ftn_download&code=531521f0
你去看看
2009-11-27 23:26
0
雪    币: 252
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
批处理删除没意思吧.
2009-11-28 00:07
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
各位有好的方法也共享下呀?
2009-11-28 21:15
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
Windows XP sp3 测试无效
2009-11-30 14:28
0
雪    币: 22
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
自删除现在还有什么用?

能消灭痕迹吗? 能不被反汇编吗? 能不被恢复吗?
2009-11-30 16:05
0
雪    币: 229
活跃值: (528)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
18
asm+bat????
额的神啊。。。
2009-11-30 17:06
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
19
.data
szAdd db '\cmd.exe /c del "',0
quote db '"',0
.data?
SelfPath db MAX_PATH dup (?)
szCmd db MAX_PATH dup (?)
.code
delself:
invoke GetModuleFileName,NULL,offset SelfPath,MAX_PATH
invoke GetSystemDirectory,offset szCmd,MAX_PATH
invoke lstrcat,offset szCmd,offset szAdd
invoke lstrcat,offset szCmd,offset SelfPath
invoke lstrcat,offset szCmd,offset quote
invoke Sleep,200
invoke WinExec,offset szCmd,SW_HIDE
invoke ExitProcess,0
end delself

这样就可以了,呼呼
2009-11-30 17:06
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
LS的兄弟更精辟,学习了!
2009-12-1 22:18
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
21
N久前在VCbase里面就看到了push ret 借助rundll32运行dll删除的了,汇编下借助bat,还不如写成c,就几句代码了……Gary Nebbett的那个代码确实NB,膜拜之……
2009-12-2 00:13
0
游客
登录 | 注册 方可回帖
返回
//