能力值:
( LV9,RANK:140 )
|
-
-
2 楼
我觉得问题是在你.data节末尾增加了的重定位超出了.data段,
虽然数据进到了.rsrc段,但是PE中规定有节对齐,默认是对齐粒度是0x1000,
超出的部分.data段必须增长0x1000来对齐,否则就出问题了
|
能力值:
( LV9,RANK:140 )
|
-
-
3 楼
PE文件默认节对齐粒度0x200,映射节对齐粒度是0x1000
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢指点!
我想,应该不是你说的对齐问题.为了验证你这个说法,我特意把代码写到 rsrc节点末尾空隙处.
然后依然手工添加了重定位项.这次添加RVA也确实指向了 rsrc段,并未超出. 之前忘记说了,
即使是超出了范围加载也是正常的,只是重定位项并未起作用,系统并没有对它进行修正。
这里的问题是,之所以加载不了,是因为增加新的重定位项后,修正了下DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size 这个成员的大小.
只要改了这个大小,加载就不成功。如果不改,加载是没有问题的。
现在的问题是想知道为啥,增加的重定位没有起到作用???
|
能力值:
( LV5,RANK:70 )
|
-
-
5 楼
写错了吧,用od,配置选项第一次停在系统模块入口,下内存访问断电调试,试试
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
确实写错了。每个块的大小定义必须是4的整数倍对齐.
系统遍历重定位表的时候原来是:
while ( [IMAGE_DIRECTORY_ENTRY_BASERELOC].Size -=pIBR->SizeOfBlock )
.........
理论上跟在什么节是没有啥关系,在遍历过程中都会进行fix。
一语惊醒梦中人,感谢!
|
能力值:
( LV9,RANK:140 )
|
-
-
7 楼
[QUOTE=xnop;1059483] 确实写错了。每个块的大小定义必须是4的整数倍对齐.
系统遍历重定位表的时候原来是:
while ( [IMAGE_DIRECTORY_ENTRY_BASERELOC].Size -=pIBR->SizeOfBlock )
.........
理论上跟在什么节是没有啥关系,在遍历...[/QUOTE]
手动修改导致的问题,一般都是这原因, 比如你PE头位移时也是可能会遇到4对齐的问题,
这时你可以用lordpe直接修复即可对齐了
|
能力值:
( LV3,RANK:30 )
|
-
-
8 楼
对齐问题,还有映像大小的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
这里的问题,不涉及映象大小问题.只是对齐的问题。
" 为了确定区块中的「基底重定位资料项」的个数,先把此值减去IMAGE_BASE_RELOCATION
结构大小(8 个字节),再除以 2 (WORD 大小)。如果此字段为 44 ,就表示有 18 个 "
记住这个就好了,不足之处补sizeof(WORD)即可.sizeof(word)的倍数,之前说错了,不是4的倍数
问题已经圆满的解决,再次感谢各位的热心!
|
|
|