Compiler construction 自定义命名PE文件和标题

Compiler construction 自定义命名PE文件和标题,compiler-construction,static-analysis,portable-executable,Compiler Construction,Static Analysis,Portable Executable,我将首先说明我是一名初级恶意软件分析师,希望一直在编程/分析标题的人能提供一些建议 通常,当编译器将.exe放在一起时,您将看到.text、.data、.rdata、.rsrc等。。。但是,作者如何才能混淆这些名称,从而混淆进行静态分析的人呢 据我所知,这些只是部分的名称,一些打包机(如UPX)将这些名称更改为UPX0或其他名称,但这些实际上并不重要,因为它们只是名称,您可以将其更改为任何您想要的名称。PE文件中的重要信息包括这些部分的地址。您可以在中阅读有关PE文件的更多信息。这是一个关于体育

我将首先说明我是一名初级恶意软件分析师,希望一直在编程/分析标题的人能提供一些建议


通常,当编译器将.exe放在一起时,您将看到.text、.data、.rdata、.rsrc等。。。但是,作者如何才能混淆这些名称,从而混淆进行静态分析的人呢

据我所知,这些只是部分的名称,一些打包机(如UPX)将这些名称更改为UPX0或其他名称,但这些实际上并不重要,因为它们只是名称,您可以将其更改为任何您想要的名称。PE文件中的重要信息包括这些部分的地址。您可以在中阅读有关PE文件的更多信息。这是一个关于体育结构的非常好的教程。此外,这是我读过的关于PE文件的最好教程()

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

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 在这种情况下,.idata部分从虚拟地址0x2000开始。此外,此部分至少需要
Read
标志

A.数据段可能更难追踪。与导入部分一样,它必须至少设置了
Read
标志,但要确保您可以扫描.text部分以查找将数据移动到地址或从地址移动数据的操作码。此地址应位于其中一个数据节中,您可以通过查看可选标题中的节对齐方式找到节的开头。

例如,如果您发现
68 17 32 40 00
转换为
PUSH 0x00403217
,并且节对齐为0x1000,则.data节的开始可能是0x3000(其中0x00400000是图像基).

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 在这种情况下,.idata部分从虚拟地址0x2000开始。此外,此部分至少需要
Read
标志

A.数据段可能更难追踪。与导入部分一样,它必须至少设置了
Read
标志,但要确保您可以扫描.text部分以查找将数据移动到地址或从地址移动数据的操作码。此地址应位于其中一个数据节中,您可以通过查看可选标题中的节对齐方式找到节的开头。

例如,如果您发现
68 17 32 40 00
转换为
PUSH 0x00403217
,并且节对齐为0x1000,那么.data节的开始可能是0x3000(其中0x00400000是图像基础)。

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


真正的模糊应该在编译好的机器代码的不同层次上完成,包括它的功能和方式。例如,将代码用作数据,反之亦然,使用自修改或在运行时生成的代码,使用可能导致异常的手工代码,并将执行转移到异常处理程序中,所有这些都是在您没有实际执行代码的情况下很难正确执行或遵循的事情(附加点:调试器下的不同执行)。还可以插入相当多的代码,这些代码本质上什么也不做,但会造成混乱,增加代码复杂性。人们还可以利用分析工具中的缺陷和局限性,例如做一些非常规的事情,使用太大的数字,并会导致计算溢出。在互联网时代,程序可能不完整,并且可能在运行时从互联网下载缺失的部分。有趣

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

真正的模糊应该在编译好的机器代码的不同层次上完成,包括它的功能和方式。例如,将代码用作数据,反之亦然,使用自修改或在运行时生成的代码,使用可能导致异常的手工代码,并将执行转移到异常处理程序中,所有这些都是在您没有实际执行代码的情况下很难正确执行或遵循的事情(附加点:调试器下的不同执行)。O