iT邦幫忙

2021 iThome 鐵人賽

DAY 5
1
Security

打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理系列 第 5

【Day 05 】- 藏起來的 Module 還是被發現了QuO(基於暴力搜尋 PE Header 的方法與解法)

Agenda

  • 資安宣言
  • 測試環境與工具
  • 前情提要
  • 學習目標
  • 技術原理與程式碼
  • References
  • 下期預告

資安宣言


撰寫本系列文章目的在於提升資訊安全之實務能力,
並透過實作體悟到資訊安全領域的重要性,
本系列所有文章之內容皆有一定技術水平,
不得從事非法行為、惡意攻擊等非法活動,
「一切不合法規之行為皆受法律所約束」,
為了避免造成公司、廠商或玩家之間困擾,
所有實作不會拿已上市產品、Online Game 等等來作範例學習,
且部分具有深度、價值之內容,將會提升一定閱讀門檻(不對該技術做分析、解說),
請勿透過本系列文章所學,從事任何非法活動,請不要以身試法!!!


測試環境與工具

前情提要

就在前兩天已經講了以下內容:

  1. Blackbone 的其中一種 DLL 注入姿勢
  2. Blackbone 的其中一種 DLL 隱藏技巧

還沒看的人可以先點擊上面的連結觀看呦!

那今天會來談談,如何找出已透過 PEB 斷鏈隱藏起來的 DLL。

學習目標

  • 1.觀察斷鏈後的 PEB
  • 2.防止透過暴力搜尋找出 DLL

技術原理與程式碼

首先開始前要先說一下,
小弟我目前還屬於菜鳥階段,正不斷努力學習中,
若有發現錯誤或不妥之處還請不吝賜教。
歡迎大家多多留言,互相交流交流。

那麼進入今天主題~~

首先,先來觀察一下還沒有透過 PEB 斷鏈隱藏 DLL 時 PEB 的情況:

lkd> .process /p ffffd706ebf4e5c0; !peb ecc500b000
Implicit process is now ffffd706`ebf4e5c0
PEB at 000000ecc500b000

    --- --- ---
    --- --- ---
    
    Ldr                       00007ffd23c9f3a0
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 0x?? . 0x??
    Ldr.InLoadOrderModuleList:           0x?? . 0x??
    Ldr.InMemoryOrderModuleList:         0x?? . 0x??
            Base        TimeStamp      Module
    7ff72e150000 6148108f --- C:\Users\admin\Desktop\Project1.exe
    7ffd23b40000 493793ea --- C:\Windows\SYSTEM32\ntdll.dll
    7ffd22220000 0c2cf900 --- C:\Windows\System32\KERNEL32.DLL
    7ffd20650000 4736733c --- C:\Windows\System32\KERNELBASE.dll
    7ffd20330000 70f70cc4 --- C:\Windows\System32\ucrtbase.dll
    7ffd18fe0000 5ee8384d --- C:\Windows\SYSTEM32\VCRUNTIME140.dll

假設現在隱藏了 ntdll.dll 這個 Module:

lkd> .process /p ffffd706ebf4e5c0; !peb ecc500b000
Implicit process is now ffffd706`ebf4e5c0
PEB at 000000ecc500b000

    --- --- ---
    --- --- ---
    
    Ldr                       00007ffd23c9f3a0
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 0x?? . 0x??
    Ldr.InLoadOrderModuleList:           0x?? . 0x??
    Ldr.InMemoryOrderModuleList:         0x?? . 0x??
            Base       TimeStamp     Module
    7ff72e150000 6148108f --- C:\Users\admin\Desktop\Project1.exe
    7ffd22220000 0c2cf900 --- C:\Windows\System32\KERNEL32.DLL
    7ffd20650000 4736733c --- C:\Windows\System32\KERNELBASE.dll
    7ffd20330000 70f70cc4 --- C:\Windows\System32\ucrtbase.dll
    7ffd18fe0000 5ee8384d --- C:\Windows\SYSTEM32\VCRUNTIME140.dll


用普通的 API、簡單的方法就列舉不到啦~~

不過已經成功騙過 Cheat Engine 拉~

但是呢,
如果使用 Process-Explorer 查看的話,
你/妳就會發現:

/images/emoticon/emoticon04.gif ntdll.dll 被發現了!!!

所以所以~ 現在要進入今天的主軸了,
隱藏 Module 第二招:
刪除 MZ 標誌/刪除 Header

就在前天,也就是 【Day 03】- 打針!打針!從 R0 注入的那件事! 文章最後有說到,
Blackbone 注入 DLL 後會有兩個動作:

  1. PEB 斷鏈
  2. 刪除/移除 MZ 標誌
  • 什麼是 PE?
    • Portable_Executable
    • 從 wiki 可以看到以下這些副檔名都是 PE:
    • .acm
    • .ax
    • .cpl
    • .dll
    • .drv
    • .efi
    • .exe
    • .mui
    • .ocx
    • .scr
    • .sys
    • .tsp

