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:以条件跳转结尾的指令序列;


爱搜源码 » PinDemonium通用动态脱壳工具

发表评论

发表评论