常見注入手法第二講,APC注入
轉載注明出處
首先,我們要了解下什么是APC
APC 是一個簡稱,具體名字叫做異步過程調用,我們看下MSDN中的解釋,異步過程調用,屬於是同步對象中的函數,所以去同步對象中查看.
首先介紹一下APC,會了正想開發就會逆向注入
首先第一個函數
QueueUserApc: 函數作用,添加制定的異步函數調用(回調函數)到執行的線程的APC隊列中
APCproc: 函數作用: 回調函數的寫法.
我們首先要知道異步函數調用的原理,
異步過程調用是一種能在特定線程環境中異步執行的系統機制。
往線程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是否調用
②.編寫一個簡單的DLL用作注入使用
直接生成一個簡單的帶有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/
轉載請注明出處,謝謝