立山 发表于 2025-3-28 13:20:14

WindowsPE文件格式入门03.节表

https://www.bpsend.net/thread-306-1-1.html
dump

我们点击运行程序历程加载时时,是把文件内里的数据映射进内存,这样历程内里的内存就拿到了各种各样的代码,数据等资源,但是如果我们反着来,就可以从历程的内存里把 exe 文件提出来,这个过程叫做dump过程
dump过程在对抗内里常常用到
第一代的壳功能比较简朴,其时的加壳软件在运行时肯定会在内存中还原代码。OS可以根据PE信息,将文件的数据映射到内存中,那么可以举行反操纵,将解密后的内存中的代码保存到文件中,这就称为内存dump。
内存dump可以跳过壳的各种复杂算法,直面原始代码。内存dump可以称为全能的脱壳方式。

https://i-blog.csdnimg.cn/img_convert/86f3ce7ef1739f2085693ea53df1df91.jpeg


[*]映射:按照节表的内容,将PE文件按照节表信息和节数据依次映射进入内存。
[*]DUMP:将内存中的数据按节表数据将目标数据拷贝出来成为一个PE.exe文件
dump的先决条件**:在OEP处dump,此时全局变量里的值未被初始化,不会存在全局变量的访问非常。**
手动Dump

描述Dump的原理,内存中必要dump的数据,PE头,节数据。

[*]拷贝PE文件头。
[*]根据PE模块确定模块基址,在内存中找到文件头的位置,根据文件头巨细将头数据dump到新文件中 。

[*]dump节数据。
[*]获取节的RVA(相对假造地址),计算出VA(内存绝对地址),根据文件巨细和内存巨细字段dump到新文件中。

[*]依次拷贝完所有节,保存关闭。
[*]文件巨细 = 0,则不必要dump,表现该节中都是未初始化的数据
[*]文件巨细 > 内存巨细,则dump文件巨细的数据
[*]文件巨细 < 内存巨细,同样dump文件巨细的数据,表现其他数据是未初始化的数据

演示

可以把整个内存数据拷贝出来放到文件,但是这样数据偏移就会有问题,必要自己去修节表,还可以按照节表结构去拷贝出来,下面就是演示按节表结构拷贝

[*]起首用winhex打开必要dump的历程
[*]把PE头拷贝出来
[*]按照节表结构剖析数据,拷贝出来
从内存S3处开始,拷贝S2大小的数据,到文件S1处
typedef struct _IMAGE_SECTION_HEADER {...
  DWORD VirtualAddress;         // S3:内存地址:基于模块基址,与SectionAlignment对齐(0x1000)
  DWORD SizeOfRawData;          // S2:文件大小,与FileAlignment对齐(0x200)
  DWORD PointerToRawData;       // S1:文件偏移,与FileAlignment对齐(0x200)
  ...
 }
https://i-blog.csdnimg.cn/img_convert/50002b743cdd7fd53043c1b28cf0b9fa.jpeg

https://i-blog.csdnimg.cn/img_convert/6f0a9b6ab983cd26f09bddfb942fdb49.jpeg

https://i-blog.csdnimg.cn/img_convert/5b13a0baea08aa97298a188f47234e94.jpeg
拷贝节数据

https://i-blog.csdnimg.cn/img_convert/e7b18112d7747f19400b6b64f0a8cf21.jpeg

https://i-blog.csdnimg.cn/img_convert/774f4afe30802683d1a661a2d1a7b811.jpeg

https://i-blog.csdnimg.cn/img_convert/8144727032d74e7a5946042f7c73b3e5.jpeg

https://i-blog.csdnimg.cn/img_convert/a193535469d49cc8303f38097e7ba4cd.jpeg

https://i-blog.csdnimg.cn/img_convert/788943c91a6c248e4ebe6ab0556585b7.jpeg

https://i-blog.csdnimg.cn/img_convert/df0efab723145878297efe1001426fcd.jpeg

https://i-blog.csdnimg.cn/img_convert/a9cc17362e247c0a1e88077c5630779e.jpeg

https://i-blog.csdnimg.cn/img_convert/1ca050c79fccf0aef8670b09e87aedb3.jpeg
至此数据拷贝完了,包数据保存去运行,发现功能正常,以是拷贝是乐成的
插件Dump

