能力值:
( LV12,RANK:300 )
|
-
-
2 楼
假设修改前是这样:
.text VOffset 00001000 VSize 00001000
.data VOffset 00002000 VSize 00001000
.rsrc
.reloc
……
好了,现在你把.text的VSize改大了1000,变成了00002000
结果,装载PE文件时,.text段装入到偏移00001000-00002FFF处(尽管多出来的1000部分是空白的)
那.data段装到哪?还能装到00002000的位置吗?!那不就出错了。
因此,前一段的VOffset+VSize,肯定不能大于后一个段的VOffset
好了,现在你又想:那就把后面所有段的VOffset都往后调1000,这下该OK了吧?
错,这样问题就大了:
1. 假设.text段是可执行代码,.data段是数据,那么,在程序运行过程中,要对.data段的数据进行读写,这时,.data段的位置变了,但是程序代码却没有改,结果:读写错了。
2. 再进一步假设,.rsrc段是资源的话,资源表和所有资源保存在这里,包括图标资源。那么,改了它的VOffset,却没有改PE文件头里的资源表指针,结果:资源表找不到了,于是“连图标也没了”。
3. 再进一步假设,.reloc段里保存重定位表,但是同样的,改了它的VOffset,但是PE文件头里的基址重定位表指针也没改,结果:找不到重定位表……
因此,对最后一个段以外的区段来说,随意改动其虚拟大小,会导致一系列问题,绝不是改了IMAGE_SECTION_HEADERS结构里的相关量,就能让程序正常运行的。
光是上面第一点,就难以解决了(除非你对程序代码patch),而后面的2、3点等,则更会真真切切地导致PE装载器装载错误(输入表,输出表,资源表,基址重定位表……这些结构的位置都可能随之改变,你要在PE文件头里做多少修改……),不得不提示“不是有效的win32文件”。
如果你要对程序做patch,最好找代码段里的空隙,或者在最后加上一个区段来写代码,而不是直接改动TEXT段的虚拟大小。
|
|
|