自定义命名PE文件和标头

时间:2016-08-18 23:52:36

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

我将通过声明我是一名初级恶意软件分析师来启动这个问题,并希望有人能够提供编程/分析标题的建议。

通常,当编译器将.exe放在一起时,您将看到.text,.data。,.rdata,.rsrc等...但是作者怎么可能会隐藏这些名称以混淆执行静态分析的人?

3 个答案:

答案 0 :(得分:1)

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

的最佳教程

答案 1 :(得分:1)

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

SECTION HEADER #1  
   .text name  
    1000 virtual size  
    1000 virtual address (00401000 to 00401FFF)  
     200 size of raw data  
     200 file pointer to raw data (00000200 to 000003FF)  
       0 file pointer to relocation table  
       0 file pointer to line numbers  
       0 number of relocations  
       0 number of line numbers  
60000020 flags  
         Code  
         Execute Read

正如您所看到的,它为此特定exe的代码部分提供了名称“.text”。只要符合Microsoft specification

,此部分就可以重命名为任何内容
  

对于[名称长度超过8个字节],此字段包含斜杠(/),后跟一个十进制数字的ASCII表示,该数字是字符串表的偏移量。可执行映像不使用字符串表,也不支持长度超过8个字符的节名称。

有一些方法可以找到某个部分而不管其名称。

对于.text部分,他们至少需要设置Execute标志。并且.text部分的虚拟地址应该与可选标头中定义的入口点相同。

导入部分(通常名为.idata)必须在可选标头末尾的目录数组的第二个元素中设置其地址。再看一下dumpbin输出的一部分:

    2 number of directories
    0 [       0] RVA [size] of Export Directory
 2000 [       0] RVA [size] of Import Directory

在这种情况下,.idata部分从虚拟地址0x2000开始。此外,此部分至少需要Read标记。

.data部分可能更难以追踪。与导入部分一样,它必须至少设置Read标志,但要确保您可以扫描.text部分以查找将数据移入或移出地址的操作码。此地址应位于其中一个数据部分中,您可以通过查看可选标题中的部分对齐来查找该部分的开头。
例如,如果您发现68 17 32 40 00转换为PUSH 0x00403217且部分对齐为0x1000,那么.data部分的开头可能是0x3000(其中0x00400000是图像库)。

答案 2 :(得分:1)

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

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