【问题标题】:Custom Named PE Files and Headers自定义命名的 PE 文件和头文件
【发布时间】:2016-08-18 23:52:36
【问题描述】:

我将通过说明我是一名初级恶意软件分析师来开始这个问题,并希望一直在编程/分析标头的人可以提供一些建议。

通常,当编译器将 .exe 放在一起时,您会看到 .text、.data.、.rdata、.rsrc 等...但是作者如何掩盖这些名称以混淆执行静态分析的人呢?

【问题讨论】:

    标签: compiler-construction static-analysis portable-executable


    【解决方案1】:

    AFAIK,这些名字无关紧要,可以是任何东西。加载器查看标头和节标志以及其他数据,以了解程序需要多少内存、位置(如果没有重定位)、哪些部分需要可执行、哪些可写、哪些可读等等。加载程序负责处理这些事情并执行其他操作,例如重定位和与 DLL 绑定。您可以只有一个部分,其中包含大多数内容,代码,常量数据,非常量数据,导入信息。例如,我的编译器在 .data 下收集所有数据和导入信息。目前最多生成 3 个不同的部分:.text、.data、.reloc(重定位是可选的,顺便说一句),Windows 很高兴。

    真正的模糊处理应该在编译后的机器代码的不同级别上完成,包括它的作用和方式。例如。使用代码作为数据,反之亦然,使用自行修改或在运行时生成的代码,使用会导致异常并将执行转移到异常处理程序的手工代码,所有这些如果你没有实际执行就很难正确或遵循代码(加分:在调试器下执行不同的操作)。还可以插入相当多的代码,这些代码基本上什么都不做,只会令人困惑并增加代码复杂性。人们还可以利用分析工具中的错误和限制,例如做一些非常规的事情,使用太大的数字,会导致计算溢出。并且在互联网时代,程序可能不完整,可能会在运行时从互联网上下载缺失的部分。好玩!

    【讨论】:

      【解决方案2】:

      据我所知,这些只是部分的名称,一些像 UPX 这样的打包程序将这些名称更改为 UPX0 或其他名称,但这些真的无关紧要,因为它们只是名称,您可以将其更改为任何您想要的. PE 文件中的重要信息包括这些部分的地址。您可以在here 中阅读有关 PE 文件的更多信息。这是一个关于PE结构的非常好的教程。这也是我读过的关于 PE 文件的最好的教程here

      【讨论】:

        【解决方案3】:

        dumpbin Visual Studio 实用程序可与/HEADERS 参数一起使用以查看所有节标题。您可能感兴趣的部分输出将如下所示:

        第 1 节标题 .text 名称 1000 虚拟大小 1000 个虚拟地址(00401000 到 00401FFF) 200大小的原始数据 200 指向原始数据的文件指针(00000200 到 000003FF) 0 指向重定位表的文件指针 0 指向行号的文件指针 0 搬迁次数 0 行号数 60000020 个标志 代码 执行读取

        如您所见,它为该特定 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 是图像基址)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-12
          • 2019-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多