手动增加pe节并修改oep

一直想学学怎么动动pe文件,学习了几篇文章尤其是寒晨的文章后,自己动手也尝试了一下加节和修改oep,写出来供和我一样菜的一起进步。

一、       增加pe节需要的操作

1.    确定内存中的节的对齐粒度和文件中的节的对齐粒度,分别是pe+0038h 和3ch
 
也就是说 内存和文件的对齐粒度都是1000h.
2.    在文件末尾增加数据。
因为文件对齐的粒度是1000h,那么我们在文件末尾增加2000h个数据。
 
3.    在节表末尾增加新的节信息
 
在最后一个节信息后面增加一个.peng的节
2E 70 65 6E 67 00 00 00  --------.peng的ASCII码。
00 18 00 00 --------- VirtualSize实际大小(随便写的)。
00 B0 00 00 --------- VirtualAddress dd  节区的RVA地址(因为.data节的RVA地址是7000,大小是3E24,加起来是AE24,为了对齐,所以是B000,表示成为00B00000。
00 20 00 00----- SizeOfRawData在文件中对齐后的尺寸(末尾加了2000h个字节,都算上了)
00 A0 00 00 ---- PointerToRawData在文件中的偏移物理文件地址,刚才加的地址是A000,所以直接写成00 A0 00 00。这里为什么不是上边的00 B0 00 00 呢?开始我也想当然的这么写了,但是程序总是不对。后来想明白了,因为我们增加的2000h个字节,是从A000开始加的,并不是B000,如果非要写成B000,那么还要再末尾加1000h个字节才行呢,否则就凑不齐SizeOfRawData 中写的这个节有2000个数据了。
之后
00000000 PointerToRelocations
00000000 PointerToLinenumbers
0000 NumberOfRelocations dw 
0000 NumberOfLinenumbers dw
20 00 00 60 Characteristics 节的属性 可读取,可执行 ,代码。
4.在pe+6出修改节数目。
 
原来是03 00,改成04 00。
5.在pe+50处 修改内存映像大小。
 
原来是00 B0 00 00 改成00 D0 00 00,原来的映像为什么是B000大小呢?注意下面图中,.data是原来最后一个节,RVA地址是7000,大小是3E24,总和是AE24,按照对齐原则,总大小是B000.
 
所以,新的内存映像大小应该是,B000+1800=C800 对齐后是D000.
6.测试
用lordpe 加载看到,.peng 区段正确显示,运行程序也正常。
 
二、       修改OEP

1、OEP在pe+28处,查看并修改。
 
原OEP在1203处,记下该地址,并修改成B000(注意不是A000,oep是RVA, 开始我搞错了,程序崩溃),
 
2.打开OD
 

会停留在新的oep处,修改成jmp 00401203,然后保存.
3.测试
正常运行!
OK!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值