材鸟 发表于 2020-5-13 21:09

某某打僵尸游戏的DLC解锁

本帖最后由 材鸟 于 2020-5-15 10:34 编辑

前言!!!WARNING:本帖仅限技术讨论,学术研究!!!
本身不太爱来论坛发帖,原因有二;其一,老是因为侵权等原因被删帖,本文尽量不提及该游戏相关关键字作脱敏处理。其二,当然是可恶的“搬砖”党,犹记论坛某某发的X游加速器作品仍在被拿出来“炒冷饭”,真是吾见尤怜,还好我发的被及时删了{:301_997:}
当然!!我还是依然来发帖了。为何??心力交瘁,乾坤斗转;两日磨一剑,岂愿明珠蒙尘,锦衣夜行之感,吾心甚忧!!!!额,说白了留着烂硬盘里不如拿出来让大伙儿学习交流~


简介
某某游戏最近推出了某某DLC(够模糊了吧),由于以往都是无关紧要的武器皮肤之类。此次竟将新地图作为DLC内容锁定!由于对该游戏有过调试经验,知其本地化数据颇多(例如 武器射速伤害 及烂大街的睾贵存档- -!可联机游戏哎~)抱着尝试的态度进行了学术研究!


工具
x64dbg *1
cheat engine *1


正文
如图1所示,可以观察到:选项第五章相较于其他选项为灰色不可选取状态,还有明显的购物车标志及提示文字
图1


PS:未锁定的章节,单击后会背景会变成该章节相关的动图并出现小节选项。锁定的章节单击后不作任何反应!
此时为猜测推理环节!!!逆向本身就是一个推理的论证过程~~
假设(这个假设是成立的嗷,写教程嘛,拿出来的假设肯定是我无数假设中成立的一个!实际论证的艰辛过程不足外人道也):我选中单击第一章,那么有一个数字表示1,我选中单击第二章,有一个数字表示2,以此类推。。。 由于总共才五章,那么这个数肯定不会超过一个字节,为了结果的准确性。数值类型应当为byte 一个字节!
打开cheat engine。一顿操作之后,获得结果。如图2所示,有三个数据地址
图2

第一个为栈地址,可以进行剔除。
第二个以下简称【变量A】
第三个以下简称【变量B】
当选中并单击第五章(被锁定章节)时,数据进行了变化。如图3所示
图3

由此可得:变量B的赋值优先于变量A。又因章节被锁定,而变量A无法像选中其他章节一样被赋值。可以判断变量A的赋值是在章节可选情况下进行的。变量B赋值 --》 判断地图锁定变量 --》 变量A赋值   


打开x64dbg进行附加,并使游戏正常运行。在内存窗口1 CTRL+G 跳转到变量A(图4),内存窗口2 CTRL+G 跳转到变量B(图5),便于观察。(由于CE存在中文字符编码问题,个人不太爱用)
图4

图5

(本想介绍如何找出变量A 与变量B的相关作用涵义,因无关紧要且怕篇幅过大略作删减。A为选中时播放背景相关,B为选中时按钮UI相关)
可以直观的看到。变量B附近,有明显的字符串,ep4_japan。变量A附近并无任何发现。又因变量B赋值优先于变量A,此时选择观察变量B。通过不断单击各个章节,发现附近数值的变化(见图6)。
图6

变量C 变量D 的变化为:单击章节按钮后,未锁定的会变为0,锁定的依然是1,无变动。对变量C下单字节写入断点并选中不同章节来改变,使它如图7所示断下。(我在未选中章节的情况下选了第二章节)
图7

图7中我进行了诸多标注,先说反汇编窗口区域:此处代码为游戏引擎的变量赋值HANDLE,可以观察数据窗口里的数据格式进行对照理解。再看寄存器窗口:由于赋值HANDLE会被不同变量进行疯狂调用(例如移动鼠标,会将鼠标坐标放置到某个变量),经过多次下断调试,可以将R14寄存器的值作为特征码。


OK,得到了这么多信息。未锁定=0锁定=1,而所有变量赋值都要经过这条HNDLE。这里我不选择回溯,因为代码看多了会吐- -!直接利用x64dbg的条件断点功能在这作一个简单的HOOK(见图8)。将所有未锁定=0赋值为锁定=1会发生什么呢?(至于为什么不是1赋值为0?这里的变量是所有变量!UI属性1=true 变为0=false ,会卡BUG)


