文章目录
- Intro
- Virtual memory
- Example!
- Static example
Intro
在上个视频中,我们知道有些地址在你重进游戏时就会无效,有的有时有效,我们需要了解称为虚拟内存的东西
记住这些信息:当你双击打开 Squally.exe 游戏时,系统会复制一份并放到内存中!
当程序运行时,首先给一组虚拟内存,此时系统内存的分配是:
- 0~2GB 之间某个地方作为开始,存放 copied exe
- 2~8GB 从某个位置开始到结束都是系统使用 memory reserved for system use
那么 copied exe 到系统占用的开始部分,都是空余内存 free momory
一般来说,当系统是 32-bit 或者打开的是 32-bit program 时,游戏可以使用大约 2GB 的内存,而 64位 比这大得多,我们先关注 32位 的游戏,当游戏运行时,我们拥有了复制的 exe 文件,并且有大量的 free memory
在 copied exe 中,我们有两部分:
- Data
- Code
重要的是 Code 可以创建新的数据 new Data,当 Squally.exe 启动后,他可能会加载用户界面,加载世界,世界又会加载玩家,怪物,这是一整棵树,涉及的数据和类型非常多。需要注意的是,所有这些对象都只是数据,除了 exe 之外!
Virtual memory
那么在这个程序申请的 2GB 内存中,除了 copied exe,还有许多 allocated objects,上面初始化的用户界面,数据,玩家,怪物都是 allocated object,当回到主菜单时他们就会被 Delete 或者 Dispose,初始化这些数据的时候位置几乎是随机的,所以我们重新打开游戏他们很有可能就会转移到其他的位置
几乎所有事情都是动态的,除了 copied exe 中的数据!
Example!
上面的内容是抽象难以理解的,接下来我们将给出一个例子,把 Squally.exe 游戏拖到 HxD 中,这里我找了一个其他的软件,但大体一致,我们会发现里面还是有很多可以读懂的东西,我们理论上可以在 CE 中读取到这些相同的信息!
使用 CE 附加到打开的 exe,然后点击 Memory view 进入内存视图
CE 有一个很酷的技巧,可以右键然后点击 Goto Address,然后输入你的软件名,比如这里是 PvZ_Toolkit_v1.20.3.exe,他就会帮你找到这个 copied exe 所加载在的地址
此时你也会发现,这里的数据和 HxD 中所见到的数据几乎是完全一样的!
Static example
现在你了解了从磁盘复制到虚拟内存的清晰实例,现在让我们做一些有趣的事情
程序员可以将某些信息标记为静态,比如玩家的血量和生命值,通常作为程序员新手都会把生命值之类的信息作为静态存储,举个例子,User Interface 需要访问玩家血量,此时如果玩家是动态创建的,往往通信难度就提高了,所以很多程序员都会用静态的方法来做
然而,怪物的生命值是几乎不能用静态属性来做的,下一节我们将会介绍指针来解决非静态的内容