首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么区段虚拟地址需要连续?

为什么区段虚拟地址需要连续?
EN

Stack Overflow用户
提问于 2015-09-03 14:11:16
回答 1查看 380关注 0票数 1

我目前正在做一些工作,要求我从PE格式的可执行文件中删除该部分。首先,我刚刚删除了标头,更改了标头中的NumberOfSections字段,在标头中重新计算了SizeOfImage/SizeOfHeader,并以删除部分的原始大小移动了以下部分的原始地址。但是,Windows拒绝加载错误消息"XXX不是有效的Win32应用程序“的文件。我已经挣扎了一段时间,但也试图移动以下部分的虚拟地址的虚拟大小被删除的部分,一切正常工作。

什么原因,虚拟地址需要是连续的,不能有任何差距?我试着阅读官方的体育文献,但没有成功。我一直认为,只要SizeOfImage有正确的值,那么各个节的地址就无关紧要了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 21:45:12

大多数应用程序不需要在各个部分之间有很大的差距--那些应用程序可以使用单独的DLL或通过VirtualAlloc动态分配内存。

更新:经过更多的测试后,我发现各部分之间的差距必须是对齐下一节以满足SectionAlignment所必需的。因此,间隔两个4096字节节0x20000字节需要将整个exe的SectionAlignment字段设置为0x20000。(例如,0x12000的间距是不可能的。)这个128 to间隙不会出现在进程的内存映射中,也不会消耗任何内存,但是如果您试图在ERROR_INVALID_ADDRESS中分配内存,那么ERROR_INVALID_ADDRESS仍然会失败。

下面是GCC/MinGW的一个最小测试用例,它演示了 Win32 exe中的部分必须是连续的

测试。S:

代码语言:javascript
复制
.global _main
.section .text
_main:
    push $1
    call _Sleep@4
    xor %eax, %eax
    ret

.section .bss
    .lcomm buf, NUMBYTES

这将产生一个有效的可执行文件:

gcc -m32 -Wl,--image-base=0x00400000 -Wl,-Ttext=0x00401000 -Wl,-Tbss=0x00402000 -DNUMBYTES=0xfe000 -Wl,--section-start=.idata=0x00500000 -s -nostartfiles -o contiguous.exe testcase.S

这会产生无效的可执行文件(gap.exe不是有效的Win32应用程序):

gcc -m32 -Wl,--image-base=0x00400000 -Wl,-Ttext=0x00401000 -Wl,-Tbss=0x00402000 -DNUMBYTES=0x200 -Wl,--section-start=.idata=0x00500000 -s -nostartfiles -o gap.exe testcase.S

与十六进制编辑器和objdump相比,这两个文件之间只有16字节的差异。改变的是:

  1. 时间戳(4字节变化)。
  2. 校验和(4字节变化)。
  3. .bss部分的大小(8字节更改)。在contiguous.exe中,.bss部分是0xfe000字节,而在gap.exe中,.bss部分是0x200字节,在它和.idata部分之间产生了一个大小为0xfc 000字节的空白。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32378033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档