【发布时间】:2016-08-18 23:52:36
【问题描述】:
我将通过说明我是一名初级恶意软件分析师来开始这个问题,并希望一直在编程/分析标头的人可以提供一些建议。
通常,当编译器将 .exe 放在一起时,您会看到 .text、.data.、.rdata、.rsrc 等...但是作者如何掩盖这些名称以混淆执行静态分析的人呢?
【问题讨论】:
标签: compiler-construction static-analysis portable-executable
我将通过说明我是一名初级恶意软件分析师来开始这个问题,并希望一直在编程/分析标头的人可以提供一些建议。
通常,当编译器将 .exe 放在一起时,您会看到 .text、.data.、.rdata、.rsrc 等...但是作者如何掩盖这些名称以混淆执行静态分析的人呢?
【问题讨论】:
标签: compiler-construction static-analysis portable-executable
AFAIK,这些名字无关紧要,可以是任何东西。加载器查看标头和节标志以及其他数据,以了解程序需要多少内存、位置(如果没有重定位)、哪些部分需要可执行、哪些可写、哪些可读等等。加载程序负责处理这些事情并执行其他操作,例如重定位和与 DLL 绑定。您可以只有一个部分,其中包含大多数内容,代码,常量数据,非常量数据,导入信息。例如,我的编译器在 .data 下收集所有数据和导入信息。目前最多生成 3 个不同的部分:.text、.data、.reloc(重定位是可选的,顺便说一句),Windows 很高兴。
真正的模糊处理应该在编译后的机器代码的不同级别上完成,包括它的作用和方式。例如。使用代码作为数据,反之亦然,使用自行修改或在运行时生成的代码,使用会导致异常并将执行转移到异常处理程序的手工代码,所有这些如果你没有实际执行就很难正确或遵循代码(加分:在调试器下执行不同的操作)。还可以插入相当多的代码,这些代码基本上什么都不做,只会令人困惑并增加代码复杂性。人们还可以利用分析工具中的错误和限制,例如做一些非常规的事情,使用太大的数字,会导致计算溢出。并且在互联网时代,程序可能不完整,可能会在运行时从互联网上下载缺失的部分。好玩!
【讨论】:
dumpbin Visual Studio 实用程序可与/HEADERS 参数一起使用以查看所有节标题。您可能感兴趣的部分输出将如下所示:
如您所见,它为该特定 exe 的代码部分提供了“.text”的名称。此部分可以重命名为任何内容,只要符合Microsoft specification:
对于[超过 8 个字节的名称],此字段包含一个斜杠 (/),后跟一个十进制数字的 ASCII 表示,它是字符串表的偏移量。可执行图片不使用字符串表,也不支持超过 8 个字符的节名。
无论名称如何,都有一些方法可以找到一个部分是什么。
对于 .text 部分,它们至少需要设置 Execute 标志。并且 .text 部分的虚拟地址应该与可选头中定义的入口点相同。
导入部分(通常命名为 .idata)的地址必须设置在位于可选标头末尾的目录数组的第二个元素中。再次查看 dumpbin 输出的一部分:
2 目录数 0 [ 0] 导出目录的 RVA [大小] 2000 [ 0] 导入目录的 RVA [大小]在这种情况下,.idata 部分从虚拟地址 0x2000 开始。此外,此部分至少需要 Read 标志。
.data 部分可能更难追踪。与导入部分一样,它必须至少设置 Read 标志,但要确保您可以扫描 .text 部分以查找将数据移入或移出地址的操作码。此地址应位于其中一个数据节中,您可以通过查看可选标题中的节对齐来找到该节的开头。
例如,如果您发现 68 17 32 40 00 转换为 PUSH 0x00403217 并且节对齐为 0x1000,则 .data 节的开头可能是 0x3000(其中 0x00400000 是图像基址)。
【讨论】: