http://www.titilima.cn/readblog.PHP?id=138
點這裡下載示例代碼
實現文件自刪除不是一個特別新的話題了,不過貌似一直沒有特別完美的解決方式。從早先Gary Nebbett的堆棧溢出版本到後來的批處理、臨時文件等方式,無不存在著各樣瑕疵:如堆棧溢出不支持XP,臨時文件(批處理)不夠優雅等等。
當然,還有用驅動發IRP的方式,不過這只是一個自刪除,殺雞焉用牛刀?於是這個方案在我這兒亦不討論。
李馬討論的,只是一個2005年的老調重提:遠線程注入。2005年李馬提到的DLL遠程注入技術只是遠線程的最簡單應用,局限很多,能做的事情很少;下面的自刪除示例,則是如何讓遠線程能夠做更多的事,也可以說是一個補充材料,不必記入原創文檔了吧就。
言歸正傳。首先,我們假定這個線程函數是這樣的:
DWord WINAPI DelProc(LPVOID lpParam)
{
Sleep(50);
DeleteFileA((LPCSTR)lpParam);
return 0;
}
解釋一下,先用Sleep等待要刪除的程序結束,之後調用DeleteFile刪除目標文件。
現在,你可以在VC的Project Settings->C/C++->Category: Listing Files->Listing file type中,設置輸出文件的類型為“Assembly, Machine Code, and Source”或“Assembly with Machine Code”,這樣就會在編譯完成後生成帶有匯編代碼和指令機器碼的附屬文件供你下一步對照。——當然,如果你極熟悉匯編,這一步可以跳過。
在查看附屬文件後,我們可以提取出對我們有用的匯編代碼:
push 50
call Sleep
mov eax, [esp + 4]
push eax
call DeleteFileA
ret 4
之後,對照著對應的機器碼,構造下面的結構:
#pragma pack(push, 1)
typedef struct _tagDeleteStruct {
BYTE byPush;
DWord dwTime;
BYTE wCall1;
DWord dwSleep;
DWord dwMov;
BYTE byPushEax;
}