PUSH 0
CALL @1
DB 'title',0
@1: CALL @2
DB 'message',0
@2: PUSH 0
CALL MessageBoxA
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;
}
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的时候的情况是这样的
localvar2
localvar1
返回地址
arg1
arg2
arg3
……
addr of DeleteFile
arg
因为UnmapViewOfFile只有一个参数,所以它是将arg,即push module压入的module作为它的参数,将DeleteFile的地址作为了返回地址,所以,在UnmapViewOfFile执行完后,就会返回到DeleteFile处执行,执行DeleteFile的时候也是用了相同的方法,用push 到栈中的eax作为参数,后面ExitProcess用第一个push 0作为参数,第二个,仅为了符合API的调用约定arg
摘自:http://blog.csdn.net/ciahi/archive/2007/12/19/1954377.aspx