今天突然看到下面的一段代码:
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
……
localvar2
localvar1
返回地址
arg1
arg2
arg3
……
addr of DeleteFile
arg
arg