破解笔记1——谷歌百万下载量游戏《地牢年代记》之解锁付费物品
本帖最后由 kvieta丶心灵 于 2020-1-17 23:09 编辑前言:
快过年了,给大家分享下一款谷歌付费的U3D安卓游戏的破解教程,也作为我学习逆向的笔记,记录下为了兴趣使然而努力过的痕迹,多年以后回顾曾经的记忆,那种乐在其中无法自拔的感觉会不断的鼓励我不会轻言放弃(等等.....巧合般的押韵啊- -。。)。我们因相同的兴趣相聚在这里,即是缘分也是必然。提前预祝吾爱的大家新年快乐!(本教程由EW-ISC工作小组成员kvieta丶心灵在52pojie.cn首发,转载请保留此信息,感谢合作。)
一:游戏介绍
《地牢年代记》是一款类似暗黑破坏神的RPG手机游戏,有2个角色3种职业可供选择,游戏为每个玩家设计的副本,从中得到的资源材料兑换出不同武器,攻击效果也是很棒,有套装装备,无聊的时候可以用来消磨时间,比什么消消乐斗地主强太多。以下是游戏截图:
二:目标分析
游戏中有4中特殊商品需要付费才能购买,分别是300个红玉、1100个红玉、6000个红玉、扩展仓库。如下图:
其他物品使用黄金或者红玉即可购买,也就是说我们只需要破解这4种商品即可购买所有物品。这里我们找到了需要修改的目标,然后我们来分析目标具有什么特征。首先我们分别点击目标,出现如下画面:
目标<300个红玉>具有的特征:增加300个红玉、删除所有广告。
目标<1100个红玉>具有的特征:增加1100个红玉、删除所有广告。
目标<6000个红玉>具有的特征:增加6000个红玉、删除所有广告。
目标<扩展仓库>具有的特征:扩展20格仓库、增加200个红玉、删除所有广告。
自此我们把需要修改的目标特征分析完毕,接下来我们开始逆向之旅吧!
三:准备工作
地牢年代记原版游戏下载地址:链接:https://pan.baidu.com/s/1RnkQDyEV-EVoDL-M74-GxQ提取码:pw4s
然后准备好我们需要使用到的工具:
1:AndroidKiller:https://down.52pojie.cn/Tools/An ... idKiller_v1.3.1.zip
2:dnSpy:https://down.52pojie.cn/Tools/NET/dnSpy.zip
3:任意一款安卓模拟器,我使用的是网易MuMu模拟器,百度下载即可。
关于AndroidKiller和dnSpy两种工具的使用我就不在此多说了,论坛上各位大佬已经发过很多教程和插件了,各位请自行利用搜索功能进行搜索,这也是一种学习方式。
AndroidKiller环境:
jdk1.7 x64:https://www.oracle.com/cn/database/technology/java-se-jdk-7-download.html
apktool 2.3.4:https://ibotpeaches.github.io/Apktool/
dex2jar v2.1:https://down.52pojie.cn/Tools/Android_Tools/dex2jar%20v2.1.zip
jd-gui-1.6.6:https://github.com/java-decompiler/jd-gui/releases
你坏大佬的rtl230.bpl:https://www.52pojie.cn/thread-658341-1-1.html
都有了以上的插件和环境以后,接下来打开AndroidKiller,把地牢年代记的apk拖进去,得到如下信息:
游戏用Unity3D开发,根据Unity3D游戏特性,我们可以直接定位到Assembly-CSharp.dll用dnSpy打开(工程管理器->assets->bin->Data->ManaGed),如图:
到了这里,我们只需要找到相关代码并进行修改就可以达到我们的目的。那么我们要怎么才能找到相关的代码呢?这就要用到我们前面分析的目标特征,我们以搜索程序集(Ctrl+Shift+K)的方式搜索目标的数量,看看搜索出些什么东西。我们搜索最多的6000红玉。如下图:
看见那个橙黄色的Ruby6000了吗?接下来我们进入代码分析阶段。
四:代码分析
1:在dnSpy里,橙黄色表示函数/方法。
2:Ruby除了是一门脚本语言,还有红宝石之意。
那么这个Ruby6000是我们要找的相关函数吗?我们双击点进去瞧一下就知道了!如下图:
这是Ruby6000()函数的代码:
public static void Ruby6000()
{
Observer.Instance.coffee(); //在不了解整体游戏架构前这条代码我们可以根据取名来分析代码的功能,这段代码应该是购买红玉时进行的初始化操作。
Item_Gem item_Gem = new Item_Gem(6000, true); //创建Item_Gem对象,将对象引用分配给item_Gem变量,并且传入参数值6000和参数值true,这里应该就是我们要修改或者调用的部分了。
MyInfo.Instance.currentCharInfo.bNoAds = true; //根据取名意义可知这应该是去掉广告?大概。。。。
if (Inventory.Instance.AddItem(item_Gem, true)) //增加当前红玉数量?大概。。。。。
{
IAP.Instance.InsertOrder(); // 第一次破解谷歌支付先不着急这个,我们看不懂它,放着先。
}
IAP.Instance.isPolice(); //同上。。。。。
Inventory.Instance.ShowScrollItem(item_Gem); //和红石的显示有关,放着。
Gamemanager.Instance.UpdateFotuneText(); //更新红石显示文本?放着。
Gamemanager.Instance.MessageBox.Close_Background(); //消息后关闭后执行的相关处理?放着。
Observer.Instance.Reset(); //和最还是的coffee()配对,重置一些配置?放着。
}
作为不了解整体游戏架构且第一次打开看见这段代码的人来说,我们应该一步一步的分析,根据取名含义来进行大体上的猜测,然后找到我们认为的关键代码进行测试。上面的注释是我自己分析的,大家可以根据自己的分析来进行判断。根据以上分析我们可以得出关键代码:
Item_Gem item_Gem = new Item_Gem(6000, true); //创建Item_Gem对象,将对象引用分配给item_Gem变量,并且传入参数值6000和参数值true,这里应该就是我们要修改或者调用的部分了。
MyInfo.Instance.currentCharInfo.bNoAds = true; //根据取名意义可知这应该是去掉广告?大概。。。。
Inventory.Instance.AddItem(item_Gem, true); //增加当前红玉数量?大概。。。。。
Inventory.Instance.ShowScrollItem(item_Gem); //和红石的显示有关,放着。
Gamemanager.Instance.UpdateFotuneText(); //更新红石显示文本?放着。
接下来我们就要进行测试环节了。
五:代码测试
首先我们要知道我们刚才分析的代码是独立于游戏外的,不能直接调试,那么我们得想办法在游戏内能调试我们找到的代码,有什么方法能调试呢?对于初学者来说我们不会高深的技术,只能通过修改游戏里的功能这种笨方法来实现,这种方法虽然很耗时耗力,但是好处多多,对于我们理解游戏的架构有巨大的帮助。那么我们开始来分析游戏吧!
我们通过分析发现游戏内的物品除了可以用红玉购买还可以用金币,金币可以通过打怪获得,我们去打怪获得100金币以后购买最便宜的10个HP药剂,在这个过程中,有以下需要注意的:
点击购买按钮触发购买的功能,购买的功能会进行判断:
金币不足时:点击购买会弹出一个大的消息提示框。
金币充足时:点击购买会弹出一个小的消息提示框。
通过以上分析我们可以得到游戏开发者的逻辑思维,那么红玉的购买也基本上离不开上面的操作,我们可以通过修改点击购买按钮触发的事件来进行我们找到的关键代码的调试。那怎么找到按钮触发事件呢?这里我们就来逆一下之前得到的代码,其中有一条代码为:
Gamemanager.Instance.MessageBox.Close_Background(); //消息后关闭后执行的相关处理?放着。
我们把鼠标移到MessageBox上面会得到如下提示:
这里得到MessageBox所在的类,根据意思我们明白这个就是处理用户界面消息的类,我们搜索这个类,然后点击进入这个类里面,如图:
然后按照老方法,以查找的方式搜索6000(Ctrl+F),结果我们跳到这里:
分析代码:
if (!GPGSUtil.Instance.IsAuthenticated || !IAP.Instance.IsInitialized())
{
this.SignInAndIAPInit();//通过翻译取名我们可以知道如果验证GPGS实用程序失败并且IAP实例没有初始化就执行SignInAndIAPInit()。
}
else
{
IAP.Instance.BuyProductID("ruby6000");//都成功了就执行BuyProductID()。
}
break;
到这里我们是不是有点激动,如果把他修改直接成功的操作会不会就破解了呢?我们来试试看!如图:
然后查找6000到修改的地方,点击保存所有。
然后回到AndroidKiller,我们点击编译,等待完成以后我们打开apk路径,然后卸载掉模拟器的正版游戏,安装破解以后的apk,不然签名不同会安装失败。如图:
再AndroidKiller上点击运行(不会配置AndroidKiller链接模拟器的搜索论坛,论坛有方法),找到我们修改的地方,如图:
怀着激动的心情我们点击了购买,结果......消息框消失了,但是什么都木有发生......what???看来我们还没改到家,继续回到dnSpy,找到修改代码的地方,我们记录下BuyProductID()的productId参数值ruby6000,点击BuyProductID,然后我们查找productId == "ruby6000"(为什么这么查找,emmmm 你太贪玩了!快去翻学习C#的笔记!),如图:
到这里我们可以看到一开始我们找到的那个Ruby6000(),好了,一切都明朗了,直接把Ruby6000()里面的我们分析得到的关键代码复制到按钮触发事件那,然后保存,编译,安装,如图:
然后我们运行游戏,再次怀着激动的心情我们点击了购买......然后:
哈哈哈哈!大功告成!
六:其他+作业
其他:这节教程中出现的GPGSUtil类和IAP类是关于谷歌支付的,其中BuyProductID可作为今后破解谷歌支付的关键入口,不用在费力去分析大量代码了。
作业:把其他付费的物品给破解掉!我们下期再见! 这辣鸡游戏还没黄?
内购 货币 hp mp 爆率 我都改过
https://i.loli.net/2020/01/18/7CdmAEItQ3416ao.jpg 感谢分!!!!!!!!享 感谢分享! 在哪下载呀!!! sadlybox 发表于 2020-1-17 23:06
在哪下载呀!!!
在第三节准备工作里有下载地址哦⊙?⊙! 看得我我脑壳疼,感谢大佬分享 玩着玩着就没劲了...... 风绕柳絮轻敲雪 发表于 2020-1-18 00:17
这辣鸡游戏还没黄?
内购 货币 hp mp 爆率 我都改过
你那个都已经找不到了,而且这种游戏破解练手很好呀 之前的150权限真的顶不住啊