我们有一个post build步骤,它修改(补丁)可执行文件中的某些位置。修补过程使用CreateProcess
将进程加载到内存中,并使用ReadProcessMemory
读取其代码段内存。然后在存储器中搜索序列0x8D, 0x05, XX, XX, XX, XX, MAGIC
,并在相应的偏移量上修改文件以包含不同的代码。计算文件中的偏移量作为进程存储空间中指令的地址减去exe的首选加载地址。 exe标记为/ BASE:“0x400000”/ DYNAMICBASE:NO / FIXED(无地址随机化,无重定位)。
使用VS 2005生成的可执行文件可以正常工作,但是当使用VS 2010构建exe时它会失败。找到内存中的序列,但相应偏移量的文件内容不匹配。搜索二进制文件时,可以在文件中找到相应的代码0xc00。
比较命令行时,我可以看到VS 2005使用的/OPT:WIN98缺少VS 2010,而且似乎是not to be supported by the linker any more。
现在我的问题是:
答案 0 :(得分:3)
似乎用/ OPT产生的exe:WIN98有一个稍大的标题(对齐到4 KB)。如果未指定此标志,则代码仍然从0x401000加载,但标头仅为0x400而不是0x1000,导致图像偏移量为0xc00。