說到這,先簡單的介紹一下 PE Structure:

用 Process Hacker 來對比一下 ntdll.dll:

  1. 藍色框就是 MS-DOS Header
  2. 紫色框就是 Sections

PE 的特徵:

  1. 最一開始的 4D 5A 就是 MZ 標誌(只要是 PE 都會有)
  2. MS-DOS stub 簡單講就是位於:This Program cannot be run in DOS mode
  3. 緊接著藍色框的 50 45 00 00 就是 PE Signature -> PE

好的,講到這邊已經簡單介紹完 PE 了。

所以你/妳有想到為什麼有些工具還是可以找到 PEB 斷鏈後的 DLL 嗎?
原因就是 DLL 也是一種 PE,它有 PE 的「特徵」,所以被「暴力」找出來了。

所以~
/images/emoticon/emoticon37.gif

只要想辦法把上面說到的 PE 特徵刪除,是不是就找不到了?!

現在就回到 BlackboneInject.c 的 BBInjectDll() 中

  1. 底下可以看到正在拿 NtHeader
PIMAGE_NT_HEADERS64 pHdr = RtlImageNtHeader( pUserBuf->module );
  1. 接著可以看到正在判斷是 x86 還是 x64 PE,
    然後拿出 OptionalHeader.SizeOfHeaders
    (x86 的 IMAGE_NT_OPTIONAL MAGIC 是 0x10b)
    (x64 的 IMAGE_NT_OPTIONAL MAGIC 是 0x20b)
    (SizeOfHeaders 存放著 DOS Header + NT Headers + Section Headers 的大小)
 size = 
     (pHdr->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) ?
                ((PIMAGE_NT_HEADERS32)pHdr)->OptionalHeader.SizeOfHeaders :
                pHdr->OptionalHeader.SizeOfHeaders;
  1. 然後記憶體權限改為可寫可讀可執行
ZwProtectVirtualMemory( 
                        ZwCurrentProcess(), 
                        &pUserBuf->module, 
                        &size, 
                        PAGE_EXECUTE_READWRITE, 
                        &oldProt 
                        )
  1. 再來就是把 DOS Header + NT Headers + Section Headers 全部清空!!
RtlZeroMemory( pUserBuf->module, size );
  1. 最後恢復記憶體保護
ZwProtectVirtualMemory( 
                        ZwCurrentProcess(), 
                        &pUserBuf->module, 
                        &size, 
                        oldProt, 
                        &oldProt 
                        );
  1. 再次打開 Process-Explorer

/images/emoticon/emoticon04.gif/images/emoticon/emoticon06.gif/images/emoticon/emoticon10.gif
還是被找到了阿,不是說刪除 PE 特徵,就找不到了嗎?????

看來 Process-Explorer 也不是省油的燈,我們稍後再來談談這件事,
先來執行一下自己寫好的暴力窮舉 DLL 的 EXE(找 PE 特徵),看看能不能找的到:

太棒了,連自己都找不到自己了 XDD

好了,最後來談談:
為什麼還是有些工具能找出隱藏起來的 DLL 呢?
已經斷鏈 + 刪除 PE Header 了,還能找到!?
嘿嘿嘿~

這就來介紹一下,在 EProcess 裡面還有一樣東西,它叫做:VadRoot
它是一個 _RTL_AVL_TREE 類型的二元樹,

那它的功能是什麼呢?
這裡簡單講一下,這個 VadRoot 裡面也藏有 DLL 資訊!!
所以如果能列舉一下這棵樹,然後刪掉(斷鏈)要隱藏的 DLL,是不是就.../images/emoticon/emoticon07.gif

最後簡單整理了一下思維:

  1. [R0、R3] PEB 斷鏈是為了防止:
    • CreateToolhelp32Snapshot/EnumProcessModulesEx
    • 等等的這些 API 列舉到注入的 DLL
  2. [R0、R3] 刪除 PE 頭部(MZ/0x5A4D/Header)
    • 是為了防止透過暴力搜尋 PE 特徵來找出 DLL
  3. [R0] VadRoot(鐵人 Day 06 才講)

好啦,VadRoot 是明天要講的內容,這篇就到這結束了!

大家若有發現哪裡寫得不好或錯誤的地方,都留個言討論一下吧 XD
那我們下期見 o( ̄▽ ̄)ブ

References

下期預告


上一篇
【Day 04】- 今天來把 Module 藏起來(基於 PEB 斷鏈,隱藏 DLL 的方法)
下一篇
【Day 06 】- Module 隱藏大法,不可能再被發現了吧 / _ \(基於 VAD 斷鏈的隱藏方法)
系列文
打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言