内容简介:前人栽树,后人乘凉,第一次安卓逆向在翻看了无数的教程之后,选择一款不算是国内大厂制作发行并且版本较老的apk《饥饿鲨》,版权属于育碧手游(UBSOFT),在签名、验证等环节可能就省去了不少步骤,下面就是比葫芦画瓢+思考环节打开apk后发现,首先是发现加载页有个电信的爱游戏平台,可以得到一些对应关键字的信息,如:
前人栽树,后人乘凉,第一次安卓逆向在翻看了无数的教程之后,选择一款不算是国内大厂制作发行并且版本较老的apk《饥饿鲨》,版权属于育碧手游(UBSOFT),在签名、验证等环节可能就省去了不少步骤,下面就是比葫芦画瓢+思考环节 。
准备
- 饥饿鲨apk: Download
- ApkIDE(改之理): Download
- dnSpy: Download
- 安卓模拟器(或真机)
发现
打开apk后发现,首先是发现加载页有个电信的爱游戏平台,可以得到一些对应关键字的信息,如: paySuccess 、 payCancel 、 payFailed 等,对于特定的游戏内购平台,关键字不大相同又如出一辙;
主页面点击购买金币和钻石,可能是由于游戏版本较老还是平台验证什么原因,在真机和模拟器上一直无法购买成功,等下我们就在这里做文章,跳过这个支付验证 ;
反编译
将游戏拖入IDE打开,生成游戏应用目录,实际上apk类似一个压缩文件,通过winnar同样可以看到解压后的文件:
- AndroidMainifest.xml:以xml结尾的都知道了,类似站点的sitemap,这里也就是安卓的结构目录 ;
- build:一般存放
classes.dex可执行文件以及resources.arsc语音包文件; - assets:同样顾名思义,有价值的东西,安卓的“财富”文件夹,放一些图片等文件;
- lib:安卓的.so文件动态库文件夹;
- res :资源库目录 一般存放xml布局文件和图标;
- original:存放
META-INF签名文件夹的目录; - smail:Dalvil(Google为安卓设计的虚拟机)的内部执行代码;
不同的应用目录位置是大同小异的。在IDE这类专业 工具 中,有助于更好的分析。
像gameloft等这种国外手游大厂都很倾向于Unity3D引擎去制作游戏(小时候玩的有点多)。由于不是手游发烧友,研究一下育碧手游,如何识别?我们点开lib文件夹,可以发现下面有个 armeabi-v7a 文件夹,看到arm便知道这和多半的内核有关系,其中的.so文件支持arm架构的真机运行,如果修改过后,拿模拟器闪退也就是理所当然的事情了,再打开,发现存在libunity.so文件,到这里基本可以确定这就是一个Unity3D引擎制作的手游。
要修改Unity3d游戏,首先就要对其游戏代码存放位置有一个基本的了解。Unity3d生成游戏的游戏主逻辑一般放在三个地方:libil2cpp.so、Assembly-CSharp.dll、 lua 脚本。
————一位伟人说过
分析
既然有可能(很大可能)存在于.dll文件中,那我们找到IDE目录下,找到apk解压目录,将 Assembly-CSharp.dll 、 Assembly-CSharp-firstpass.dll 拖入dnSpy中,并尝试搜索关键字 paySuccess :
编辑器语言为C#,发现上面提到一般爱游戏关键词都失效,既然都如出一辙,那我们换个思路尝试搜索 success ,看能否大有大有收获:
可以看到这是一个私有类,再往下搜索,眼前一亮,我们找到了公共类 OnPurchaseSuccessfull (拼写是啥玩意 ),由于暂时只考虑破除内购,其他大类咱先不看:
同理,以 PurchaseFail 为关键词,看看他们各自都是如何返回执行的,看到有一个if判断语句,如果支付失败,支付取消,返回失败:
这就显而易见了,如果支付失败让他也直接返回 Success ,即把 OnPurchaseSuccessfull 的执行代码拷贝到 OnPurchaseFailed 方法下面,我们在对应代码右键→编辑方法,替换后编译:
Debug.Log("OnPurchaseSuccessfull in GUIManager");
GUIBuyingProcess[] componentsInChildren = base.GetComponentsInChildren();
for (int i = 0; i < componentsInChildren.Length; i++)
{
if (componentsInChildren[i].Type == GUIBuyingProcess.BuyingType.Currency || componentsInChildren[i].Type == GUIBuyingProcess.BuyingType.CoinMultiplier)
{
componentsInChildren[i].State = GUIBuyingProcess.BuyState.ePurchaseConfirmed;
}
else
{
Debug.Log("Unrecognised buying type: " + componentsInChildren[i].Type);
}
}
FGOLAnalytics.ReportBankPurchaseResult("Success");
将 Assembly-CSharp.dll 、 Assembly-CSharp-firstpass.dll 都进行如此操作,然后保存到对应原ApkIDE\Work\com.fgol\assets\bin\Data\Managed目录当中,保存模块:
返回IDE,刷新目录,编译签名apk,耐心等待:
在模拟器打开一下,看看效果(记录器抽风 ):
其他
对于安卓逆向,AndroidKiller、ApkIDE、GDA这几个工具都可以,看个人习惯以及电脑的环境配置来操作,AndroidKiller基于apktool反编译,且需要配置java JDK,版本号不兼容经常编译失败,推荐后两者。
下载: Download
参考教程(部分):
- 《170715 逆向-APK基础知识》: https://blog.csdn.net/whklhhhh/article/details/75193761
- 《unity游戏生成与修改so文件教程》: https://www.52pojie.cn/thread-618515-1-1.html
- 《 Android调试系列—使用android studio调试smali代码 》: https://www.52pojie.cn/thread-505077-1-1.html
- 《教我兄弟学Android逆向04 动态调试smali代码》: https://www.52pojie.cn/forum.php?mod=viewthread&tid=658865&extra=page%3D1%26filter%3Dtypeid%26typeid%3D236
以上所述就是小编给大家介绍的《一次安卓逆向之「饥饿鲨」内购破解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning JavaScript
Shelley Powers / Oreilly & Associates Inc / 2006-10-17 / $29.99
As web browsers have become more capable and standards compliant, JavaScript has grown in prominence. JavaScript lets designers add sparkle and life to web pages, while more complex JavaScript has led......一起来看看 《Learning JavaScript》 这本书的介绍吧!
SHA 加密
SHA 加密工具
HEX HSV 转换工具
HEX HSV 互换工具