修复游戏王卡查器笔记
start at 2022/11/13?

游戏王卡查器

最近游戏更新,之前一直用的 mdt卡查器 又失效了,等了两三天作者没有像以前一样及时发布新版本,于是打算把源码下载下来研究一下,看看能不能自己把bug修了

clone下来直接运行mdt.py报错了,是缺少第三方库,requirements.txt里有写需要哪些库

image-20221113101534859

不要直接按报错缺哪些库来装库,因为有些库不是直接对应第三方库名的,比如import i18n,如果直接pip install i18n会没法使用i18n.t函数,因为它的库名是python-i18n

装完所有库之后还是报错了,说有些地方用到了:=,这东西是Go的东西,怎么会出现在python里?

查了下资料才知道,海象符是在Py3.8才引入的,功能和Go中的稍微有点不一样,但是大致语义很简单:

if a:=True:
    print(a)
#等价于
a=True
if a:
    print(a)

所以把海象符改成先赋值再判断的格式就行了,然而运行之后还是报错了,因为缩进空格和tab混用,直接:%s/ /\t/g解决

这样就可以运行起来了,程序的主要思路是先用pymem获得GameAssembly.dll子模块的内存地址,再通过几次偏移指针找到当前显示卡片信息的内存地址,获取该地址的4字节数据,这个数据就是卡片对应的cid,在预先加载好的数据集里查找改cid就能找到是哪张卡了

image-20221113103344884

偏移函数

值得一提的是,组卡,战斗,回放界面用的不是同一个地址偏移方式

image-20221113103650379

不是用一种偏移方式

了解了程序的大致运行思路之后开始调试,打开master duel和程序,发现程序是能找到master duel的地址的,但是点击卡片的时候完全没反应,如果只是更新了新卡那只有新卡不会被检测出来吧,旧卡应该会被检测出来,于是我把检测卡组的try-except去掉了

image-20221113104236417

用try和except不知道具体问题出在哪里

发现程序在偏移函数的一行报错了

image-20221113104335530

读偏移之后的指针发生读取错误

怀疑是新指针偏移发生了变化,原来指向的内容已经失效了,当时经过思考想要找到偏移的方法好像只有两种,一种是用ce根据cid来找到卡片内存位置,根据多次结果来推测偏移值,但是最多有六层偏移量,感觉这有点不切实际,另一种是逆向工程,找到源码里的偏移值,但对于没有过逆向经验的我来说这也是一件困难的事情

逆向

在学习过程中找到一篇博客,而且他正是在做master duel的逆向,区别是他在研究怎么把静态资源反向编译出来,具体步骤是先用 ll2CppDumper 解包GameAssembly.dll,在用 dnspy看函数名找到函数地址,最后用ida找到那个地址分析函数,感觉很有趣,后悔当时选择了 ACM 而不是 CTF …

Cheat Engine

上面的方法有点难度,既要找到对应的函数名,还要能看懂ida反编译后的代码,成本过于昂贵,理性放弃

使用CE就需要直到我们要搜索什么,根据mdt.py这个程序的逻辑 (找到内存中的某个值,然后根据这个值在数据库中找到对应的卡片 ),我们肯定能在内存空间中找到当前点击的卡片的cid,那我们在那里能看到卡片的cid是什么呢,cid的值是从4000-20000的数字因此很明显不是卡片的卡密,我们在程序里找到输出卡片信息的代码

image-20221117104940850

通过card_db找到信息

我们可以直接加载读取这个card_db来找到我们要的卡

image-20221117105402770

把这几句复制进终端

然后发现第一张卡就是青眼白龙,cid为4007,当时打开的是阳光的PSY卡组,所以遍历了一下card_db来找激流葬

zxczxc

激流葬的cid是5114

直接根据这两个cid用CE来找地址,一般会找到四个,如果你多选几张卡会发现有一个目标会失去跟踪,所以有效的地址有三个

1

找到目标

找到之后我们就不用麻烦地遍历card_db来找cid了,点哪张就会显示哪张卡片的cid

如果你以为到此我们的工作就做完了就太天真了,当我们退出当前deck再回来的时候,会发现ce里的三个地址已经失效了,指针偏移的原理大概就是

offsets

某个指针偏移a的指针指向另一个指针的地址

如果只有一两次偏移就可以通过反着查找,用什么改变了这个地址来找,但是现在的情况是多次偏移,看了一个B站视频才学会怎么找

首先找到对应的地址,右键点击对这个地址进行指针扫描

2

级别大小自己调着看,越大越慢

然后退出卡组界面,多找几次对应的地址在上方指针扫描器点击重新扫描内存,把对应的内存输入进去筛选,多次筛选之后在剩下的几个里找看的顺眼点的

3

扫描结果

记住地址前面的初始偏移量,中间的偏移量写入偏移数组,脚本会自动执行

zczvzx

修改程序

值得一提的是总共需要找三个地址,一个是卡组,对战,对手卡组,每个都需要这么来一遍,最后就修复了卡查器

zxczc

完工
2022/11/13
> CLICK TO back <