蓝天资源网
当前位置:蓝天资源网 / 汇编逆向 / 正文

元气骑Android安全技术分析

作者:忆笙发布时间:2021-09-07 00:51浏览数量:820次评论数量:0次

如图:购买付费角色,取消支付后 的界面

工具篇

Fiddler(网络调试器) :所有的apk网络请求都会经过fiddler ,从中我们可以看到请求方式 get 或者post。请求参数和返回结果, 这个对于我们分析很有帮助。

电脑上用的AndroidKiller 和 手机端NP管理器。功能很强大,包括但不限于注入日志信息(可以调试程序),apk签名,apk二次打包等功能。本案例中 主要用到也就是这个几个功能。

android studio logcat 查看日志信息。 这里为了方便直接用android 开发工具。 本案例中,就是程序输出参数信息,打印到控制台,帮助分析程序流转过程。

分析过程:

首先既然是支付肯定是联网的,顺其自然就想到使用Filddler 查看调用的网络情况。配置一番后,连接手机,打开游戏,点击购买按钮后,fillder如下下界面:

大家请看里面有两个请求

第一个请求 结果 返回的是 orderId=20210902xx2605319330xx。返回的是订单id。

第二个请求的参数中包含了 orderId。 结果 返回的是 {"code":0,"msg":"wait for payment","data":[],"sign":"S3b\/gv3wD5NItvUjbNx+Utvve1UmWIF+666+\/AdxcVmI5blKtE4W01hAo8B3qMLw4UnJkgVD0LumtUYHrcySRLaw0yilMIk="} 貌似返回的是支付结果。这里不着急,慢慢往下看。

既然是请求,我用android kill 全局搜索 fnsdk.4399sy.com 结果如下。

我在思考,这个东西不会就这么简单的给你,一般都采用了加密方式来使用的。 经过很久的折腾以后,我终于发现了一个类 com.ssjj.fnsdk.lang.SsjjFNLang

由此得出 所有的url请求都在这里。

由于本人的是小米手机,里面集成自动登录和支付功能。我在想要不要去小米游戏服务中心去找一找线索,查找了小米提供的游戏支付sdk的文档里面的一句话, 让我找到了方向。

“网游创建充值订单时,先要在游戏服务器端生成一个cpOrderId,然后再由客户端发起充值,

因充值流程可能会耗时数分钟,所以当用户充值返回后一定要利用此cpOrderId到CP服务器上进行查询以便确保是否充值成功;

此外,如果服务器端收到小米游戏服务器的充值回调,也要通知给客户端,以便客户端及时将虚拟物品给用户“

通过整理得出支付流程(网络请求):

第一步 这个是向服务器提支付请求,服务器会返回一个 orderid

第二步 把第一步返回结果orderid作为参数,向服务器发出支付情况确认,返回的是 {"code":0,"msg":"wait for payment","data":[],"sign":"S3b\/gv3wD5NItvUjbNx+Utvve1UmWIF+666+\/AdxcVmI5blKtE4W01hAo8B3qMLw4UnJkgVD0LumtUYHrcySRLaw0yilMIk="}

第三步 对订单进行一个确认

整理思路后,开始研究代码。

登出以下支付过程:

ActivityWrapper4399.pay -> SsjjFNDjPayManager.djpay-> 执行网络url (第一步的orderid申请)->

ActivityWrapper4399.checkOrderLoop->SsjjFNDjPayManager.djCheckOrderLoop->执行网络url(第二步的支付情况查询)->

通过com.ssjj.fnsdk.core.cz.e 处理回调函数-> ActivityWrapper4399$18$1 回到总的回调处理后-->ActivityWrapper4399.confirmOrder 确认订单 ->

SsjjFNDjPayManager.djconfirmOrder ->执行网络请求(第三步的订单确认)->通过com.ssjj.fnsdk.core.cz.f 处理回调函数

->ActivityWrapper4399$19$1 中对 orderID 和productid 进行判断传值后,获取游戏道具成功

修改方法:

.class Lcom/ssjj/fnsdk/core/cz/e;在第二步访问服务器接口回调以后,改变条件分支判断,进入正常支付成功流程。触发第三步 订单确认阶段

.class public Lcom/chillyroom/plugin/wrapper4399/ActivityWrapper4399; 这里面confirmOrder 方法回调中。发现

只有orderId 而没有productId是无法成功获取道具的。 现在你成功就差一步。该怎么办呢?经过一个上午的思考,发现ActivityWrapper4399这个类pay()方法里面有productId输出。于是

我将pay方法里面的 productId 作为结果赋值给 ActivityWrapper4399这个类的静态变量(自己编写的)。截图如下:

最终实现了元气骑士的安全分析。大家有什么可以一起交流。

image.png

image.png

忆笙

忆笙 主页 联系他吧

人间山河远阔,只想与你同行。

欢迎 发表评论: