一、概述
APC是異步過程調用,系統創建線程的時候會為線程創建一個APC隊列,當線程調用SleepEx,WaitSingleObjectEx等函數時,并把線程狀態被設置為可提醒狀態時,線程并不會睡眠,而是檢查APC隊列是否為空,如果不為空,轉去執行APC隊列中的每一項,因此給目標進程中的線程插入APC,就可以實現進程注入。
二、用到的Windows API函數
函數QueueUserAPC可以插入APC到目標進程的線程,其原型如下:
DWORD WINAPI QueueUserAPC(
_In_ PAPCFUNC pfnAPC,//APC回調函數的指針
_In_ HANDLE hThread,//目標線程的句柄
_In_ ULONG_PTR dwData//傳遞給回調函數的參數
)
根據前一小結可知,可以調用API去讀寫目標進程,而本次APC注入需要線程句柄,進程句柄可以通過OpenProcess來獲得,那么同理,線程句柄可以通過函數OpenThread來獲得,函數原型如下:
HANDLE WINAPI OpenThread(
_In_ DWORD dwDesiredAccess,//打開權限
_In_ BOOL bInheritHandle,//子進程是否繼承該句柄
_In_ DWORD dwThreadId//線程ID
)
其中線程ID的獲取,可以通過枚舉線程來完成。用到的API如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
_In_ DWORD dwFlags