V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhuang
V2EX  ›  问与答

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

  •  3
     
  •   zhuang · 2014-12-26 08:29:19 +08:00 · 5251 次点击
    这是一个创建于 3399 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自问自答,抛砖引玉。

    所谓内存修改软件,指的是类似于『金山游侠』或者更早的 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 条附言  ·  2014-12-26 11:09:48 +08:00
    关于传统修改器和现代修改器的区别:

    传统修改器基本只提供静态内存修改功能,即只支持修改某个地址的值。
    现代修改器(以 cheat engine 为例),提供 Disasemble 功能,可以修改指令。内存修改只是附加功能。
    7 条回复    2014-12-26 22:45:10 +08:00
    tinyfool
        1
    tinyfool  
       2014-12-26 08:48:01 +08:00
    按照你结论,可能更好修改了,因为内置的语言,可能会比内存地址修改更容易hack,无非是目前没有人做而已
    zhuang
        2
    zhuang  
    OP
       2014-12-26 09:04:01 +08:00
    @tinyfool
    这不是『太容易』所以没人做的问题,而是做了没有意义。这样的调试相当于调试一个虚拟机之内跑的程序。『内置的语言』是针对开发者而言的,对于调试者,你根本不知道这个虚拟机的存在。

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

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

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

    @a2z 从你的回复里我知道你不明白这篇文章在说什么,毕竟这里谈到的技术本身不属于一般计算机科学的专业课程,也不是流行的技术。另外,魔兽世界的 Lua 是不难,类比一下的话,这里谈论的其实是暴雪之外的人来写供插件用的 Lua 接口。
    aaaa007cn
        7
    aaaa007cn  
       2014-12-26 22:45:10 +08:00
    CE 还是一个内存修改器啊
    改指令也是一种内存修改
    以前的修改器如 FPE、Game Master、金山游侠等这些没有内置反汇编引擎
    但是可以通过其他 debugger 拿到指令地址后直接改写对应地址的内存
    某些地址需要先改页属性才能写入那是另一码事
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1028 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:30 · PVG 06:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.