一般的调试工具或者PE工具 例如x64,OD本身有dump的的功能和插件
OD


https://i-blog.csdnimg.cn/img_convert/50ee00006ab87a1c514589a08fa2ab6f.jpeg

https://i-blog.csdnimg.cn/img_convert/4edea70bb3f999987a28f466557decaa.jpeg
X64dbug


https://i-blog.csdnimg.cn/img_convert/f8c2716909afa40fcd0af38fb366b061.jpeg

https://i-blog.csdnimg.cn/img_convert/374ff1cbbff864fc77be40ff4158be90.jpeg
Dump机遇不对原理:


[*]原因:dump的机遇不对。程序运行中,此时全局变量中的值必要做修改,不为NULL,跳过了程序的空指针检查,导致指针访问非常。
如果程序运行起来以后,全局变量内里已经有值了,此时dump,则会将全局变量的值也dump到新文件。当dump后的文件运行时,内里有值,就越过了空检查,然而此时的的值是错误的,导致了内存访问非常。
Dump有值的原因
LPBYTE g_p = NULL
if g_p != NULL
{
    g_p = new BYTE;
}

//使用 因此 dump最好的时间就是代码还没执行的时间,即在程序的入口点,以是要找oep,可以用调试器把程序在入口点挂起,再去dump


反内存Dump

依据Dump原理

根据dump原理,删除或者改变PE头中用到的关键信息,或者粉碎PE信息,使得dump到的新文件,windwos不支持。
好比:


[*]修改节的内存地址,欺骗攻击者或者工具,使得dump到错误的数据
[*]修改PE中的关键数据,使得即使dump到正确的代码,也不能正确执行,好比PE镜像巨细(和计算出的巨细不一致,OS就有可能不承认)
[*]加载PE后抹除导入表数据。
对抗方法

直接从PE文件中Dump获取数据。
导入表对抗:
加壳软件分次解密:


[*]对抗方法:分层dump
节表注入

代码注入的一种,将代码添加到现有节数据中,或则是新增一个节当中,然后修改OEP指向新增的代码处,OEP执行完成后重新跳转到Old OEP处。
利用节清闲


[*]添加节区数据
[*]节表添加一项 , 节表个数 NumberOfSections + 1
[*]修改 SizeOfImage 巨细 ,原巨细加上节区数据对齐后的巨细
将自定义机器码直接写入PE文件内的空闲位置处。


[*]缺陷:节之间的巨细,可能不够利用。且仅限用于手动做,写代码做就很麻烦。对 00 00 00 00 是否有用不好掌控。
[*]应用举例:CHI病毒。写PE.exe ->运行程序执行流程 -> jmp 到原来 OEP
注入流程:


[*]寻找节与节之间的清闲,许多 00 00 00 00 处,手动构造机器码,注意绝对地址的利用。

https://i-blog.csdnimg.cn/img_convert/accc83e595049a81181226376cf96348.jpeg

[*]修改OEP
[*]执行自己的流程
[*]执行完流程jmp到原来的OEP
操纵演示

把winmine 加入到我们的 PE 程序中

[*]起首在 winhex 中 打开2个 可执行文件

https://i-blog.csdnimg.cn/img_convert/99f7907092945c6fe3e83340197f89dc.jpeg

[*]把winmin的所有数据拷到PE.exe 最后面

https://i-blog.csdnimg.cn/img_convert/922bd6b8b932e1ccff36ae029fa2a2d4.jpeg

https://i-blog.csdnimg.cn/img_convert/567c3b6589572afc4048b79a33da6366.jpeg

https://i-blog.csdnimg.cn/img_convert/8dc2edfa07e0c8fbbf75e3e42bd1ae6d.jpeg

[*]增加一个节

https://i-blog.csdnimg.cn/img_convert/4f3de544954b4fc70b9d0e323f6fb6d4.jpeg

[*]修改内存总巨细和节数量

https://i-blog.csdnimg.cn/img_convert/6249b77ce7d85fa772ed45cd504fcaad.jpeg
用OD打开程序,可以看到扫雷数据乐成写入了我们程序中

