轉載註明出處多線程
首先,咱們要了解下什麼是APC異步
APC 是一個簡稱,具體名字叫作異步過程調用,咱們看下MSDN中的解釋,異步過程調用,屬因而同步對象中的函數,因此去同步對象中查看.函數
首先介紹一下APC,會了正想開發就會逆向注入測試
首先第一個函數spa
QueueUserApc: 函數做用,添加制定的異步函數調用(回調函數)到執行的線程的APC隊列中線程
APCproc: 函數做用: 回調函數的寫法.code
咱們首先要知道異步函數調用的原理,對象
異步過程調用是一種能在特定線程環境中異步執行的系統機制。blog
往線程APC隊列添加APC,系統會產生一個軟中斷。在線程下一次被調度的時候,就會執行APC函數,APC有兩種形式,由系統產生的APC稱爲內核模式APC,由應用程序產生的APC被稱爲用戶模式APC隊列
這裏介紹一下應用程序的APC
APC是往線程中插入一個回調函數,可是用的APC調用這個回調函數是有條件的.咱們看下Msdn怎麼寫
MSDN說,要使用SleepEx,signalObjectAndWait.....等等這些函數纔會觸發
那麼使用APC場合的注入就有了,
1.必須是多線程環境下
2.注入的程序必須會調用上面的那些同步對象.
那麼咱們能夠注入APC,注意下條件,也不是全部都能注入的.
注入方法的原理:
1.當對面程序執行到某一個上面的等待函數的時候,系統會產生一箇中斷
2.當線程喚醒的時候,這個線程會優先去Apc隊列中調用回調函數
3.咱們利用QueueUserApc,往這個隊列中插入一個回調
4.插入回調的時候,把插入的回調地址改成LoadLibrary,插入的參數咱們使用VirtualAllocEx申請內存,而且寫入進去
使用方法:
1.利用快照枚舉全部的線程
2.寫入遠程內存,寫入的是Dll的路徑
3.插入咱們的DLL便可
編寫一個MFC程序,這個程序的做用就是調用上面的SleepEx.
這個程序啥也不幹,就是調用等待,注意第二個參數給TRUE,第二個參數決定了你的APC是否調用
直接生成一個簡單的帶有DllMain的入口的DLL便可.
在DLL附加的時候,調用一個MessageBox
咱們要注入的是MFC,也就是寫的測試程序,那麼如今咱們直接打開進程,打開線程,而後插入APC便可
在按鈕下面寫入咱們的代碼.
//1.查找窗口 HWND hWnd = ::FindWindow(NULL, TEXT("APCTest")); if (NULL == hWnd) { return; } /*2.得到進程的PID,固然通用的則是你把進程PID當作要注入的程序,這樣不侷限 於窗口了.這裏簡單編寫,進程PID能夠快照遍歷獲取 */ DWORD dwPid = 0; DWORD dwTid = 0; dwTid = GetWindowThreadProcessId(hWnd, &dwPid); //3.打開進程 HANDLE hProcess = NULL; hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); if (NULL == hProcess) { return; } //4.成功了,申請遠程內存 void *lpAddr = NULL; lpAddr = VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (NULL == lpAddr) { return; } //5.寫入咱們的DLL路徑,這裏我寫入當前根目錄下的路徑 char szBuf[] = "MyDll.dll"; BOOL bRet = WriteProcessMemory(hProcess, lpAddr, szBuf, strlen(szBuf) + 1, NULL); if (!bRet) { return; } //6.根據線程Tid,打開線程句柄 HANDLE hThread = NULL; hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwTid); if (NULL == hThread) { return; } //7.給APC隊列中插入回調函數 QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)lpAddr); CloseHandle(hThread); CloseHandle(hProcess);
代碼很簡單,就這幾行,其實能夠遍歷進程快照,獲取線程的TID,而後判斷快照中的進程PID是否和注入程序的PID相等,相等的話就能夠注入了.
這裏我寫死了,按理說根據PID就和TID就能夠注入,這裏我偷懶,根據窗口找進程的TID和PID
看下程序結果
注意,我偷懶了,這幾個程序要放在一塊兒,主要是DLL,要和被注入的程序放在一塊兒
,打開注入程序和被注入程序,被注入程序要點擊按鈕,讓其執行SleepEX
DLL功能被執行了,咱們用PCHunter看下被注入程序是否多了一個DLL
原創不易,若是你認爲寫的還好,請推薦加評論,好人一輩子平安,若是不太懂,能夠評論,看到會回覆.
課堂資料:
連接:http://pan.baidu.com/s/1bo1M6BH 密碼:tcu8
博客園IBinary原創 博客鏈接:http://www.cnblogs.com/iBinary/
轉載請註明出處,謝謝