图8

单击了【选择章节】按钮刷新了一下章节列表,如图9所示可以看到将所有章节变成了如章节五般需要DLC的状态。证明方法可行,如何找出是哪个地址改变的结果?回看图7介绍部分,依据R14的值可作为特征码,修改条件断点为图10所示(文本条件为排除两个无关并且频次较高的特征),保存后单击【选择章节】按钮进行列表刷新,并且快速禁用断点避免记录较多的垃圾数据。
图9

图10

如图11所示,禁用记录断点后查看日志。依据五个章节一共赋值5次,筛选出寄存器的值出现过相同仅5次的文本。得出两份数据,r14=0x80000044 5次rdx=0x211BA6CE530 5次,再将两份数据进行单独比较,可以发现r14=0x80000044的数据源于rdx=0x211BA6CE530。下文将rdx的值0x211BA6CE530称为【变量E】!
图11

回到单字节HANDLE,条件断点设置如图12,单击【选择章节】断下。此时可以手动将5次al赋值为0,你会发现如图13所示。成了???你在想Peach!!此时第五章确实可选,且单击后背景图会相应改变。但是并没有弹出相应小节供选择(依然不可用),单击其他可用章节并无异常。此时再次单击选择章节断下!
图12

图13

断下后F8或堆栈回溯到如图14所示处,下文以【五个章节DLC图标赋值CALL】代称!假设你头铁继续走下去的话,你会发现如图15所示处,我愿称之为dispatch。
图14

图15

找到【五个章节DLC图标赋值CALL】后,下断。并取消之前的条件断点!单击【选择章节】后会断下,此时可以在寄存器R8稳定的获得变量E(该变量地址可能会变动) 。在数据窗口1中转到变量E,并多次断下观察变量E附近数据!(见图16 / 17)
图16

图17

可以得出,在对被锁定的第五章赋值是否为DLC时,内存固定位置出现season_passmarseille字样,且原数据变量类型由4(字符串)变为5(长整数)。尝试在变量赋值HANDLE,长整数类型处如图18所示设置条件断点进行日志输出。并单击【选择章节】按钮看看5次断下对这两个地址赋值了什么!
图18

在累计断下五次后,查看日志输出(见图19),发现第四次到第五次(第五章DLC图标赋值前行为)之间出现了不同的数据。
图19

将第一个出现的值0x1814CEF7920定义为变量A,第二个出现的值0x180FBD3A2E0定义为变量B。并在数据窗口1和数据窗口2分别转到两个值。(图20 / 21 所示)
图20

图21

发现这两个变量具有相同的数据结构,偏移0xD0处为最显眼的字符串,偏移0x18处都指向同一个地址,在数据窗口3中转到该地址看看。

可以看到图22所示,DlcState ,WTF!!!我们来捋一捋,当需要对某个对象进行DLC封锁时,它会到这个结构取state,可能是返回一串数据结构的地址或者简单的0或1。。。此时我已经不想分析下去了,因为已经消耗了我两个日夜的时间,肝快爆了!经过尝试,用CE搜了变量B,并将所有结果值赋0后。得到了我要的结果!图23所示!!!
图22

图23

成品及源码什么的由于版主要求就不作发布了!这文上午11点写到目前晚上9点,发帖又要疯狂审核,累成狗了。想来以后不会再发贴了,且看且珍惜~

设计师三七 发表于 2020-5-14 14:42

我还以为是植物大战僵尸呢

wudi5299122 发表于 2020-5-14 15:21

what are you nong sha lei? IS means this article also need to unlock?

板熊 发表于 2020-5-14 13:40

板凳,瓜子已备好,前排观看:lol

txqq520 发表于 2020-5-14 13:57

我以为是生化危机 原来是我想多了?

onecombo 发表于 2020-5-14 14:12

赶上直播了,学习一下

g339054798 发表于 2020-5-14 14:15

连接呢- - 咋没有了

skingnemo 发表于 2020-5-14 14:38

进入备战状态,学习观望中。。。。

流浪星空 发表于 2020-5-14 14:38

哈哈 还有预告呢

xggmmm 发表于 2020-5-14 14:44

解锁的好
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 某某打僵尸游戏的DLC解锁