主要來說與dll注入類似,dll注入是驅使目標程序呼叫loadlibrary() api,dll解除安裝則是驅動目標程序呼叫freelibrary() api:
引用指數:記錄dll被呼叫的次數,解除安裝時也要解除安裝相同的次數。
#include
"windows.h"
#include
"tjhelp32.h"
#include
"tchar.h"
#define def_proc_name(l"notepad.exe")
#define def_dll_name (l"myhack.dll")
dword findprocessid
(lpctstr szprocessname)
}while
(process32next
(hsnapshot,
&pe));
closehandle
(hsnapshot)
;return dwpid;
}bool setprivilege
(lpctstr lpszprivilege, bool benableprivilege)if(
!lookupprivilegevalue
(null
,//lookup privilege on local system
lpszprivilege,
//privilege to lookup
&luid)
) tp.privilegecount=1;
tp.privileges[0]
.luid=luid;
if(benableprivilege)
tp.privileges[0]
.attributes=se_privilege_enabled;
else
tp.privileges[0]
.attributes=0;
//enable the privilege or disable all privilegesif(
!adjusttokenprivileges
(htoken, false,
&tp,
sizeof
(token_privileges)
,(ptoken_privileges)
null
,(pdword)
null))
if(getlasterror()
==error_not_all_assigned)
return true;
}bool ejectdll
(dword dwpid, lpctstr szdllname)
; lpthread_start_routine pthreadproc;
//dwpid=notepad程序id
//使用th32cs_snapmodule引數,獲取載入到notepad程序的dll名稱
hsnapshot=
createtoolhelp32snapshot
(th32cs-snapmodule, dwpid)
; bmore=
module32first
(hsnopshot,
&me)
;for
(; bmore; bmore=
module32next
(hsnapshot,
&me))}
if(!bfound)
//獲取目標程序的控制代碼if(
!(hprocess=
openprocess
(process_all_access, false, dwpid)))
//獲取freelibrary() api位址
hmodule=
getmodulehandle
(l"kernel32.dll");
pthreadproc=
(lpthread_start_routine)
getprocaddress
(hmodule,
"freelibrary");
//在目標程序中執行執行緒
hthread=
createremotethread
(hprocess,
null,0
, pthreadproc, me.modbaseaddr,0,
null);
//pthreadproc為freelibrary() api的位址,me.modbaseaddr是要解除安裝的dll的載入位址
waitforsingleobject
(hthread, infinite)
;closehandle
(hthread)
;closehandle
(hprocess)
;closehandle
(hsnapshot)
;return true;
}int
_tmain
(int argc, tchar* ar**)
_tprintf
(l"pid of \"%s\" is %d\n"
, def_proc_name, dwpid)
;//更改privilegeif(
!setprivilege
(se_debug_name, true)
)return1;
//eject dllif(
ejectdll
(dwpid, def_dll_name)
)_tprintf
(l"ejectdll(%d, \"%s\") success!!!\n"
, dwpid, def_dll_name)
;else
_tprintf
(l"ejectdll(%d, \"%s\") gailed!!!\n"
, dwpid, def_dll_name)
;return0;
}
使用freelibrary()的方法僅適用於解除安裝自己強制注入的dll檔案,pe檔案直接匯入的dll檔案是無法在程序執行過程中解除安裝的。
參考文獻
《逆向工程核心原理》
DLL解除安裝
dll解除安裝 dll ejection 是將強制插入程序的dll彈出的一種技術,原理是驅使目標程序呼叫freelibrary api,即將freelibrary api的位址傳遞給createremotethread 的lpstartaddress引數並把要解除安裝的dll的控制代碼傳遞給lppa...
讓 DLL 解除安裝自身
今天的問題是 有沒有可能讓乙個 dll 自己解除安裝自己?這個問題可以分成兩個部分 解除安裝乙個 dll。解除安裝 dll 的 應該是放在 dll之中的。當然,如果不考慮後果的話,這個 並不難寫,如下 簡單說明一下 在 dllmain 初始化的時候儲存 dll 的例項控制代碼 即模組控制代碼 供 f...
讓 DLL 解除安裝自身
今天的問題是 有沒有可能讓乙個 dll 自己解除安裝自己?這個問題可以分成兩個部分 解除安裝乙個 dll。解除安裝 dll 的 應該是放在 dll之中的。當然,如果不考慮後果的話,這個 並不難寫,如下 include hmodule g hdll null dword winapi unloadpr...