介紹
DLL(Dynamic-link library)注入禀崖,即兴革,把一個(gè)DLL文件放到目標(biāo)進(jìn)程中箍铭。
當(dāng)一個(gè)進(jìn)程的程序不是自己編寫的泊柬,而我們又需要該程序加載指定的dll,以便進(jìn)行某些操作诈火,這是就需要dll注入兽赁。當(dāng)一個(gè)進(jìn)程加載dll時(shí),dll被映射到該進(jìn)程的地址空間冷守。dll注入的最大目的刀崖,進(jìn)入目標(biāo)進(jìn)程的地址空間,這樣就可以操作目標(biāo)進(jìn)程中的對(duì)象了拍摇。
在應(yīng)用層中簡(jiǎn)單的跨進(jìn)程DLL注入方法:
1亮钦、CreateRemoteThread + LoadLibraryA/W
2、SetWindowsHook/SetWindowsHookEx
3充活、QueueUserAPC + LoadLibraryA
注入方式
1.遠(yuǎn)程線程注入步驟(假設(shè)事先寫好DLL文件)
OpenProcess() //獲取已知進(jìn)程的句柄蜂莉;
VirtualAllocEx() //在進(jìn)程中申請(qǐng)空間蜡娶;
WriteProcessMemory() //向進(jìn)程中寫入東西;
GetProcAddress() (LoadLibrary())//取得函數(shù)在DLL中的地址映穗,動(dòng)態(tài)加載DLL窖张;前為UNICODE版本
CreateRemoteThread() //在目標(biāo)進(jìn)程中創(chuàng)建遠(yuǎn)程線程;
CloseHandle() //關(guān)閉句柄男公;
2.利用hook注入荤堪。
Hook技術(shù)是基于windows消息機(jī)制的合陵。如果 給某個(gè)消息安裝了Hook枢赔,當(dāng)該消息發(fā)生時(shí),會(huì)先調(diào)用Hook函數(shù)拥知。
1.進(jìn)程B中的一個(gè)線程準(zhǔn)備向一個(gè)窗口post一條消息踏拜。
2.系統(tǒng)檢查該線程是否已經(jīng)安裝了WH_GETMESSAGE Hook,檢查結(jié)果為確實(shí)安裝了這種Hook低剔。
3.進(jìn)程B準(zhǔn)備調(diào)用Hook函數(shù),即GetMsgProc函數(shù)。但是該函數(shù)在MyDll.dll中几蜻,而MyDll.dll并沒有加載到進(jìn)程B寞冯。
- 進(jìn)程B加載MyDll.dll。
5.調(diào)用GetMsgProc函數(shù)
3.APC(異步過程調(diào)用)
注入的原理是利用當(dāng)線程被喚醒時(shí)APC中的注冊(cè)函數(shù)會(huì)被執(zhí)行的機(jī)制猜欺,并以此去執(zhí)行我們的DLL加載代碼位隶,進(jìn)而完成DLL注入的目的,其具體流程如下:
1)當(dāng)EXE里某個(gè)線程執(zhí)行到SleepEx()或者WaitForSingleObjectEx()時(shí)开皿,系統(tǒng)就會(huì)產(chǎn)生一個(gè)軟中斷涧黄。
2)當(dāng)線程再次被喚醒時(shí),此線程會(huì)首先執(zhí)行APC隊(duì)列中的被注冊(cè)的函數(shù)赋荆。
3)利用QueueUserAPC()這個(gè)API可以在軟中斷時(shí)向線程的APC隊(duì)列插入一個(gè)函數(shù)指針笋妥,如果我們插入的是Loadlibrary()執(zhí)行函數(shù)的話,就能達(dá)到注入DLL的目的窄潭。