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