恶意软件使用PE变形技术来修改PE文件的结构和代码,以产生不同的变种,从而使每个实例看起来不同,难以被传统的基于特征的病毒检测技术所识别。
■PE变形技术可能涉及以下几个方面:
●代码混淆:恶意软件使用各种技术,如指令替换、指令重排、无用代码插入等,来修改PE文件的代码,使其难以分析和识别。这样可以改变程序的控制流,增加分析的复杂性。
【注】我们将在PE加密壳一章详细讲解代码混淆。
●API重命名:恶意软件可能会修改PE文件中调用的系统API函数的名称,使其与正常的API名称不同。这可以使恶意软件的行为更难以检测,因为传统的防病毒软件通常会检查恶意软件是否调用已知的恶意API函数。
●动态链接:恶意软件可能会利用动态链接库(DLL)来加载恶意代码。这样可以使恶意软件变得更加模块化,同时也增加了分析和检测的复杂性。
【注】API重命名和动态链接我们已经在第九章动态加载中详细讲解过。
●数据加密:恶意软件可以使用加密算法对其内部的重要数据进行加密,以防止静态分析。在运行时,恶意软件会解密这些数据并使用它们来执行恶意操作。
【注】数据加密的方法我们将在PE病毒和加密壳两章详细讲解。
●文件格式修改:恶意软件可以修改PE文件的头部、节表、导入表等部分的结构和内容。这些修改可能与正常的PE文件格式规范不符,使恶意软件能够隐藏或混淆其行为。
PE变形技术是恶意软件作者用来逃避传统病毒检测的一种手段。为了对抗PE变形技术,防病毒软件需要不断更新其检测引擎和算法,以提高对新变种的检测能力。此外,行为分析和机器学习等技术也被广泛应用于检测和防御PE变形技术。
11.2.2 PE文件变形
■结构重叠技术
结构重叠技术是指在不影响正常性能的前提下,将某些数据结构进行重叠的技术。
实验七十七:重叠技术
我们以汇编版的HelloWord.exe为例(简洁)。将NT头和DOS头重叠。
第一步:将HelloWord2.exe拖入WinHex内,然后将整个NT头包括节表复制到DOS头的0000000C地址处。
第二步:修改0000003C地址处DOS头e_lfanew 字段4个字节的值为0000000C,指向PE 文件标识“PE00”。如下所示:
HelloWorld2.exe:
00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 50 45 00 00 MZ..........PE..
00000010 4C 01 05 00 E3 F0 2D 66 00 00 00 00 00 00 00 00 L...沭-f........
00000020 E0 00 02 01 0B 01 0E 10 00 0E 00 00 00 14 00 00 ?..............
00000030 00 00 00 00 6B 12 00 00 00 10 00 00 0C 00 00 00 ....k...........
00000040 00 00 40 00 00 10 00 00 00 02 00 00 06 00 00 00 ..@.............
00000050 00 00 00 00 06 00 00 00 00 00 00 00 00 60 00 00 .............`..
00000060 00 04 00 00 00 00 00 00 02 00 40 81 00 00 10 00 ..........@.....
00000070 00 10 00 00 00 00 10 00 00 10 00 00 00 00 00 00 ................
00000080 10 00 00 00 00 00 00 00 00 00 00 00 3C 25 00 00 ............<%..
00000090 B4 00 00 00 00 40 00 00 E0 01 00 00 00 00 00 00 ?...@..?......
000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 50 00 00 .............P..
000000B0 44 01 00 00 30 21 00 00 70 00 00 00 00 00 00 00 D...0!..p.......
000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000D0 00 00 00 00 A0 21 00 00 40 00 00 00 00 00 00 00 ....?..@.......
000000E0 00 00 00 00 00 20 00 00 B8 00 00 00 00 00 00 00 ..... ..?......
000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000100 00 00 00 00 2E 74 65 78 74 00 00 00 27 0C 00 00 .....text...'...
00000110 00 10 00 00 00 0E 00 00 00 04 00 00 00 00 00 00 ................
00000120 00 00 00 00 00 00 00 00 20 00 00 60 2E 72 64 61 ........ ..`.rda
00000130 74 61 00 00 80 0A 00 00 00 20 00 00 00 0C 00 00 ta..€.... ......
00000140 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150 40 00 00 40 2E 64 61 74 61 00 00 00 94 03 00 00 @..@.data...?..
00000160 00 30 00 00 00 02 00 00 00 1E 00 00 00 00 00 00 .0..............
00000170 00 00 00 00 00 00 00 00 40 00 00 C0 2E 72 73 72 ........@..?rsr
00000180 63 00 00 00 E0 01 00 00 00 40 00 00 00 02 00 00 c...?...@......
00000190 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . ..............
000001A0 40 00 00 40 2E 72 65 6C 6F 63 00 00 44 01 00 00 @..@.reloc..D...
000001B0 00 50 00 00 00 02 00 00 00 22 00 00 00 00 00 00 .P......."......
000001C0 00 00 00 00 00 00 00 00 40 00 00 42 00 00 00 00 ........@..B....
000001D0 00 00 00 00 40 00 00 40 2E 72 65 6C 6F 63 00 00 ....@..@.reloc..
000001E0 44 01 00 00 00 50 00 00 00 02 00 00 00 22 00 00 D....P......."..
000001F0 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 42 ............@..B
第三步:分别在Windows64位系统和32位系统中实验并测试运行。
Windows10 64位系统:测试运行正常。
WindowsXP 32位系统:测试运行正常。
【注】WindowsXP需独立编译。
结论
PE文件的DOS头中,真正有用的只有第一个字段e_magic和最后一个字段e_lfanew,因此可以将PE头复制到字段e_magic后,实现DOS头与PE头的结构重叠。注意需要保证DOS头3CH地址处的最后一个字段e_lfanew指向PE头,且此处原PE头对应的字段加载PE时不会检查。
■空间调整技术
我们以不固定大小的数据块DOS STUB为例介绍空间调整技术。具体思路是,通过调整字段IMAGE_DOS_HEADER.e_lfanew的值(PE头相对于文件的偏移地址),实现动态地扩充或缩小DOS STUB块空间,从而达到PE变形的目的。
实验七十八:空间调整技术
我们以汇编版的HelloWord.exe为例。将NT头和DOS头之间的空间增大1024个字节。
第一步:将HelloWord.exe拖入WinHex,计算PE节表和.text节区间的空余字节数:
00000400h-00000260h=1A0h(416个字节)。
第二步:在NT头“5045”起始位置,插入416个零字节。
第三步:删除节表和.text节区间的零字节,保持原.text节表起始位置00000400h不变。
第四步:将DOS头的e_lfanew 字段4个字节的值000000C8改为00000268h,指向新的PE特征值位置。如下所示:
HelloWorld3.exe:
00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ............
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ?......@.......
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 00 00 68 02 00 00 ............h...
第五步:分别在Windows64位系统和32位系统中实验并测试运行。
Windows10 64位系统:测试运行正常。
WindowsXP 32位系统:测试运行正常。
【注】WindowsXP需独立编译。
注意
DOS头和PE头之间扩展的空间最好限定在1024(400H)个字节内。因为这样可以保持原PE文件各个节区地址不变,否则就需要修改节表和所有节区内的RVA地址,带来不必要的麻烦。
练习
请读者使用第六章中给出的无导入表和重定位表的HelloWorld3_1.exe程序(只有一个.text节区)测试,将DOS头和PE头之间扩展的空间增加4096个字节,并在DTDebug调试器中观察加载HelloWorld.exe后的内存结构。
操作步骤:
步骤1:修改IMAGE_DOS_HEADER.e_lfanew的值,00000040H(4096)地址处增加一个页面大小1000h,由原来 的000000A8 更改为 000010A8。
步骤2:如果在PE文件结尾处增加4096个字节,则需要将HelloWorld2_1.exe的PE标识符起始位置开始的所有非零数据全部复制到 000010A8位置(采用覆盖方式)。
步骤3:修改字段 IMAGE_OPTIONAL_HEADER32AddressOfEntryPoint 的值,由原来的 00001124 更改为 00002124。
步骤4:修改字段IMAGE_OPTIONAL_HEADER32SizeOflmage的值,由原来的 00002000 更改为 00003000。
步骤5:修改字段 IMAGE_OPTIONAL_HEADER32SizeOfHeaders 的值,由原来的 00000200 更改为 00001200。
步骤6:修改字段 IMAGE_SECTION_HEADER.VirtualAddress 的值,由原来的 00001000 更改为00002000。
步骤7:修改字段 IMAGE_SECTION_HEADER.PointerToRawData 的值,由原来的 00000200 更改为 00001200。
因为该HelloWorld3_1.exe PE文件没有重定位信息、没有导入表、没有数据段、没有数据目录项,且只有一个节,所以本测试中所有需要修改的参数都已列出。
■数据转移技术
出于某种考虑,将PE中的一部分数据转移到另一个位置。比如,将程序中的变量存储到文件头部结构的某个字段中,将代码转移到头部结构的某个连续空间中等,这就是数据转移技术。该技术包括对变量的存储和代码的存储。
实验七十九:数据转移技术
我们以汇编版的HelloWord.exe为例。将.data节区内的数据转移到DOS块中。
第一步:将00000080h地址处的.data节区数据复制到DOS块00000040h地址处,覆盖原有DOS块内容,原.data节区数据清零。
HelloWorld4.exe:
00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ............
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ?......@.......
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 00 00 C8 00 00 00 ............?..
00000040 68 65 6C 6C 6F 00 48 65 6C 6C 6F 2C 77 65 6C 63 hello.Hello,welc
00000050 6F 6D 65 20 74 6F 20 50 45 21 00 00 00 00 00 00 ome to PE!......
第二步:修改.text节区RVA地址。
00000400 6A 00 68 40 00 40 00 68 46 00 40 00 6A 00 E8 07 j.h@.@.hF.@.j.?
00000410 00 00 00 6A 00 E8 06 00 00 00 FF 25 08 20 40 00 ...j.?...%. @.
00000420 FF 25 00 20 40 00 00 00 00 00 00 00 00 00 00 00 %. @...........
第三步:测试。
Windows10 64位系统:测试运行正常。
WindowsXP 32位系统:测试运行正常。
【注】WindowsXP需独立编译。
结论
由于PE文件中的DOS块没有什么具体用途,并且加载到内存后,PE头所在的内存块具有可读的属性,因此我们可以将原.data数据段中的数据拷贝到DOS块中,程序运行时同样可以正确地读取数据。
【注意】由于存储数据的地址发生了变化,因此需要修改代码段中所有涉及到数据的RVA地址。
■数据压缩技术
在编写程序的过程中,如果指令代码比较长,可以先对代码实施压缩,然后在PE头部找一块比较大的连续区域存放解压缩用的代码。程序被PE加载器加载后,文件头就基本不再使用了。这时,可以将存储的压缩代码通过PE头部的解压缩程序进行解压,解压后即可通过跳转指令实施程序指令的转移。
由于压缩以后的代码不便于通过十六进制直观地看到,所以这种方法在一些病毒程序代 码中比较常见;另外,在一些加壳程序中会经常看到数据压缩技术。
先来看一个这种技术的应用,以下是某病毒代码的头部信息:
00000000 4D 5A 50 00 01 02 00 03 04 00 01 0F 00 01 FF FF MZP...........
00000010 00 02 B8 00 07 40 00 01 1A 00 22 01 00 02 BA 10 @?
00000020 00 01 0E IF B4 09 CD 21 B8 01 4C CD 21 90 90 54 ….???L? T
00000030 68 69 73 20 70 72 6F 67 72 61 6D 20 6D 75 73 74 his program must
00000040 20 62 65 20 72 75 6E 20 75 6E 64 65 72 20 57 69 be run under Wi
00000050 6E 33 32 0D 0A 24 37 00 88 50 45 00 02 4G 01 04 n32..$7. E. .L..
00000060 00 01 B5 2C EF 82 00 08 E0 00 01 8E 81 0B 01 02 ..?
00000070 19 00 01 02 00 03 06 00 07 10 00 03 10 00 03 20 ...............
00000080 00 04 40 00 02 10 00 03 02 00 02 01 00 07 03 00 ..©.............
00000090 01 0A 00 06 50 00 03 04 00 06 02 00 05 10 00 02 .…P...........
000000A0 20 00 04 10 00 02 10 00 06 10 00 0C 30 00 02 4E ...........0. .N
000000B0 00 1C 40 00 03 0C 00 53 43 4F 44 45 00 04 10 00 .SCODE....
000000C0 03 10 00 03 02 00 03 06 00 0E 20 00 02 60 44 41 ............'DA
000000D0 54 41 00 05 10 00 03 20 00 03 02 00 03 08 00 0E TA.............
000000E0 40 00 02 CO 2E 69 64 61 74 61 00 03 10 00 03 30 .?idata.....0
000000F0 00 03 02 00 03 0A 00 0E 40 00 02 CO 2E 72 65 6C .........?rel
00000100 6F 63 00 03 10 00 03 40 00 03 02 00 03 0C 00 0E oc.....@........
00000110 40 00 02 50 00 FF 00 FF 00 FF 00 6B C3 FF 25 30 .P. .. .k?%0
该病毒对两个标识字段并没有进行大的改动。注意观察节表部分内容,按照基础知识中 所介绍的,每个节表最少应该有40个字节,在这里明显大小并不符合。经过仔细分析之后才 知道,病毒程序对这部分数据进行了加密处理。下面详细分析病毒是如何加密该部分数据的。
>>50 45 00 02 4C 01
根据前面所学的知识,PE头部应该有两个“0”,在这里只是用了 00-02来表示这两个 “0”,看起来好像使用了简单的行程压缩算法。凡是有连续“0”的地方都将0的个数作为紧跟在“0”后面的一项。来看节SCODE的内容,如下所示:
000000B0 00 1C 40 00 03 0C 00 53 43 4F 44 45 00 04 10 00 .SCODE....
000000C0 03 10 00 03 02 00 03 06 00 0E 20 00 02 60
根据以上的猜测来还原该节的实际内容如下:
000000B0 00 1C 40 00 00 00 0C 00 53 43 4F 44 45 00 00 00 …SCODE.…
000000C0 00 10 00 00 00 10 00 00 00 02 00 00 00 06 00 00
000000D0 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60
根据恢复以后的节来看,对该算法的猜测应该是没有问题的。再仔细分析一下,该病毒的作者只对文件头部进行了加密,其他部分没有更改。也就是说,要想恢复这个PE文件的内容,只需要对头部进行处理即可。解密可以参考下面一段汇编源代码:
到此这篇pem后缀文件(pe文件是什么意思)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/61455.html