#include <windows.h>
#include <tchar.h>
HMODULE hDll;
extern "C" __declspec(dllexport) void DeleteMe()
{
//在這裏幹其它想幹的事,如刪除其它exe文件
//下面代碼實現DLL自刪除
TCHAR* szDll = (TCHAR*)VirtualAlloc(NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
GetModuleFileName(hDll, szDll, MAX_PATH);
__asm
{
push 0 ;參數1
push 0
push szDll ;參數2
push ExitProcess
push hDll ;參數3
push DeleteFile
push FreeLibrary
ret
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hDll = hModule;
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
將代碼編譯爲test.dll,然後rundll32 test.dll,DeleteMe運行,test.dll就自己刪除了
那段__asm代碼就是精華所在了
執行ret後,就返回到FreeLibrary處去執行,這時候ESP+4就是FreeLibrary的參數,也就是相當於調用了FreeLibrary(參數3),而參數3是DLL自身的模塊句柄,所以相當於DLL自己把自己從rundll32.exe裏給卸載了;
FreeLibrary執行完後會將參數3出棧,並返回到DeleteFile處去執行,這時相當於調用了DeleteFile(參數2),參數2就是DLL文件自身的路徑啦,這個路徑必須存放在用VirtualAlloc在rundll32.exe裏分配的內存,因爲這時DLL已經被卸載了;
同理最後調用的是ExitProcess(參數1),防止rundll32繼續運行下去出錯。
這樣DLL就可以實現自刪除啦,這有啥用捏?藉助這個DLL,可以實現EXE的自刪除,例如把這個DLL放到一個EXE裏,當EXE需要自刪除的時候,先釋放出DLL,然後把EXE自身的路徑告訴DLL,最後CreateProcess rundll32 xxx.dll,DeleteMe,DeleteMe裏先刪除EXE,再自刪除,就可以實現EXE的自刪除啦