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

来源:互联网 发布:星际战甲 udp端口4950 编辑:程序博客网 时间:2024/05/16 08:18

今天突然看到下面的一段代码:

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的调用约定
原创粉丝点击