0x0 介紹
之前說過,要動態注入dll檔案,則需要執行程式中本身沒有的載入操作,必須改變控制流,除了建立執行緒外,還可以劫持控制流。這與二進位制漏洞利用比較類似,我們向程式寫入一段shellcode,然後改變執行緒上下文,讓其去執行shellcode,這段shellcode完成loadlibrary的操作,就完成了dll注入。
傀儡程序的本質是利用其他程序空間來執行我們的寫入**,它的實現並不困難,經常作為惡意程式的記憶體駐留手段,它可以將乙個正在執行的程序作為傀儡程序,也可以建立乙個新的程序作為傀儡程序,這裡是用dll注入來進行示例,所以利用的是正在執行的程序。
0x1 setthreadcontext
對於乙個正在執行的執行緒,我們可以通過suspendthread函式暫停該執行緒的執行,然後系統會將執行緒上下文儲存起來,它擁有cpu的執行狀態資訊,resumethread函式利用該執行緒上下文來恢復執行緒的執行。乙個想法是我們使用setthreadcontext直接修改儲存的上下文的eip,就可以劫持控制流。
具體操作過程:
typedef struct _inject_data //結構體用於儲存shellcode執行所需資料
inject_data;
void shellcodefunc(void)
}
if (thread32first(hthreadsnap, &te32))
}while (thread32next ( hthreadsnap, &te32 )) ;
}
while(...)
...}
inject_data data;
lpdata = (pbyte)virtualallocex(hprocess, null, 0x1000, mem_commit, page_execute_readwrite);
zeromemory(&data,sizeof(inject_data));
prepareshellcode(data.shellcode);
lstrcpy(data.szdllpath,szdllfullpath); //dll路徑
data.addrofloadlibrarya = uloadlibraryaddrintargetproc; //loadlibrarya的位址
data.originaleip = ueip; //原始的eip位址
data.lpdllpath = lpdata + field_offset(inject_data,szdllpath) ; //szdllpath在目標程序中的位置
//向目標程序寫入shellcode
writeprocessmemory(hprocess, lpdata, &data, sizeof(inject_data), &dwret)
setthreadcontext(hthread,&context)
resumethread(hthread);
0x2 writeprocessmemory
除了設定執行緒上下文,直接暴力的用writeprocessmemory修改指令也是可以的。我們對一些呼叫頻率較高的api入口進行修改,這類似inlinehook,使得程式一旦呼叫該api,控制流就跳轉到shellcode中,然後在shellcode中進行入口的修復以及dll的載入,也能達到dll注入的效果。
0x3 廢話
雖然這裡的目的是dll注入,但實際上這是一些通用的劫持程式控制流的方法,本質上是通過shellcode來完成我們的功能。
Dll注入技術之依賴可信程序注入
黑客反病毒 dll注入技術之依賴可信程序注入 依賴可信程序注入原理是利用windows 系統中services.exe這個許可權較高的程序,首先將a.dll遠執行緒注入到services.exe中,再利用a.dll將b.dll遠執行緒注入到待注入程序中。具體過程如下圖所示 這裡提供乙個小技巧,當注入...
DLL注入技術之依賴可信程序注入
dll注入技術之依賴可信程序注入 依賴可信程序注入原理是利用windows 系統中services.exe這個許可權較高的程序,首先將a.dll遠執行緒注入到services.exe中,再利用a.dll將b.dll遠執行緒注入到待注入程序中。具體過程如下圖所示 這裡提供乙個小技巧,當注入到servi...
DLL注入技術之依賴可信程序注入
dll注入技術之依賴可信程序注入 依賴可信程序注入原理是利用windows 系統中services.exe這個許可權較高的程序,首先將a.dll遠執行緒注入到services.exe中,再利用a.dll將b.dll遠執行緒注入到待注入程序中。具體過程如下圖所示 這裡提供乙個小技巧,當注入到servi...