• SEO文章推广! 合作联系qq:122325244 正式全面改版 !免费SEO地址:https://www.seozhan.cn/tool 站长QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏SEO站长博客吧

PinDemonium通用动态脱壳工具

脚本编程 SEO站长博客 4个月前 (08-01) 38次浏览 已收录 0个评论

摘要

简介

本文是对 16 年的 blackhat 大会上 PinDemonium通用动态脱壳工具介绍。

   通用脱壳工具简介

通用脱壳工具可以通过以下方法实现:

-debuggers

-kernel modules

-hypervisor modules

-Dynamic Binary Instrumentation (DBI) frameworks

其中 PinDemonium 采用的就是 DB 的方法。

采用 DBI 主要原因是:

1. DBI 提供了对待分析二进制文件非常细粒度的控制,可以全面控制程序执行的代码,深入分析程序做了什么

2. 对反调试和反汇编技术免疫

3. 有丰富且文档完备的 API 集合用于从运行的程序中提取出信息,能改变程序运行时的行为

   PinDemonium 原理

通常,程序的一个内存地址要么可写,要么可执行,满足 Write xor Execution (WxorX)规则。但是加了壳的软件会违反这条规则。

通用脱壳工具原理:加壳的可执行文件必需在运行时脱壳脱壳过程中会向内存中写入新的代码,然后执行写入的代码。利用上述特性来构建通用脱壳工具

通用脱壳工具必须解决的两个问题:

1. 找到 Original Entry Point(OEP);

2. 修复 Import Directory 来重构可执行的版本。

第一个问题只能通过启发式的方法解决,因为脱壳过程什么时候结束是不可判定的。PinDemonium 综合多个文献中提出的启发式方法来增加找到 OEP 的可能性,并且重新构建一个可执行的版本。

第二个问题要找到 Import Address Table(IAT),从而找到相关的 API。

PinDemonium 也是利用通用脱壳工具的原理。记录被写过的地址来发现写后执行的内存区域,当被写过的内存区域要被执行时触发转储和分析功能,然后尝试找到程序所有的导入函数来重构一个可执行的程序。

   PinDemonium 特点

PinDemonium 先进性:

1. 考虑了堆上的代码;

2. 解决一些 IAT 混淆技术;

3. 综合多种 OEP 检测启发式方法来找到最好的可执行的去混淆后的程序。

PinDemonium 主要特点:

1. PinDemonium 的核心模块记录写过的地址(包括对远程进程的写),当发现写后执行的情况,就用 Scylla 对程序进行 dump。

2. 对 Scylla 进行了改进:

PE 重构模块:增加了对动态内存区域(例如堆)的考虑

IAT 搜索和重构模块:允许分析人员编写自己的去混淆代码并集成到 PinDemonium 中

3. 为了保持性能和简化识别写后执行代码的过程,忽略和脱壳无关的指令,如写栈和写 Process Environment Block(PEB)

4. 通过设置 PinDemonium 的一些标志可以开启 PinDemonium 相应的功能来对付某些壳所使用的技巧

   构成

PinDemonium 使用了两个第三方工具:插桩工具 Intel PIN 和 Scylla。

   Intel PIN

PinDemonium 选择插桩来实现通用脱壳工具, 因为:

1. 插桩提供了对待分析二进制文件非常细粒度的控制,可以全面控制程序执行的代码,深入分析程序做了什么;

2. 插桩对反调试和反汇编技术免疫;

3. 插桩有丰富且文档完备的 API 集合用于从运行的程序中提取出信息,能改变程序运行时的行为。

选择 Intel PIN,因为 PIN 功能全面,文档丰富。

PIN 插桩的粒度可以是:

Instruction:一条汇编指令;

Basic blocks:以条件跳转结尾的指令序列;

Trace:以无条件跳转结尾的基本块序列。

PIN 插桩粒度如图 1 所示

图 1

利用插桩可以实现多种功能,如图 2 所示,一个利用插桩计算程序指令数的例子。

图 2

pintool 是用户开发的 dll 来实现想要的功能。pintool 必须包含两个部分:

1. Instrumentation routines:代码收集完毕后执行的回调函数,可以用于分析代码属性和在适当位置插入 Analysis routines。

2. Analysis routines:可以在当前指令执行前或执行后执行的函数。

如图 3 所示,显示了 PIN 的流程。

图 3

   Scylla

Scylla 的两个主要功能是 IAT 搜索和 Import Directory 重构。其中,IAT 搜索部分,Scylla 使用两种技术搜索 IAT:基本 IAT 搜索和高级 IAT 搜索。

1. 基本 IAT 搜索

(a)Scylla 接受一个开始地址作为输入,从开始地址开始搜索 IAT;

(b)扫描包含开始地址的可执行页面中的 call 和 jump 指令,这些指令的每个目标地址作为可能的 IAT 入口指针;

(c)目标地址中的值和所有导入函数地址进行比较,如果没有一致的,目标地址就被淘汰;

(d)从上述步骤找到的 IAT 入口地址开始扫描内存,直到遇到 4 个 0 字节,这样就找到 IAT 的结束地址。同样,反向扫描就可以找到开始地址。

2. 高级 IAT 搜索

对所有可执行页面而不是仅仅对包含开始地址的可执行页面来搜索 IAT。

   系统结构

