首页
社区
课程
招聘
[求助]增加DLL重定位项的问题,有图有真相
发表于: 2012-4-1 00:09 6997

[求助]增加DLL重定位项的问题,有图有真相

2012-4-1 00:09
6997
最近学习PE 重定位的过程中,给一个DLL增加了一些功能.
由于一些方面的考虑,把增加的代码写在了.data区段了,并设置了可读可写可执行.
增加的功能对原代码打了补丁,打补丁的地方是一个 FF 15 XXXX的引入函数调用.
这里涉及到了重定位的问题,所以就在重定位表中手工新增加了一项重定位在末尾.
结果OD不能加载.用LordPE查看,重定位的RVA指向了.rsrc节.
是不是系统在加载PE文件的时候,指向代码段和数据段以外的重定位信息不能进行修正了???

求教于啊!!!!!



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
我觉得问题是在你.data节末尾增加了的重定位超出了.data段,
虽然数据进到了.rsrc段,但是PE中规定有节对齐,默认是对齐粒度是0x1000,
超出的部分.data段必须增长0x1000来对齐,否则就出问题了
2012-4-1 00:51
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
PE文件默认节对齐粒度0x200,映射节对齐粒度是0x1000
2012-4-1 00:53
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

谢谢指点!

我想,应该不是你说的对齐问题.为了验证你这个说法,我特意把代码写到rsrc节点末尾空隙处.
然后依然手工添加了重定位项.这次添加RVA也确实指向了rsrc段,并未超出. 之前忘记说了,
即使是超出了范围加载也是正常的,只是重定位项并未起作用,系统并没有对它进行修正。
这里的问题是,之所以加载不了,是因为增加新的重定位项后,修正了下DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size 这个成员的大小.
只要改了这个大小,加载就不成功。如果不改,加载是没有问题的。

现在的问题是想知道为啥,增加的重定位没有起到作用???
2012-4-1 01:48
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
写错了吧,用od,配置选项第一次停在系统模块入口,下内存访问断电调试,试试
2012-4-1 01:58
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
确实写错了。每个块的大小定义必须是4的整数倍对齐.
系统遍历重定位表的时候原来是:

while ( [IMAGE_DIRECTORY_ENTRY_BASERELOC].Size -=pIBR->SizeOfBlock  )
  .........

理论上跟在什么节是没有啥关系,在遍历过程中都会进行fix。

一语惊醒梦中人,感谢!
2012-4-1 03:56
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=xnop;1059483]确实写错了。每个块的大小定义必须是4的整数倍对齐.
系统遍历重定位表的时候原来是:

while ( [IMAGE_DIRECTORY_ENTRY_BASERELOC].Size -=pIBR->SizeOfBlock  )
  .........

理论上跟在什么节是没有啥关系,在遍历...[/QUOTE]

手动修改导致的问题,一般都是这原因, 比如你PE头位移时也是可能会遇到4对齐的问题,
这时你可以用lordpe直接修复即可对齐了
2012-4-1 13:43
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
对齐问题,还有映像大小的问题
2012-4-2 10:21
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这里的问题,不涉及映象大小问题.只是对齐的问题。

" 为了确定区块中的「基底重定位资料项」的个数,先把此值减去IMAGE_BASE_RELOCATION
结构大小(8 个字节),再除以 2 (WORD 大小)。如果此字段为 44 ,就表示有 18 个
"

记住这个就好了,不足之处补sizeof(WORD)即可.sizeof(word)的倍数,之前说错了,不是4的倍数

问题已经圆满的解决,再次感谢各位的热心!
2012-4-2 15:38
0
游客
登录 | 注册 方可回帖
返回
//