为什么内存修改软件对于 3D 游戏几乎都失效了? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhuang
V2EX    问与答

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

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

    自问自答,抛砖引玉。

    所谓内存修改软件,指的是类似于『金山游侠』或者更早的 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     Solana     3326 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:00 PVG 20:00 LAX 05:00 JFK 08:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86