自问自答,抛砖引玉。
所谓内存修改软件,指的是类似于『金山游侠』或者更早的 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 解释器,在游戏进程中动态修改和执行指令。
1
tinyfool 2014-12-26 08:48:01 +08:00
按照你结论,可能更好修改了,因为内置的语言,可能会比内存地址修改更容易hack,无非是目前没有人做而已
|
2
zhuang OP @tinyfool
这不是『太容易』所以没人做的问题,而是做了没有意义。这样的调试相当于调试一个虚拟机之内跑的程序。『内置的语言』是针对开发者而言的,对于调试者,你根本不知道这个虚拟机的存在。 依赖游戏引擎开发的游戏,主程序甚至可以不处理游戏逻辑。修改的前提是理解游戏逻辑,而现在反编译出来的代码很难读的情况下,修改的难度非常大。 不用说太复杂的 3D 引擎,有个叫 RPG Maker 的软件,就带这样一个脚本引擎,有非常多小品级的游戏都是用这个软件做的,如果有兴趣可以试试看,怎么调试这样带脚本引擎的程序。 |
5
a2z 2014-12-26 12:01:54 +08:00
那是你不会改,脚本语言更好改,魔兽世界就是lua,写外挂挺容易的
|
6
zhuang OP |
7
aaaa007cn 2014-12-26 22:45:10 +08:00
CE 还是一个内存修改器啊
改指令也是一种内存修改 以前的修改器如 FPE、Game Master、金山游侠等这些没有内置反汇编引擎 但是可以通过其他 debugger 拿到指令地址后直接改写对应地址的内存 某些地址需要先改页属性才能写入那是另一码事 |