运行

开始游戏界面

image.png

注意

夜神模拟器完全没进入到开始页面就崩溃了
雷电还能多用一会,能开局
但是建议此APK不要下载练习了,本文就看看吧,或者用其他APK文件练习

目的

破解内购,无限制金币等

AndroidKiller

字符串搜索

将中文注入后转为UniCode后搜索:
image.png
建议搜索关键字“购买”、“支付”、“付费”:
image.png

JavaDecompiler

查看源码,在Java代码中找到关键函数和逻辑,可以使用Ctrl+F查找字符串:
image.png

修改Smali

注意到有这样一个字符串“恭喜您达到消费上限,自动开通尊享VIP,您可以免费购买任何道具”,这是符合破解目的的函数所在。
那么思路就是,当支付/购买失败时,都运行成功的逻辑——“payResultSuccess”函数。

1️⃣替换

替换支付结果。
支付结果一共有三种,取消(“;->payResultCancel”),失败(“;->payResultFalse”),成功(“;->payResultSuccess”):
image.png
将取消和失败都替换为成功。

操作

image.png

2️⃣修改跳转

java代码

image.png

  1. if (!tanLibao())
  2. {
  3. payResultFalse();
  4. }
  5. else if (MessageUtil.getInstance().free.equals("1"))
  6. {
  7. payResultSuccess();
  8. }

smali代码

image.png

  1. invoke-virtual {p0}, Lcom/mydefinemmpay/tool/MymmPay;->tanLibao()Z
  2. move-result v2
  3. if-nez v2, :cond_3
  4. .line 958
  5. invoke-virtual {p0}, Lcom/mydefinemmpay/tool/MymmPay;->payResultFalse()V
  6. goto :goto_0
  7. .line 962
  8. :cond_3
  9. invoke-static {}, Lcom/mydefinemmpay/tool/MessageUtil;->getInstance()Lcom/mydefinemmpay/tool/MessageUtil;
  10. move-result-object v2
  11. iget-object v2, v2, Lcom/mydefinemmpay/tool/MessageUtil;->free:Ljava/lang/String;
  12. const-string v3, "1"
  13. invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
  14. move-result v2
  15. if-eqz v2, :cond_4
  16. .line 963
  17. invoke-virtual {p0}, Lcom/mydefinemmpay/tool/MymmPay;->payResultSuccess()V

不等于改为等于
  1. #如果v2不等于0则跳转到:cond3
  2. if-nez v2, :cond_3
  3. #if-nez改为if-eqz
  4. if-eqz v2, :cond_3

回编译

smali代码修改

为了让效果明显一点,在“doPaySuccess”函数内把字符串加了点信息:
image.png

保存修改

image.png

编译

image.png

重新运行破解版

image.png