vs2010和vs2005产生的Exe加载了不同的偏移量
Exe produced with VS 2010 and VS 2005 loaded with a different offset
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。
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何从内存缓冲区加载张量流图
- 将张量流库加载到C++中
- 如何使用张量流的C++加载检查点和推理?
- 急切地加载整个模型以估计张量流的内存消耗
- LLVM - 从具有偏移量的指针加载变量
- 启用 ASLR 后,图像的所有部分是否每次都以相对于图像基址的相同偏移量加载
- C++ API 中的张量流加载模型并得到"from device: CUDA_ERROR_OUT_OF_MEMORY"错误
- 模拟动态加载程序以修复共享库偏移
- 如何在C/C++中从运行时卸载内存偏移量计算
- 从加载的 DLL 函数中获取文件偏移量
- 核心转储中缺少共享库加载偏移量
- vs2010和vs2005产生的Exe加载了不同的偏移量