【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

下期预告


<<:  IT铁人DAY 5-MVC 介绍

>>:  [前端暴龙机,Vue2.x 进化 Vue3 ] Day11.列表渲染

《赖田捕手:番外篇》第 36 天:用 Netlify 布署前端网页 (一)

《赖田捕手:番外篇》第 36 天:用 Netlify 布署前端网页 (一) 那麽,你说你要一个完全免...

Day29 - [Shioaji] 超入门!永丰证券程序交易API快速上手 (2)

今天来看一下如何使用Shioaji问回历史交易资料,不过在此先提醒一下,上一篇有讲到的永丰讲师的Yo...

[Day13] 扩充 Boxenn 的 Record Mapper

扩充 Record Mapper 大部分 domain 的 mapper 皆为 key 的转换,而在...

Day12 iPhone捷径-媒体Part2

Hello 大家, 没有连假就要撑五天才可以放假呜呜, 撑得下去的... 接续着昨天继续介绍, 第一...

【HTML】【CSS】<table>里面时常无效的margin和padding

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...