APK逆向分析入门-以某斗地主APP为例
2023-11-11 09:25:6 Author: 黑白之道(查看原文) 阅读量:4 收藏

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

https://github.com/CodingGay/BlackDex

支付逻辑

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

当前是 StartActivity

点击记牌器,切换了 Activity

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

使用jadx查看具体源码

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

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

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

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

综上可以知道一定的支付逻辑,点击记牌器会出现 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)); 方法,参数是刚才的赋值

进入 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,终于看到了支付关键字

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

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

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

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

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

修改支付逻辑

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

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

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

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

总结

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

本文作者:1051733384208540原文地址:https://xz.aliyun.com/t/12962

黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文

END


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650581901&idx=3&sn=9d94924a76dfa0a71796c761d6506bff&chksm=83bdce69b4ca477f18181798c7f5bb14528608fe4b16e299cd6582ee5713df57aa89f44a5f44&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh