使用《教我兄弟学Andriod逆向》系列教程第三篇的 APP 来练习,用 Frida 实现内购破解。
把 APK 拖到 JEB3.7 中,搜索购买失败,定位目标代码。
可以看到是 payResultFalse
负责购买失败的相关逻辑,而 payResultSuccess
则实现了购买成功时的逻辑。
这两个函数都是无入参无返回值的,那么破解方式就很简单了,直接把 payResultFalse
的逻辑改成调用 payResultSuccess
即可。
开搞,写 JS 脚本:
Java.performNow(function () {
console.log('fucking perform');
var MymmPay = Java.use('com.mydefinemmpay.tool.MymmPay');
var payResultFalse = MymmPay.payResultFalse;
payResultFalse.implementation = function () {
console.log('fucking false');
this.payResultSuccess();
};
});
打开模拟器,安装好 APK。
开一个 cmd 窗口,连接到模拟器 shell 并启动 frida 服务:
adb shell
./data/local/frida/frida-server
再开一个 cmd 窗口,设置 TCP 转发,然后通过 frida 启动 APP:
adb forward tcp:27042 tcp:27042
frida -U -f com.mf.xxyzgame.wpp.game.hlqsgdzz.huawei --no-pause
然而我发现游戏会卡在主页面,一直播放音乐但点击按钮会无响应。
没办法,用 Python 吧:
import frida, sys
jscode = """
Java.perform(function () {
console.log('fucking perform');
var MymmPay = Java.use('com.mydefinemmpay.tool.MymmPay');
var payResultFalse = MymmPay.payResultFalse;
payResultFalse.implementation = function () {
console.log('fucking false');
this.payResultSuccess();
};
});
"""
process = frida.get_remote_device().attach('com.mf.xxyzgame.wpp.game.hlqsgdzz.huawei')
script = process.create_script(jscode)
script.load()
这次成功了,点击购买后直接获得道具:
Python 端也收到了 console.log
的打印:
总结一下经验,直接通过命令行使用 frida-java-bridge
不如使用 Python 来得靠谱,以后老老实实用 Python。