一段不錯的DLL自刪除代碼

 

#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的自刪除啦

發佈了22 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章