常見注入手法第二講,APC注入

                  常見注入手法第二講,APC注入

轉載註明出處多線程

 

首先,咱們要了解下什麼是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是否調用

②.編寫一個簡單的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/

轉載請註明出處,謝謝

相關文章
相關標籤/搜索