摘要:好久之前专门分析过这个问题出现的原因,但是又忘了。。。这次记录一下,有的时候稍微记录一下真的能省好多事.....
ps:以下问题在 吾爱破解专用OllyDbg 中会出现,在原版的OllyICE中不会出现,我也不知道为啥。
在OD里面修改汇编代码然后保存到exe文件的时候 有时会出现"在可执行文件中无法定位数据"的错误。这里记录一下为啥会出现这个问题?
如下图:
在0x0042FDFE处修改汇编代码不会出现错误,在0x0042FE00处修改汇编代码会出现错误。我猜测当OD将修改的汇编代码写入可执行的文件的时候逻辑是这样的:先检测当前节属于哪个节表,然后计算节在文件中的物理地址范围,然后把物理地址换算到对应的内存地址。然后将修改的汇编代码的内存地址和这个内存地址比较,在这个范围内就表示可以写入可执行文件,不在范围内就提示“在可执行文件中无法定位数据”。
当前节为code,最大的物理地址范围为 0x400(ROffest) - 0x2F200(Rsize),对应的内存地址为 0x00401000(VOffest + VSize + 0x00400000) - 0x0042FE00(RSize + Voffest + 0x00400000)【大于等于0x00401000,小于 0x0042FE00 】,此时code节对应最大的内存地址为0x0042FDFF。这个时候在0x0042FE00 内存地址处修改汇编代码,就会找不到内存中的0x0042FE00对应可执行文件中的哪个地方,就会提示“在可执行文件中无法定位数据”。
而且我理解的 code 节的内存地址应该为 0x00401000(Voffest + Vsize ) - 0x0042FDE0(Voffest + VSize + 0x00400000),0x0042FDFE 显然超过了这个范围,应该不属于code 节,但是为什么受 code节的 物理地址的约束?应该是OD的一个bug吧。
实验程序: