首页
社区
课程
招聘
[旧帖] 关于PE扩充现有节大小的问题 0.00雪花
发表于: 2013-6-7 23:37 6749

[旧帖] 关于PE扩充现有节大小的问题 0.00雪花

2013-6-7 23:37
6749
各位同学,是这样的,我想扩充PE中某个段的大小(不是最后一个段),我都需要修改哪里呢,,,我修改了段的物理大小内存大小,以及它后面段(只有资源段)的相应起始地址做了后延,而且还修改了imagebase的大小,,,这时,此PE已经无法正确加载了,,,,请问,我的方法是不是有问题,,,还有哪些地方需要修改呢,,,,谢谢各位!!

       另外,我想问,,PE中的各个节是怎么形成的,,我想学习这方面的东西,应该看哪方面的书呢,编译原理吗

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有兄弟知道吗,提点一下啊,谢谢,哈哈
2013-6-8 07:50
0
雪    币: 1042
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
扩充某个段貌似要注意 文件对齐和内存对齐。
2013-6-8 09:13
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是的,文件200,内存1000
2013-6-8 09:20
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
全局函数和全局地址及地址的引用需要重定位
2013-6-8 09:23
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是这样的,我测试的时候,所有只是扩充了数据段,数据段后面只有一个资源段的,按说,资源段有无无所谓的对于纸牌游戏来说,可是我改完之后,根本运行不起来,正常的话,,应该是可以弹出纸牌界面的,之后没有牌没有按钮等资源系列。
2013-6-8 10:47
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
貌似资源区段的RVA偏移 FOA偏移 PE镜像的大小都得修改吧
2013-6-8 12:24
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主想学原理,看pe结构吧。

我一般用现成的工具
2013-6-10 13:26
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
各位同学,我把自己弄的方法说一下,各位帮我看一下,到底是哪里出的问题,实验程序:windows的纸牌freecell.exe。修改目的:增加2F08个自己的机器码到text节里面。
以下是正常的原freecell.exe的节属性
01 .tex   
    VirtSize:            0000517A   VirtAddr:         00001000
    raw data offs:   00000400    raw data size: 00005200    relocation offs: 00000000    relocations:     00000000
    line # offs:       00000000    line #`s:         00000000
    characteristics: 60000020
     CODE    MEM_EXECUTE    MEM_READ  

  02 .dat   
    VirtSize:            0000138C   VirtAddr:         00007000    raw data offs:   00005600    raw data size: 00000200
    relocation offs: 00000000    relocations:     00000000
    line # offs:       00000000    line #`s:         00000000
    characteristics: C0000040
     INITIALIZED_DATA    MEM_READ    MEM_WRITE  

  03 .rsr   
    VirtSize:            00007F10   VirtAddr:         00009000    raw data offs:   00005800    raw data size: 00008000
    relocation offs: 00000000    relocations:     00000000
    line # offs:       00000000    line #`s:         00000000
    characteristics: 40000040
     INITIALIZED_DATA    MEM_READ  

其中,红色是需要修改的地方,
具体做了如下修改:
517A->8F08
5200->8200
7000->A000
5600->8600
9000->C000
5800->8800

另外PE头中sizeofimage也做了相应修改。11000->14000

这些修改完之后,程序无法运行,弹出对话框,仅完成了部分的ReadProcessMemory。
还有哪些地方需要修改吗,,
是不是我的方法不对啊,因为dat段是关乎程序全局变量的部分,还需要修改代码段中涉及此部分的代码的偏移?
2013-6-16 15:15
0
雪    币: 883
活跃值: (314)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
1. 修改映像大小;
2. 修改目标节的文件大小,以及内存映射大小;
3. 修复此节后面所有节的文件、内存位置描述信息;
4. 修复此节及后面所有节中需要重定位的数据(注意扩充后、扩充前的地址计算);
5. 修复指向此节及后面所有节的重定位数据(注意扩充后、扩充前的地址计算);
6. 修复重定位表中描述此节及后面所有节的重定位表信息。

不一定全面,具体情况你还要多调试,其实调一调就都出来了(报PE文件非法属于低级错误,都很好解决)。
2013-6-16 15:30
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我上面所做的工作包括兄弟所说的第一、二、三步,具体的计算方法我不知道是不是有错误。

至于第四、五、六步中,试验程序中 本身没有重定位表,需要我手动添加,做好dat节内的对应关系吗?

而且我试验了,dat节中的数据本身全是0,只是需要有写权限就行。
2013-6-16 15:40
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
呵呵,谢谢兄弟指路,我现在不知道怎么调试,,,我用OD根本加载不了,用win32dasm可以 ,,就是不知道怎么调试。。。。看不出问题在哪啊
2013-6-16 16:01
0
雪    币: 75
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
你修改的节不是最后一个节,那被修改节后面的所有节,都要向后移动
节向后移动的步骤:
1. 根据你修改节的结头信息,修改要移动节的节头中的信息描述
2. 根据修改后的节头的信息描述,把节身向后移动
ps: 最好从最后一个节开始移动,避免丢失数据,还有如果是exe文件的话,可以不用管重定位表,希望对lz有用。
2013-6-23 17:50
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
14
1.既然数据增加的不是最后一个PE节,那映像大小就不用修改;
2.需要修改对应节头的 文件数据大小 成员;
3.有个关键:后面各个节数据需要后移,节头表对应的节文件对应的偏移量也需要修改;
4.你增加后的节数据大小不能大于原来节数据在内存映像的大小,否则将被判定不是有效的Win32程序
5.如果有安全数据目录项,就要修改文件偏移,但是我认为应该去掉安全数据(就是数据目录索引4)
6.你增加的数据最好选择文件对齐粒度开始处写入数据,否则容易破坏原来数据,不易通用。
以上是我临时想到的几个问题,不知是否哪些不足之处。
2013-6-23 18:10
0
游客
登录 | 注册 方可回帖
返回
//