朱朱你堕落了 发表于 2023-12-7 11:16

程序在内存中到底是如何分布的?

本帖最后由 朱朱你堕落了 于 2023-12-7 11:24 编辑

如这个程序Test.zp.exe(加了ZProtect v1.6壳),在OD中运行起来后查看内存分布情况,它(只说EXE模块)在内存中是从哪里到哪里?
00400000到01170000吗?还是00400000到00DB0000?又或是00400000到xxx?
https://im.gurl.eu.org/file/6754a1d13c0a4516faac2.png
00400000这个好说,基址是00400000,EXE被映射到这个位置上。
如果是它是未加壳的,应该到.rsrc就结束了,现在加过壳了,rsrc下面的这些个区段是干啥的,
从哪里来的?

出现rsrc下面的这些个区段根本原因在于什么?程序使用了VirtualAlloc申请了内存?

但是我HOOK了VirtualAlloc后,打印出来的信息和上图OD中内存信息貌似对应不上啊。

彻底晕了。求助大佬,希望能能说清楚。
程序:
https://cowtransfer.com/s/ceaf6e6f1d194f

iaoedsz2018 发表于 2023-12-7 11:16

有Test.zp的就是从文件直接映射进来的,然后后面的一堆没标志的,一部分跟你hook得到的地址是对的上的,还有一部分可能是程序初始化的,比如堆/栈,还有就是可能由于你hook时机的问题,导致人家的virtualalloc在你hook之前,还有系统启动线程时给你分配的一些内存,还有就是每个内存块的起始地址是有对齐的

xieemengxin 发表于 2023-12-7 11:31

本帖最后由 xieemengxin 于 2023-12-7 11:39 编辑

来自CHATGPT
在rsrc区段之后的更高地址用来存储其他可选的区段和数据。这些区段和数据包括但不限于以下内容:

Import Address Table (IAT): 用于存储程序依赖的外部函数和库的引用地址。
Export Address Table (EAT): 用于存储程序导出的函数和库的地址。
Thread Local Storage (TLS) 数据: 用于存储线程本地存储的数据。
Exception Handling Data: 用于存储异常处理相关的数据。
Debugging Symbols: 用于存储调试符号信息,以支持调试器的调试功能。
Relocation Data: 用于存储可执行文件在内存中的重定位信息,以支持地址无关性。
这些区段和数据的具体位置和大小取决于程序的特定需求和编译设置。在内存中以这种结构存在,可以使操作系统正确加载和执行程序,并提供所需的功能和资源。

按照学单片机时候内存管理那里说,后边儿应该还会有堆区 和 堆栈区的地址。

yes2 发表于 2023-12-7 11:35

一般来说,后面有Test.zp字样的是磁盘文件映射到内存之后的区段列表,当然中间会经过对齐、修复重定位还有代码解密之类的。
再往下那些后面没有字样的,应该是堆和栈。就是你new出来的内存以及线程栈,都在内存视图中能看到

woflant 发表于 2023-12-7 12:15

od里第一列是起始地址,第二列是内存段区间大小

后面第五列中Image标识镜像,一般是主程序和加载的模块

rsrc区段后面的一般是堆和栈,new和alloc申请的内存在堆区间

lhp0906 发表于 2023-12-7 12:44

参观学习

CQGaxm 发表于 2023-12-7 15:52

学习学习,涨涨见识
页: [1]
查看完整版本: 程序在内存中到底是如何分布的?