vs2010和vs2005产生的Exe加载了不同的偏移量

Exe produced with VS 2010 and VS 2005 loaded with a different offset

本文关键字:偏移量 加载 Exe vs2005 vs2010      更新时间:2023-10-16

VS 2005和VS 2010加载进程映像文件不同

我们有一个后构建步骤,修改(补丁)可执行文件中的一些位置。补丁进程使用CreateProcess在内存中加载进程,并使用ReadProcessMemory读取其代码段内存。然后在内存中搜索序列0x8D, 0x05, XX, XX, XX, XX, MAGIC,并在相应的偏移量上修改文件以包含不同的代码。文件中的偏移量计算为进程内存空间中的指令地址减去exe的首选加载地址。exe被标记为/BASE:"0x400000"/DYNAMICBASE:NO/FIXED(无地址随机化,无重定位).

对于vs2005生成的可执行文件可以正常工作,但是当使用vs2010构建exe时就会失败。找到了内存中的序列,但是在相应偏移量处的文件内容不匹配。在搜索二进制文件时,可以在文件的前面0xc00处找到相应的代码。

当比较命令行时,我可以看到VS 2005中使用的/OPT:WIN98在VS 2010中缺失,并且似乎不再被链接器支持。

加载vs2010构建的可执行文件

现在我的问题是:

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

似乎使用/OPT:WIN98产生的exe具有稍大的标头(对齐为4 KB)。当不指定此标志时,代码仍然从0x401000加载,但头只有0x400而不是0x1000,导致图像偏移为0xc00。