讓 DLL 解除安裝自身

2021-06-16 04:35:12 字數 791 閱讀 4390

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

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

解除安裝乙個 dll。

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

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

#include 

hmodule  g_hdll = null;  

dword  winapi unloadproc( pvoid  param)  

bool  winapi dllmain( hinstance  hinstdll,  dword  fdwreason,  pvoid  lpvreserved)  

return  true;  

}  

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

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

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

freelibraryandexitthread(g_hdll, 0);  

這樣就可以了。

讓 DLL 解除安裝自身

今天的問題是 有沒有可能讓乙個 dll 自己解除安裝自己?這個問題可以分成兩個部分 解除安裝乙個 dll。解除安裝 dll 的 應該是放在 dll之中的。當然,如果不考慮後果的話,這個 並不難寫,如下 簡單說明一下 在 dllmain 初始化的時候儲存 dll 的例項控制代碼 即模組控制代碼 供 f...

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...