PinDemonium 系统结构如图 4 所示:

图 4

从图中可以看出,PinDemonium 主要包括 5 个模块:

1. WxorX handler module

2. Hooking Module

3. Dumping module

4. IAT search and reconstruction Module

5. IAT Fixing and Import Directory Reconstruction

   WxorX handler module

WxorX handler module 是 PinDemonium 的核心模块。WxorX handler module 记录写过的地址(包括对远程进程的写),当发现写后执行的情况,就用 Scylla 对程序进行转储。

为了检测写后执行,实现的两个重要功能:

1. Written addresses tracking:记录被写过的每个内存地址来创建 Write Interval(WI)。WI 是一个结构体,记录一片被写过的连续内存,包含以下信息:开始地址,结束地址,是否已分析的布尔标志,对 WI 所有启发式方法的结果。图 5 显示了对 2 个 WI 进行合并的三种情况。为了保持性能和简化识别写后执行代码的过程,忽略和脱壳无关的指令,如写栈和写 Process Environment Block(PEB)。

图 5

2. Write xor Execution (WxorX) addresses notifier:检查现在执行的指令是否在 WI 中,如果是,执行以下分析:

(a) Dump 违反 WxorX 规则的内存区域。内存区域的位置包含 3 种情况:PE 文件主模块,堆上的内存,其他程序的内存中;

(b) 重构 IAT 并生成正确的 Import Directory;

(c) 运用一系列启发式方法(熵,长跳转等)来评估目前的指令是否是 OEP。

WxorX addresses notifier 用于触发转储功能,当某个 WI 第一次被违反 WxorX 规则进行转储。为了解决图 6 的情况,当同一个 WI 中的跳转大于阈值时也会进行转储。

图 6

PinDemonium hook 系统调用来发现对远程进程的写,用 hashmap 将 pid 映射为 WI,监控用于执行注入载荷的相关函数,当发现对远程线程的写后执行时,PinDemonium 转储远程进程被写过的内存并调用启发式方法对转储结果进行评价。

   Hooking Module

Hooking Module 利用 Intel PIN 的功能对 API 和系统调用进行 hook 以达到跟踪程序行为的目的。图 7 显示的是对 API 的 hook。

图 7

图 8 显示的是对系统调用的 hook。

图 8

   Dumping module

许多内存转储工具,只会转储目标程序的主模块,遗漏了动态内存区域(例如堆)上的代码,如图 9 所示。

图 9

Dumping Module 依赖于 Scylla。PinDemonium 对 Scylla 进行了改进:将 Scylla 的 PE 重构模块增加了对动态内存区域(例如堆)的考虑。PinDemonium 将堆上的 WI 标记为 heap write interval,当 heap write interval 违反 WxorX 规则,不仅转储程序主模块,还向转储中添加新的节来包含 heap write interval 的内容并将 Entry Point 设在这个节内,如图 10 所示。

图 10

图 11 显示的是利用 Scylla 来转储。

图 11

   IAT search and reconstruction Module

为了获得更好的结果,PinDemonium 综合运用 Scylla 的基本 IAT 搜索和高级 IAT 搜索功能,如图 12 所示。

图 12

   IAT Fixing and Import Directory Reconstruction

没有能解决 IAT 混淆的通用技术,所以 PinDemonium 对 Scylla 进行改进,让分析人员能自己编写去混淆代码并集成到 PinDemonium 中。PinDemonium 实现了一种能够解决图 13 所使用的 IAT 混淆技术的算法。

图 13

   Heuristics implementation

PinDemonium 使用启发式方法对获得的转储进行评估,每个启发式方法可以在最终生成的报告中设置一个标志位,所有的的标志位帮助识别最好的转储。有 4 种启发式方法:

1. 熵:图 14 显示了加壳前后 MessageBox 程序的熵的情况。加壳后熵明显增加。所以可以对比脱壳前后熵的变化大小是否超过阈值来对脱壳结果进行判定。

图 14

2. 跳到节外:程序脱壳完毕后,调到 OEP 执行时通常会从一个节跳到另一个节,利用这一特点来对脱壳结果进行判定。

3. 长跳转:如图 15,程序脱壳完毕后,跳到原始代码去执行的情况通常不是(a)和(b)那种短跳转而是(c)那种长跳转,利用这一特点来对脱壳结果进行判定。

图 15

4. pushad popad:脱壳的过程中是否出现了 pushad 和 popad 这两条指令,如果都出现了就在报告中设置对应的标志位。

   实验效果

实验一,已知加壳类型的实验,实验结果如图 16:

图 16

实验二,未知加壳类型,样本来源于 virustotal,实验结果如图 17:

图 17

   使用

本人由于实验需求,利用 vmware 搭建了 PinDemonium 环境,实现批量脱壳。

   pin -t PINdemonium.dll — path-of-smaples\name-malwr.exe

通过这个指令可以实现样本的脱壳,脱壳结果截图如图 18:

图 18

设置 PinDemonium 的一些命令行参数可以开启 PinDemonium 相应的功能来对付某些壳所使用的技巧。

   相关文献

weinxin


SEO站长博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PinDemonium通用动态脱壳工具
喜欢 (0)
[h4ck3st@126.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址