滨_Notepad

学习工作点滴积累
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一段欺骗性代码和一个自删除程序的学习

Posted on 2007-12-19 22:15  新人~  阅读(322)  评论(0编辑  收藏  举报
今天突然看到下面的一段代码:
PUSH 0
    CALL 
@1
    DB 
'title',0
@1:    CALL @2
    DB 
'message',0
@2:    PUSH 0
    CALL MessageBoxA

明地一看也没有反应过来,不知道咋回事,且猛地想到了以前看过的一个自删除程序,当时也没理解是咋回事,今天又把以前发的那个贴子拿出来看了一下,终于明白了是怎么回事了。

先说这段欺骗代码,可以欺骗一些反汇编软件 ,使其逆成比较乱的代码,其实这段代码就是完成了如下的功能:

MessageBox(0,"message","title",0);

只是弹出一个对话框。call @1之后,将db "title",0的地址压入栈中,call @2后,将db "message",0的地址压入栈中,再执行到call MessageBox之前,栈的内容如下:

0

addr of "message"              ;在执行完call @2后压入的返回地址

addr of "title"                           ;执行完call @1后压入的返回地址

0

这样,就可以正常实现调用该函数了

下面再说一下这段自删除程序(因为在XP下不能用)

代码如下:

#include "windows.h"

int main(int argc, char *argv[])
{
    
char    buf[MAX_PATH];
    HMODULE module;
    
    module 
= GetModuleHandle(0);
    GetModuleFileName(module, buf, MAX_PATH);
    CloseHandle((HANDLE)
4);
    
    __asm 
    
{
      lea     eax, buf
      push    
0
      push    
0
      push    eax
      push    ExitProcess       
      push    module
      push    DeleteFile 
      push    UnmapViewOfFile
      ret
    }

     
    
return 0;
}

先说一下CloseHandle((HANDLE)4),这句话就是关闭了exe本身的image句柄。

后面的汇编代码是核心,实现了先执行了invoke UnmapViewOfFile,module

因为当函数调用的时候,栈中的情况是这样的

……
localvar2
localvar1
返回地址
arg1 
arg2
arg3
……
调用UnmapViewOfFile的时候的情况是这样的
addr of DeleteFile
arg
因为UnmapViewOfFile只有一个参数,所以它是将arg,即push module压入的module作为它的参数,将DeleteFile的地址作为了返回地址,所以,在UnmapViewOfFile执行完后,就会返回到DeleteFile处执行,执行DeleteFile的时候也是用了相同的方法,用push 到栈中的eax作为参数,后面ExitProcess用第一个push 0作为参数,第二个,仅为了符合API的调用约定

摘自:http://blog.csdn.net/ciahi/archive/2007/12/19/1954377.aspx