使用VS 2010和VS 2005生成的exe加载了不同的偏移量

时间:2011-04-19 11:46:38

标签: c++ visual-studio-2010 winapi executable portable-executable

加载VS 2005和VS 2010之间不同的过程映像文件

我们有一个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

加载VS 2010构建的可执行文件

现在我的问题是:

  • 这个0xc00偏移来自哪里?
  • 或者,如果我的想法是通过将exe文件的内容读入由加载地址定义的内存来加载进程是错误的或过于简单的,是否有一些文档详细说明了如何在内存中加载进程(如果可能包括处理像/ OPT:WIN98或/ SWAPRUN那样的标志?

1 个答案:

答案 0 :(得分:3)

似乎用/ OPT产生的exe:WIN98有一个稍大的标题(对齐到4 KB)。如果未指定此标志,则代码仍然从0x401000加载,但标头仅为0x400而不是0x1000,导致图像偏移量为0xc00。