讓 DLL 解除安裝自身

2021-04-27 02:41:50 字數 663 閱讀 4009

今天的問題是:有沒有可能讓乙個 dll 自己解除安裝自己?

這個問題可以分成兩個部分:

解除安裝乙個 dll。

解除安裝 dll 的**應該是放在 dll之中的。

當然,如果不考慮後果的話,這個**並不難寫,如下:

簡單說明一下:在 dllmain 初始化的時候儲存 dll 的例項控制代碼(即模組控制代碼)供 freelibrary 呼叫,然後開啟乙個執行緒,在適當的時機呼叫 freelibrary 銷毀 dll。

但是,如果實際執行起來的話,我們會遇到乙個很實際的問題:在 freelibrary 之後,該 dll 的位址空間就不再可用了,但這時 eip 指標仍然會指向 freelibrary 的下面一句,於是程式崩潰。

所幸,win32 提供了另外的乙個 api——freelibraryandexitthread,這個函式能夠在銷毀 dll 之後直接呼叫 exitthread,這樣一來 eip 指標就不會指向非法的位址了。因此,我們只需要把 freelibrary 的一句替換為:

這樣就可以了。

實際測試一下,在 dll 被載入後,july 的模組檢視顯示了這個被載入的 dll。

在記憶體檢視中檢查模組控制代碼指向的內容,證明該 dll 的確被載入了。

freelibraryandexitthread 呼叫後,再檢視該模組控制代碼指向的記憶體,該位址已不再可用,銷毀成功。

讓 DLL 解除安裝自身

今天的問題是 有沒有可能讓乙個 dll 自己解除安裝自己?這個問題可以分成兩個部分 解除安裝乙個 dll。解除安裝 dll 的 應該是放在 dll之中的。當然,如果不考慮後果的話,這個 並不難寫,如下 include hmodule g hdll null dword winapi unloadpr...

DLL解除安裝

dll解除安裝 dll ejection 是將強制插入程序的dll彈出的一種技術,原理是驅使目標程序呼叫freelibrary api,即將freelibrary api的位址傳遞給createremotethread 的lpstartaddress引數並把要解除安裝的dll的控制代碼傳遞給lppa...

DLL解除安裝

主要來說與dll注入類似,dll注入是驅使目標程序呼叫loadlibrary api,dll解除安裝則是驅動目標程序呼叫freelibrary api 引用指數 記錄dll被呼叫的次數,解除安裝時也要解除安裝相同的次數。include windows.h include tjhelp32.h inc...