欢迎光临散文网 会员登陆 & 注册

dnSpy逆向一款不知名黄油的经验(一)

2020-06-04 19:30 作者:Anicca丶Y  | 我要投稿


不久前玩到一款黄油封呪姫,说真的这游戏做的还是挺好的,去掉H的部分完全能够作为一款优秀的策略游戏.

黄油终归逃不过老三样(汉化,存档,CG解锁)甚至还有比较魔幻的"解码".

以前逆向过一些黄油,拿这款出来写经验是因为这游戏在黄油里是比较罕见的对数据加了密的,虽然比较简单.

作为初次写这类文章,文章将以    [存档 ------ 汉化 ------- "解码"(可能不讲,完全看运气)]    提供一定的思路._.

这款游戏是用unity制作的,不管三七二十一,解密就上神器dnSpy.

首先游戏的存档位置不多说,桌面左上角的用户文档里,隐藏文件夹AppData随便逛一下就找到了.发现文件夹里包含save0.sol,save1.sol,sys.sol等等文件,save0是自动存档生成,save1对应游戏里的第一个存档,sys则是系统存档.在游戏中这三个存档是比较常见的.

直接打开这三个文件,不用多说,肯定一堆乱码,哪有这么小白的作者会把存档明文保存的.

因为是unity开发的作为一个专搞unity游戏的逆向小白,直接去找游戏文件夹下Game_Data\Managed路径里的Assembly-CSharp.dll文件,unity开发的游戏的脚本基本全在这个文件内.

直接二话不多说拖到dnSpy里看看能不能逆向,结果当然不出所料,基本的代码全都被逆向出来了,但是比较头痛的是代码中一大堆不明所以的字符串编码,这方面真的是小白,可能是加了混淆啥的反正代码一大堆乱七八糟的,直接上个图

虽说这是逆向中的障碍,但是这点障碍完全不影响我去看代码呀,直接尝试去搜索一下有关存档的方法,一般来说当然就是save啥的,那就直接搜索save再说.结果搜出来一大堆,当然作为一个有精验的小白来说,能搜出来是好事,搜不出来才头痛好伐.

考虑到这游戏有三种存档保存类型,当然可想而知方法也会有很多,在列表里随便看看方法的名称可能会有点思路啥的.

结果直接找到个SaveEncString方法,字面理解不就是存档字符串加密的方法吗。

猜归猜点进去看看跟实际个图,

一万个草泥马策马奔腾,我去这代码真tm牛逼(不懂是怎么搞出来的)。

不过可读性还是挺高的,毕竟再怎么乱终究只是方法名而已,看着长就是个纸老虎。

代码第一行清晰明了,就是打开了一个文件呗,还搞得花里胡哨的

第二行 明着告诉你把传进来sJs这个字符串加密后给到array这个数组

当然我们解密找的就是这进行加密的方法。直接点进EncryptData这个方法

可见这游戏中的一些方法名都是这么一长串的编码,然而还是不影响,正所谓心中无码便是步兵。

第一行,看上去乱是因为,这里面方法套方法套了好几层,看后面的小括号个数就能知道。

做一下简单的简化处理后得知,方法名用A,B,C替换掉了

svdata = GSys.A(GSys.B(GSys.GetMd5Hash(GSys.A(svdata, <Module>.C<string>(2979640811u))), 0, 8), svdata);

GSys.B(GSys.GetMd5Hash(GSys.A(svdata, <Module>.C<string>(2979640811u))), 0, 8)+svdata

GSys.GetMd5Hash(svdata+"R").Substring(0,8)

总结:(svdata+"R")作为整体得到一串Md5值的前八位,然后得到的8位Md5+svdata得到新的字符串并赋值给svdata。

可见这存档还加md5验证,还故意是加个R后在算md5的,老狐狸的呀

第二行没啥意思就是把svdata以UTF-8存到数组里方便进行操作.

然后到了最关键的第三行的for循环,这不是赤裸裸的加密了吗?????

看关键语句:array2[num] ^= 239

就是每个字符跟239异或后得到个新的值呀,也就是说这加密就TM仅仅是个异或加密

那解密简单呀,异或加密是可逆的,也就是说这串代码再跑一遍就能解密了。

因为不会写C#,只会读

所以写个python代码跑一遍看看,具体就不贴了,反正上面图里的照搬就行。直接上个解密后的文件截图。 

sys.sol
save.sol

破解成功!!!!!!!!!

当然上面的解密过程仅仅只是把原文件,用第三行的异或算法跑了一遍,并没有考虑的第一行代码的验证过程,所以打包的时候简单的异或是不行的.具体要如何打包就参考第一行的代码解析就可以了.

dnSpy逆向一款不知名黄油的经验(一)的评论 (共 条)

分享到微博请遵守国家法律