CS420 课程笔记 P6 - 游戏逆向中的虚拟内存

文章目录

    • 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 中读取到这些相同的信息!

CS420 课程笔记 P6 - 游戏逆向中的虚拟内存_第1张图片
使用 CE 附加到打开的 exe,然后点击 Memory view 进入内存视图

CS420 课程笔记 P6 - 游戏逆向中的虚拟内存_第2张图片
CE 有一个很酷的技巧,可以右键然后点击 Goto Address,然后输入你的软件名,比如这里是 PvZ_Toolkit_v1.20.3.exe,他就会帮你找到这个 copied exe 所加载在的地址

CS420 课程笔记 P6 - 游戏逆向中的虚拟内存_第3张图片
此时你也会发现,这里的数据和 HxD 中所见到的数据几乎是完全一样的!

CS420 课程笔记 P6 - 游戏逆向中的虚拟内存_第4张图片

Static example

现在你了解了从磁盘复制到虚拟内存的清晰实例,现在让我们做一些有趣的事情

程序员可以将某些信息标记为静态,比如玩家的血量和生命值,通常作为程序员新手都会把生命值之类的信息作为静态存储,举个例子,User Interface 需要访问玩家血量,此时如果玩家是动态创建的,往往通信难度就提高了,所以很多程序员都会用静态的方法来做

然而,怪物的生命值是几乎不能用静态属性来做的,下一节我们将会介绍指针来解决非静态的内容

你可能感兴趣的:(逆向工程,笔记,windows)