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

解码的套路(二)

2020-07-12 13:21 作者:Anicca丶Y  | 我要投稿

上篇文章讲解了如何修改资源进行解码。

这篇文章将介绍通过逆向修改代码来解码。

首先稍微讲一下原理,在Unity引擎制作的2D游戏中,马赛克通常就是一个material材质球和关联的Shader着色器实现的,这两个东西在上篇文章的资源过程中是可以直接修改来实现解码的。一个材质如果没有代码来控制的话功能是非常有限的,往往需要一些额外的代码来完善和提高其灵活性。换句话说就是,找到控制马赛克材质的代码也就能轻松的对马赛克进行一些修改了。

首先打开dnSpy把游戏的Assembly-CSharp.dll文件拖进去。

在解码的过程中,找到控制马赛克材质的方法是关键也是难点,只要能定位到对应的方法那么就有无数的手段干掉马赛克。

因此经验和耐心是非常重要的,通常来说最常见的关键词:mosaic是要搜索一下的。

其他游戏可能搜个mosaic真就给找到了,但是鉴于本文章有一点点的教程性质,所以找的例子也是比较坑的。

搜一下啥都没有,去掉你个字母留下mo虽然能出来一大堆,但是看了一圈也没有。

这种情况下,搜索功能就失效了,毕竟每个作者的命名思路都不一样,有些作者偷偷懒打个缩写啥的也是非常常见的,最玄学的就是缩写了,自己想怎么缩就怎么缩,只要自己能看懂管它缩成啥样呢。因此还是老老实实的找其他出路。

这时候我就想到,既然直接找找不到,那么就间接找,在游戏中,马赛克是显示在插图上的,也就是CG上,那么应该会有专门控制CG显示的代码,并且该代码中极大可能会调用显示马赛克的代码。为了验证这个思路,尝试搜索一下CG关键词。

因为找的是方法所以为了避免其他的干扰项直接缩小范围设定成只搜索方法搜索出来的方法数量不算少也不算多,过滤掉一些名字是乱码的方法后也就剩下几十个,完全可以人工在进一步筛选一下。

cg搜索部分截图

在这一堆中可以看见,直接跟cg直接有关的是wcgmode的类,经验告诉我,wcgmode这个词不简单,为什么这么说呢,因为去掉不明意思的w后cgmode就是我们平时游戏里的cg浏览页面。

那么话不多说,直接点开这个类看看里面哪个方法比较可疑。(友情提示:本文的步骤只提供一种思路,试错的过程都已经省略,试错花的时间占了整个流程的90%

可以看到wcgmode这个类方法不多,下面的乱码方法直接忽略就行,是一些涉及到加密的方法。

这里一堆的方法其实都是可以忽略不看的,因为方法内部就是几行代码,也没有调用到可疑的方法。

最终筛选下就剩下3个方法:

全加到分析器里,看看这些方法的调用和被调用。

Init方法是初始化,调用了ReloadThumb这个方法。

再看了Init方法调用的其他方法后,没有一个看上去和马赛克有关。

然后看一下Show方法,这个方法嫌疑是最大的,可以看到这个方法传入的是一个GameObject

也就是说这个方法直接控制GameObject,再从命名上看应该是显示传入的GameObject。

但是看了一圈代码后,没有啥收获。

最后就只剩下ReloadThumb方法,字面意思是重载略缩图,应该跟游戏中CG页面下的方框小图有关。

点开分析器里的ReloadThumb方法,看一下他调用其他方法的情况,

ReloadThumb

往下拉看见了一个非常可疑的方法,也是前面几个方法中没有见过的。

SetMSC,看到这个名字其实心理差不多就有底了,前面提到过mosaic是马赛克的全称,作者偷懒的话怎么简写就不知道了,现在重新回过来看应该一清二楚了,这作者把马赛克mosaic,中三个主要发音的字母缩写成MSC,方法名就是设置马赛克。

直接双击方法定位到SetMSC

SetMSC方法

传入的是GameObject,代码看上去一大堆,以前的文章提到过,这代码本质上就3行,看后面的分号";"个数就行。

第一行:创建material对象存一个外部加载的材质

第二行:material对象的某个属性赋值this.GM.m_MSC,初始化的时候this.GM.m_MSC = 10

第三行:调用SetMSCChild方法

这里最好的方法是直接下断点动态调试一下,确定一下被加密的字符串到底是什么。

不过也可以直接试,毕竟代码就这么点,

大胆的猜一下就是:

material材质是马赛克材质,

g则是要被打马的对象。

然后用SetMSCChild进行进一步的合成。

为了验证猜想其实很简单,既然前面material这个对象已经加载过了,为什么又要给其中一个属性赋值呢?

很明显这个属性至关重要,起到决定性的作用,继续大胆猜测一下:就是通常马赛克代码实现中的像素大小的属性。(可以动态调试验证,在逆向中猜测就是思路,不要觉得猜测就是瞎掰,最怕的就是连猜都不会,那样就是一点思路也没有瞎折腾

也就是说直接修改this.GM.m_MSC这个变量就行,在这里要注意一下修改的时候不要改成0,虽然说是像素大小,但是实现的过程这个量会出现在分母中,如果改成0了不报错也会达不到预期。

在第二行右键选择‘编辑IL指令’

选择9,10,11行,然后按n,nop掉,也可以自己选nop操作码

然后在第9行操作码选择ldc.r4(这个操作码是float类型),值输个0.000001足够小就行,但不要太小,不能为0。

改完后确定

值已经变了。

然后保存模块(记得把原文件先备份一下)

到此有关解码的两种方法就都大致介绍了一下,

以后若能找到合适的例子,我也会将其写成文章记录。

下次我将会对Flash游戏的解码进行非常粗略的介绍。(接触的比较少)

解码的套路(二)的评论 (共 条)

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