为什么内存修改软件对于 3D 游戏几乎都失效了?

2014-12-26 08:29:19 +08:00
 zhuang

自问自答,抛砖引玉。

所谓内存修改软件,指的是类似于『金山游侠』或者更早的 fpe 等等。而所谓的 3D 游戏,指的是大概 2005 年之后的大型游戏,或者以同时期的 xbox360/ps3 作为分界线。

内存修改软件的工作原理:
本质上此类软件是一种特化的调试器(debugger),通过中断软件运行获取内存快照,之后对快照做对比判断内存变化。

内存修改软件的失效原因:
1. 硬件更新,操作系统内存模型进步。
2. DRM 防盗版机制的普及。
3. 3D 游戏开发技术演进。

操作系统内存模型的进步:
早期的 16bit 系统就不讨论了。Win9x 的改进是 Kernel/User 空间划分,WinXP 之后过渡到 32/64bit,改进了内存映射机制。Win7 之后的进步主要是内存模型安全方面的,添加依赖 cpu 硬件特性的 DEP 功能,改善虚拟化支持。整个操作系统内存模型的演变体围绕的思路就是,进程隔离、K/U 隔离和执行权限隔离,应用程序崩溃几乎不会影响整体系统的稳定性。
对于内存修改类软件的影响主要是,中断用户态程序进行调试需要通过操作系统的特殊调用,某些如 ASLR 的机制会影响进程的内存数据分布,增加了调试的难度。

DRM 机制对于内存修改软件的影响:
本质上内存修改软件是 debugger,而 debugg 是破解 DRM 的最主要的机制。多数 DRM 对于 debugger 都会有相应的保护措施,甚至是贯穿整个程序运行的指令混淆等等。特别是 2005 之后数字发行逐渐流行,多数游戏都会带有 DRM 机制。

游戏开发模式的转变:
之所以强调 2005 和 xbox360/ps3 这个时间点是因为,支持真 3D 技术的硬件能力终于得到了普及,而 3D 游戏的开发远比 2.5D/2D 游戏复杂,所需要的人力物力资源影响了整个游戏界的开发模式,3D 引擎应运而生。为了提高开发效率,让非程序人员参与到游戏开发中,多数游戏引擎都附带有 scripting 模块。
技术上 scripting 是一种虚拟机,游戏运行的过程中,脚本化的代码会实时编译成二进制代码,插入到游戏主逻辑指令当中。从调试的调度上说,原始的快照比对功能变得毫无价值了,即使能追踪到某些特定内存地址,也多数是某种参考而非游戏逻辑的一部分。

PS 现在的单机游戏修改技术:以 cheat engine 为例
针对 DRM 机制,不使用 windows 自带 debug 机制,采用 veh/seh 作为中断接口。
内置 lua 解释器,在游戏进程中动态修改和执行指令。

5271 次点击
所在节点    问与答
7 条回复
tinyfool
2014-12-26 08:48:01 +08:00
按照你结论,可能更好修改了,因为内置的语言,可能会比内存地址修改更容易hack,无非是目前没有人做而已
zhuang
2014-12-26 09:04:01 +08:00
@tinyfool
这不是『太容易』所以没人做的问题,而是做了没有意义。这样的调试相当于调试一个虚拟机之内跑的程序。『内置的语言』是针对开发者而言的,对于调试者,你根本不知道这个虚拟机的存在。

依赖游戏引擎开发的游戏,主程序甚至可以不处理游戏逻辑。修改的前提是理解游戏逻辑,而现在反编译出来的代码很难读的情况下,修改的难度非常大。

不用说太复杂的 3D 引擎,有个叫 RPG Maker 的软件,就带这样一个脚本引擎,有非常多小品级的游戏都是用这个软件做的,如果有兴趣可以试试看,怎么调试这样带脚本引擎的程序。
Mutoo
2014-12-26 11:48:43 +08:00
@zhuang 我记得 RPG Maker 用的是 ruby 解析器。
oott123
2014-12-26 12:00:34 +08:00
@zhuang 这玩意不是把附带的资源包解开就能想怎么改怎么改了么~
a2z
2014-12-26 12:01:54 +08:00
那是你不会改,脚本语言更好改,魔兽世界就是lua,写外挂挺容易的
zhuang
2014-12-26 12:47:40 +08:00
@Mutoo 感谢提示,我其实不怎么了解 RPG Maker。不过原理都一样,程序逻辑放到 ruby 脚本,而主程序是个 ruby 解释器,通常的逆向和调试都是非常复杂的。

@oott123 很明显这里指的是动态调试。

@a2z 从你的回复里我知道你不明白这篇文章在说什么,毕竟这里谈到的技术本身不属于一般计算机科学的专业课程,也不是流行的技术。另外,魔兽世界的 Lua 是不难,类比一下的话,这里谈论的其实是暴雪之外的人来写供插件用的 Lua 接口。
aaaa007cn
2014-12-26 22:45:10 +08:00
CE 还是一个内存修改器啊
改指令也是一种内存修改
以前的修改器如 FPE、Game Master、金山游侠等这些没有内置反汇编引擎
但是可以通过其他 debugger 拿到指令地址后直接改写对应地址的内存
某些地址需要先改页属性才能写入那是另一码事

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/156774

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX