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


                  常見注入手法第二講,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/

轉載請注明出處,謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM