DLL解除安裝

2021-08-20 22:05:33 字數 2914 閱讀 7981

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

注意:使用freelibrary() api實現dll解除安裝,僅適用於解除安裝自己強制注入的dll檔案。pe檔案直接匯入的dll檔案是無法在程序執行過程中解除安裝的。

下面編寫針對之前dll注入編寫的injectdll.exe和myhack.dll的dll解除安裝程式ejectdll.exe程式。當然想解除安裝指定程序的指定dll檔案時只需修改**中常量定義部分即可。

#include "windows.h"

#include "tchar.h"

#include "tlhelp32.h"

//定義目標程序名和目標dll檔名常量

#define def_proc_name (l"notepad.exe")

#define def_dll_name (l"myhack.dll")

//檢視設定許可權

bool setprivilege(lpctstr lpszprivilege, bool benableprivilege)

//檢視本地系統的許可權值

if ( !lookupprivilegevalue(null, lpszprivilege, &luid) )

tp.privilegecount = 1;

tp.privileges[0].luid = luid;

if( benableprivilege )else

//啟用特權或禁用所有特權

if( !adjusttokenprivileges(htoken, false, &tp, sizeof(token_privileges), (ptoken_privileges) null, (pdword)null) )

if( getlasterror() == error_not_all_assigned )

return true;

}//查詢目標程序id

dword findprocessid(lpctstr szprocessname)

}while( process32next(hsnapshot, &pe) );

closehandle(hsnapshot);

return dwpid;

}//解除安裝dll

bool ejectdll(dword dwpid, lpctstr szdllname);

lpthread_start_routine pthreadproc;

//獲取載入到程序的所有模組(dll)資訊

hsnapshot = createtoolhelp32snapshot(th32cs_snapmodule, dwpid);

//迴圈遍歷所有模組資訊,查詢是否存在目標dll檔案

bmore = module32first(hsnapshot, &me);

for( ; bmore; bmore = module32next(hsnapshot, &me) )

} //查詢不到指定程序中的指定的dll檔案時,退出程式

if ( !bfound )

//獲取目標程序的控制代碼

if( !(hprocess = openprocess(process_all_access, false, dwpid)) )

//獲取模組控制代碼,再獲取模組中freelibrary() api控制代碼

hmodule = getmodulehandle(l"kernel32.dll");

pthreadproc = (lpthread_start_routine)getprocaddress(hmodule, "freelibrary");

//在目標程序中建立遠端執行緒並執行執行緒函式

引數是要解除安裝的dll的載入位址

hthread = createremotethread(hprocess, null, 0, pthreadproc, me.modbaseaddr, 0, null);

waitforsingleobject(hthread, infinite);

//關閉控制代碼

closehandle(hthread);

closehandle(hprocess);

closehandle(hsnapshot);

return true;

}int _tmain(int argc, tchar* argv)

_tprintf(l"[*]the pid of is %d\n", def_proc_name, dwpid);

//設定許可權

if( !setprivilege(se_debug_name, true) )

//解除安裝dll

if( ejectdll(dwpid, def_dll_name) )else

return 0;

}

先開啟notepad.exe程式,開啟process explorer檢視notepad.exe程式的pid,然後執行injectdll.exe向notepad.exe程序注入myhack.dll:

接著執行ejectdll.exe解除安裝myhack.dll,再到process explorer檢視:

可以看到,notepad.exe程序的myhack.dll已經被解除安裝成功。

DLL解除安裝

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

讓 DLL 解除安裝自身

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

讓 DLL 解除安裝自身

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