DLL解除安裝

2021-10-02 22:07:51 字數 3077 閱讀 4311

主要來說與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...