鱼C论坛

 找回密码
 立即注册
查看: 2529|回复: 5

关于内存地址的问题

[复制链接]
发表于 2012-9-12 12:08:46 | 显示全部楼层 |阅读模式
10鱼币
每个进程都有4G的独立内存,但是一个网络游戏有11G那么大,那4G怎么装得进11G?
我们用CE找血的指针 里面看到的数据地址是虚拟地址还是物理地址?如果是虚拟地址为什么找血的基址的时候要构造血指针?
关于文件的映射问题,一个程序执行时,每次加载到物理地址一样吗?它是执行的时候加载物理地址还是不执行也存在物理地址?
在破解PE文件时,静态是数据在文件中的物理地址,这个物理地址是?动态是在内存中的数据,这个虚拟地址是?

最佳答案

查看完整内容

第一个问题,你的游戏的exe文件有11G吗? 确定? 反正我是没见过这么大的exe文件。。。 你的游戏不执行的时候是放在硬盘上的,当你双击运行的时候会创建一个进程,把你的exe文件映射到内存。 第二个问题,你用CE看到的只是虚拟地址,看不到物理地址。 第三个,肯定不一样,文件双击运行的时候,加载到内存,最后你关掉的时候,内存释放,这个过程每次加载进去都是要重新为你的文件映像分配内存,而分配到哪里这个是随机 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-12 12:08:47 | 显示全部楼层
第一个问题,你的游戏的exe文件有11G吗?     确定? 反正我是没见过这么大的exe文件。。。
你的游戏不执行的时候是放在硬盘上的,当你双击运行的时候会创建一个进程,把你的exe文件映射到内存。

第二个问题,你用CE看到的只是虚拟地址,看不到物理地址。

第三个,肯定不一样,文件双击运行的时候,加载到内存,最后你关掉的时候,内存释放,这个过程每次加载进去都是要重新为你的文件映像分配内存,而分配到哪里这个是随机的,你当前电脑上正在运行的所有进程都存在在内存中,你这个程序关掉以后,你内存可能很快就被其新建的进程占用,你下次打开以后肯定这篇内存申请不到,所以不一样,当然你问的是物理内存。。。。这个其实更直接,每个进程的Eprocess结构体里面有一项叫做页目录项,也就是cr3寄存器的值,而物理内存跟这个是字节挂钩的,若是第一个打开一个程序跟第二次打开,两次cr3寄存器的值是相等的,那么就说明这两次文件加载的物理地址是相同的,但是就目前我还没见过有一次相同。。。。当然可能性还是有的。。

第四个问题,PE文件没有什么物理地址跟虚拟地址。。。。
一种叫做文件地址,一种叫做内存地址,  FA 和RVA  前者叫文件地址,后者叫相对虚拟地址,
也就是当你的文件没有运行,在磁盘上的时候,数据的地址是 FA , 当你的文件运行的时候被加载进内存的时候  数据的地址都是 RVA,这个也有可能会相同,跟磁盘的内存对齐和内存的内存对齐情况有关系,磁盘内存对齐以前是0x200, 内存是0x1000.所以不一样,但是现在大多编译器生成的PE文件磁盘跟内存对齐都是0x1000了。   前面的 Fa 跟 RVA 都是基于首地址的偏移。。。完了回答问题真累。。。   以后不能这么认真。。。我又不是版主。。。是吧兄弟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-12 18:34:57 | 显示全部楼层

还有两个问题。
第一个问题:EXE是不是调用游戏里的资源,调用到的数据才会在虚拟内存中找到?
第二个问题:我们找游戏血的指针,[[[*****]+**]+**]只要游戏不变他的基址  我们就可以读到这个血。这个指针是不是指向游戏血的地址?如果是的话,那不是和你回答我的第三个问题有矛盾吗?你说物理地址会变,如果变的话,我们怎么还能读得到?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-9-12 22:42:16 | 显示全部楼层
习惯浪荡 发表于 2012-9-12 18:34
还有两个问题。
第一个问题:EXE是不是调用游戏里的资源,调用到的数据才会在虚拟内存中找到?
第二个问 ...

虚拟地址不会变,物理地址在变,物理地址就是直接对应的内存芯片了。而正常exe文件加载到内存都是加载到0x400000这个地址,或者PE文件里面都有ImageBase这个字段用来存放建议装载地址。  上面没说清楚。。。但是物理地址是一直在变的。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-12 23:13:22 | 显示全部楼层
Tzdner_C 发表于 2012-9-12 22:42
虚拟地址不会变,物理地址在变,物理地址就是直接对应的内存芯片了。而正常exe文件加载到内存都是加载到0 ...

你说虚拟地址会变,那我们用CE扫描出来的地址是虚拟地址,但一个游戏的血的地址每次扫出来都不一样。但构造了血的指针的地址就不会变,这个构造出来的血的指针是什么?是物理地址,还是虚拟地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-9-21 08:18:20 | 显示全部楼层
11G,那是整个软件的大小,不是 引擎(主exe)的大小,软件启动,先启动exe主引擎,再脚本、模型、贴图等等。。。大型软件或游戏都是用点模型什么的,就加载一点,不用的马上就KILL掉,。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 05:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表