zwx117105 发表于 2021-9-2 16:01

某气骑士 android 安全技术分析

7月注册论坛后,第一次发帖。 费时间4天。完成对元气骑士的安全分析
如图:购买付费角色,取消支付后 的界面

工具篇
      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这个类的静态变量(自己编写的)。截图如下:


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

zwx117105 发表于 2021-9-3 14:27

away99 发表于 2021-9-3 14:18
没装支付宝和微信,跳转支付宝网页支付取消后木有反应

没有安装支付宝和微信,支付可能走的另外的一个分支,这个要实际的去调试才知道。

away99 发表于 2021-9-3 19:32

zwx117105 发表于 2021-9-3 14:27
没有安装支付宝和微信,支付可能走的另外的一个分支,这个要实际的去调试才知道。

谢谢,我再研究研究

xiaoyue7788 发表于 2021-9-2 21:29

厉害啊楼主哈哈哈

9tai 发表于 2021-9-2 21:33

牛哇牛哇

kez 发表于 2021-9-2 23:15

说起分析自己喜欢的游戏,一下有了动力{:1_927:}谢谢分享

yyb1813 发表于 2021-9-3 08:02

fxxxysh010 发表于 2021-9-3 08:50

强啊,学习学习

yumanyu 发表于 2021-9-3 08:52

牛啊,分析得好清楚,厉害厉害!!!赞

yangjunyi 发表于 2021-9-3 09:46

牛啊,分析得好清楚,厉害厉害!!!赞

顾惜海 发表于 2021-9-3 09:58

感谢分享思路

sun12345 发表于 2021-9-3 10:00

学到了谢谢分享
页: [1] 2 3
查看完整版本: 某气骑士 android 安全技术分析