使用 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