https://i-blog.csdnimg.cn/img_convert/77b69485cd3fa10940dd7dfb1fdc3f6c.jpeg
注意:像这种节表后面有数据的是没有办法利用添加节的

https://i-blog.csdnimg.cn/img_convert/36f653985d599c1a64de531ed3a48f49.jpeg
新增一个节



[*]新增一个节,将数据放到最后。
[*]长处:数据有多大,就放多大。
[*]缺陷:对于有的程序,当节表后面没有清闲,即有附加数据,直接跟了数据的程序不实用
[*]影响的字段:

[*]IMAGE_FILE_HEADER
[*]NumberOfSections 节的个数
[*]IMAGE_OPTIONAL_HEADER
   

[*]OEP
[*]SizeOfImage:在内存中所占内存的巨细
[*]SIzeOfHeaders:PE文件格式总巨细。如果节表够多,一般不小于400h
   
步骤:

[*]IMAGE_FILE_HEADER 中的NumberOfSections 增加1
[*]节表中增加一项
[*]PE中添加节数据,数据必须跟文件对齐值对齐。
[*]修改IMAGE_OPTIONAL_HEADER 中的SizeOfImage 和 AddressOfEntryPoint
[*]增加节,很明显,我们起主要该的是节的个数,并将新的节的属性增加到IMAGE_SECTION_HEADER的后面
[*]这里会碰到一个问题,通过修改,PE的头部巨细可能不支持我们增加一个节,这时必要我们先插入一个文件对齐值巨细的控件,再将节数据写入文件
[*]这时就会增加文件头部巨细,我们必要对PE的数据举行修正,包罗头部巨细以及所有节的文件地址,所有节的文件地址+文件对齐值

[*]增加节的内容,即注入代码,必要注意的是,增加的文件内容也是必要文件对齐的,不足补0
[*]修改镜像巨细,由于这里我们是新加的节,OS在映射到内存时,必然会从一个新的内存页开始,以是镜像巨细必然要变大
[*]要使注入的代码能够运行,就要修改entry point
不实用以下环境:节表和节数据之间没有清闲

https://i-blog.csdnimg.cn/img_convert/b04a85601641e3f4e34ffc43a019d718.jpeg
扩展最后一个节

思绪是直接将注入的代码当作最后一个节的内容,必要修改的地方起首能想到的就是节数组中最后一个节的文件巨细,以及内存巨细。
比较秘密的坑,由于原PE文件,节的巨细是按照文件对齐值来设置的,如今新增了数据,新增的数据要以文件对齐值的巨细为单元。如新增的数据凌驾内存对齐值,我们就要相应的修改PE镜像巨细。
缺陷:这种方式最方便,但是修改的代码很大,稳固性很差。必须是最后一个,前面不可以
步骤:


[*]添加节数据
[*]修改节表最后一项,拓展文件巨细和内存巨细 IMAGE_OPTIONAL_HEADER 中 的SizeOfImage 和 AddressOfEntryPoint
[*]修改 SizeOfImage
操纵演示

把winmine 加入到我们的 PE 程序中

[*]起首在 winhex 中 打开2个 可执行文件

https://i-blog.csdnimg.cn/img_convert/8def35555b83a1e848a2f69fbe400c8d.jpeg

https://i-blog.csdnimg.cn/img_convert/a0493be535296abf81a20fa90ba22605.jpeg

[*]把winmine数据拷贝到 pe.exe

https://i-blog.csdnimg.cn/img_convert/0b73edde6915abad95f2bf8453b035fe.jpeg

https://i-blog.csdnimg.cn/img_convert/9a96c167bb1473ba7dee8237362b6f24.jpeg

[*]修改节表最后一项

https://i-blog.csdnimg.cn/img_convert/1d3464987b4f68b990d8a37eb4a40df4.jpeg

[*]修改 SizeOfImage

https://i-blog.csdnimg.cn/img_convert/c06d35de8f4e414484ea1dec5a9fda7b.jpeg
在通过OD去看,发现winmain数据已经 写入 PE

https://i-blog.csdnimg.cn/img_convert/d73d496207075698899a10325fd56817.jpeg
注意

https://i-blog.csdnimg.cn/img_convert/34e0fafadce77a9488fc1b16fe973389.jpeg

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: WindowsPE文件格式入门03.节表