高手挑战:谁能解释这个删除自己的EXE?
plato 2001-06-21 10:39:00 //Windows 2000
#include <stdio.h>
#include <windows.h>
LPVOID pFuncAfterDelSelf;
DWORD WINAPI ThreadFunc(LPVOID lpVoid)
{
DWORD CodeCopy[4096];
HANDLE hThread = GetCurrentThread();
pFuncAfterDelSelf = CodeCopy;
__asm
{
push 0
push 0
push hThread
push ExitThread
push SuspendThread
ret
}
return 0;
}
void __stdcall func(LPVOID func1, LPVOID func2)
{
int i;
for(i=0;i<20;i++)
{
__asm
{
push 1
call func1
push 1000
call func2
}
}
}
void foo(void)
{
}
void main(void)
{
HANDLE hModule = GetModuleHandle(NULL);
HANDLE hThread;
char szModuleName[MAX_PATH];
GetModuleFileName((HINSTANCE)hModule, szModuleName, MAX_PATH);
if(!(hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL)))
{
printf("cannot create thread\n");
ExitProcess(0);
}
Sleep(100);
CopyMemory(pFuncAfterDelSelf, func, (DWORD)foo-(DWORD)func);
CloseHandle( (HANDLE)4);
__asm
{
lea eax, szModuleName
push 0
push 0
push hThread
push ExitProcess
push Sleep
push MessageBeep
push ResumeThread
push eax
push pFuncAfterDelSelf
push hModule
push DeleteFile
push UnmapViewOfFile
ret
}
}