DLL注入經典方法

2021-06-26 13:58:31 字數 2882 閱讀 1553

注入dll:

1. openprocess獲得要注入程序的控制代碼(可以先通過通過createprocess建立程序,獲取pid,然後由openprocesspid獲取)

2. virtualallocex在遠端程序中開闢出一段記憶體,長度為strlen(dllname)+1;

3. writeprocessmemory將dll的名字寫入第二步開闢出的記憶體中。

4. createremotethread將loadlibrarya作為執行緒函式,引數為dll的名稱,建立新執行緒

5. closehandle關閉執行緒控制代碼

解除安裝dll:

1. createremotethread將getmodulehandle注入到遠端程序中,引數為被注入的dll名

2. getexitcodethread將執行緒退出的退出碼作為dll模組的控制代碼值。

3. closehandle關閉執行緒控制代碼

3. createremotethread將freelibrarya注入到遠端程序中,引數為第二步獲得的控制代碼值。

4. waitforsingleobject等待物件控制代碼返回

5. closehandle關閉執行緒及程序控制代碼。

//code by pnig0s1992

//date:2012,3,13

#include 

#include 

#include 

//根據程序名查詢程序pid

dword

getprocesshandle(

lpctstr

lpprocessname)

//遍歷程序快照

processentry32 pe32;//宣告程序入口物件

pe32.dwsize = sizeof

(processentry32);

//填充程序入口物件大小

bool bmore = process32first(hsnapshot,&pe32);//遍歷程序列表

while (bmore)

bmore =

process32next(hsnapshot,&pe32);

} //關閉快照控制代碼

closehandle(hsnapshot); 

return

dwret;} 

intmain(

intargc,

char

* argv) 

//計算dll路徑名需要的記憶體空間

lpcstr

lpdllname = 

"evildll.dll"

;  dword

dwsize = strlen(lpdllname)+1;  

//使用virtualallocex函式在遠端程序的記憶體位址空間分配dll檔名緩衝區,成功返回分配記憶體的首位址.

lpvoid

lpremotebuf = virtualallocex(hprocess,null,dwsize,mem_commit,page_readwrite); 

//使用writeprocessmemory函式將dll的路徑名複製到遠端程序的記憶體空間,成功返回true.

dword

dwhaswrite = 0;

if(writeprocessmemory(hprocess,lpremotebuf,lpdllname,dwsize,&dwhaswrite))  }

else

//建立乙個在其它程序位址空間中執行的執行緒(也稱:建立遠端執行緒),成功返回新執行緒控制代碼.

dword

dwthreadid = 0; 

lpvoid

lploaddll = loadlibrarya; 

handle

hremotethread = createremotethread(hprocess,null,0,(lpthread_start_routine)lploaddll,lpremotebuf,0,&dwthreadid); 

if(hremotethread == null) 

waitforsingleobject(hremotethread,infinite); 

closehandle(hremotethread); 

//準備解除安裝之前注入的dll

dword

dwhandle,dwid; 

lpvoid

pfunc = getmodulehandlea;

//獲得在遠端執行緒中被注入的dll的控制代碼

handle

hthread = createremotethread(hprocess,null,0,(lpthread_start_routine)pfunc,lpremotebuf,0,&dwid); 

waitforsingleobject(hthread,infinite); 

getexitcodethread(hthread,&dwhandle);//執行緒的結束碼即為dll模組兒的控制代碼

closehandle(hthread); 

pfunc = freelibrary; 

hthread = createremotethread(hthread,null,0,(lpthread_start_routine)pfunc,(lpvoid

)dwhandle,0,&dwid); 

//將freelibrarya注入到遠端執行緒中去解除安裝dll

waitforsingleobject(hthread,infinite); 

closehandle(hthread); 

closehandle(hprocess); 

return

0; } 

Dll注入經典方法完整版

windows核心程式設計中dll章節有相關介紹 總結一下基本的注入過程,分注入和解除安裝 注入dll 1,openprocess獲得要注入程序的控制代碼 2,virtualallocex在遠端程序中開闢出一段記憶體,長度為strlen dllname 1 3,writeprocessmemory將...

Dll注入經典方法完整版

pnig0s1992 算是複習了,最經典的教科書式的dll注入。總結一下基本的注入過程,分注入和解除安裝 注入dll 1,openprocess獲得要注入程序的控制代碼 2,virtualallocex在遠端程序中開闢出一段記憶體,長度為strlen dllname 1 3,writeprocess...

Dll注入經典方法完整版

pnig0s1992 算是複習了,最經典的教科書式的dll注入。總結一下基本的注入過程,分注入和解除安裝 注入dll 1,openprocess獲得要注入程序的控制代碼 2,virtualallocex在遠端程序中開闢出一段記憶體,長度為strlen dllname 1 3,writeprocess...