APK逆向分析入门-以某斗地主APP为例

admin 2024年2月15日19:03:56评论11 views字数 2778阅读9分15秒阅读模式

使用 MT管理器 显示加固状态为未加固 如遇到加固,可以使用使用 BlackDex 进行脱壳

https://github.com/CodingGay/BlackDex

APK逆向分析入门-以某斗地主APP为例

支付逻辑

进入游戏,同时使用 MT管理器 的 activity 记录器查看当前 activate

当前是 StartActivity

APK逆向分析入门-以某斗地主APP为例

点击记牌器,切换了 Activity

APK逆向分析入门-以某斗地主APP为例

点击购买,跳转到阿里的支付 Activity

APK逆向分析入门-以某斗地主APP为例

使用jadx查看具体源码

关键字搜索,先查一下有没有 "记牌器" 这个关键词,发现真有

APK逆向分析入门-以某斗地主APP为例

搜索字符串,知道了 com.june.game.doudizhu.activities.b.a 方法会判断开通的是哪一个,就是开通几天的记牌器

然后查看什么调用了这个 a 方法。一共有 3个 调用,结合关键字 2 7 30,应该就是开头 2天7天30天 对应的逻辑操作

APK逆向分析入门-以某斗地主APP为例

查看其中一个方法,是对 Dialog 的 ClickListener

APK逆向分析入门-以某斗地主APP为例

综上可以知道一定的支付逻辑,点击记牌器会出现 3 个 Dialog,属于三种不同的记牌器,然后点击其中一个会调用 com.june.game.doudizhu.activities.b.a 方法,2 7 30作为传参,然后 a 根据传参调用不同的支付

然后接着看 图4 中的 com.june.game.doudizhu.activities.b.a 方法,a方法 会根据上一步中我们选择的不同的 dialog 来进行不同的操作。最后会经过调用 com.june.game.a.a.a().a(this.e, str, str2, d + "", new w(this)); 方法,参数是刚才的赋值

APK逆向分析入门-以某斗地主APP为例

进入 com.june.game.a.a.a().a() 函数

java public void a(String str, String str2, String str3, String str4, c cVar) {
if (str3 == "") {
      str3 = ".";
  }
  String a2 = a(str, str2, str3, str4);
  String a3 = f.a(a2, "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAN565YmUT5fKPEho3DRpQFhmsRkZTAr+5mbsYgyya8hlOlte/U0/6iD/fzZqkdXUqg80zwUO5bw6iZj5zVb66iYScY6W6bMQkYkTOMSmsqVUkbdpaYojOkC4cBR87N/VGL8hTDWHlwoXCpMAEDIwV5Rmpj6AZNYGfE5ertMEAQJbAgMBAAECgYBOvLvjtwN8Ouyey82zFtTY9G8U7OkGszOjlWEWEUcoAvtmPvXykv4vc3z4Kzs1rDALdasWpTEVLrpn03CiqeaXraS++2+8utnFdA2jH+FQPGBPHu+uP5Ye5NeE2o3HD+0VFC9MBcZomPGA8tKT3b82FFnmtUhdw+UzhN5AUQkVAQJBAPtX6+Y6tQwPIsAw/8pHxKvZcMI+5E5X23I6BtzTc5YFGKxTRy5HRbhMQEeYuENhzXJPiCZs7EXjFCqPrm+KSpsCQQDimhTFI4txjX/6H6QKkiAETTgog+1AUVZt8OWJdz6TwOziGv1vpXqaiumTRq8C+owWDAWhbzFtCQUc/Wv6MMNBAkBKxhBXEPYVnVcgSDOA0TMQUQL7tswjBn4xkFPEVF/ZrLB3a9sMSIXUW1LwOd3vpeQB8uk1TUhJTlIMi2xAoKqrAkAvcEJY4xAWPaFFI8qby+uX+vJ+yN+qT1zgt0XWeXhIRmNREoVsEiCQqfQsOOf6n6kkFHA5U6XtRa4kW4l3Xy4BAkAzMB2x6cX18IIe3suZPZfTLLeiXXmMm+IiwlRExKKYevwZ3U5a+yK7+UEedwkCWf92HQW9e5xDSZEqeFzuUq7r");
  try {
      a3 = URLEncoder.encode(a3, "UTF-8");
  } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
  }
  new b(this, a2 + "&sign="" + a3 + ""&sign_type="RSA"", cVar);
}

调用 b(this, a2 + "&sign="" + a3 + ""&sign_type="RSA"", cVar) 函数,查看该函数,看到了 PayTask,终于看到了支付关键字

APK逆向分析入门-以某斗地主APP为例

使用 jadx 查找用例,可以发现该函数的调用用例

APK逆向分析入门-以某斗地主APP为例

查看 com.june.game.doudizhu.activities.b.w.a 函数,发现这一段比较关键的代码,首先从一个函数中获取返回值 a2,然后判断这个值是否等于 9000,再进行下面的购买(关键词 pay,具体逻辑先不看)操作

APK逆向分析入门-以某斗地主APP为例

其中 PayTask 函数的返回值就是上面 a函数 的入参,然后将入参作为获取 String a2 = new com.june.game.a.e(str).a(); 的入参,最后将 a2 与 9000 比较,由于这里是写死的 if-else 比较,我们可以先不考虑具体的调用阿里支付的逻辑,来看一下 9000 有没有特殊含义

使用 jadx 搜索关键词:9000,找到 alipay 的库中的调用

APK逆向分析入门-以某斗地主APP为例

进一步查看,可以得出 9000 是支付结果的 resultcode,代表着成功,那就意味着可以直接修改 a2 或者 if 挑战条件就可以忽略支付真是的返回结果

APK逆向分析入门-以某斗地主APP为例

修改支付逻辑

经过上面的分析可以直接用 MT 管理器 dex 编辑器直接定位到 com.june.game.doudizhu.activities.b.w 类

APK逆向分析入门-以某斗地主APP为例

方法一:不管 a2 获取的什么支付结果,都重新赋值为 9000

方法二:将 if-eqz (if equal to zero)改为 if-nez (if not equal to zero),改变跳转逻辑。为了方便将两个方法写在了一起,方便放一张图。

APK逆向分析入门-以某斗地主APP为例

结果,选择购买跳转支付宝支付后返回就可以。购买成功,记牌器可以成功使用 (两种方法皆可以)

APK逆向分析入门-以某斗地主APP为例

总结

找到最终要修改的部分的逻辑图

APK逆向分析入门-以某斗地主APP为例

本文作者:1051733384208540原文地址:https://xz.aliyun.com/t/12962
APK逆向分析入门-以某斗地主APP为例

原文始发于微信公众号(刨洞安全团队):APK逆向分析入门-以某斗地主APP为例

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日19:03:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   APK逆向分析入门-以某斗地主APP为例http://cn-sec.com/archives/2184483.html

发表评论

匿名网友 填写信息