1.FRIDA 初级
接着上篇文章"Android逆向-Frida入门学习笔记",这次记录一些日常工作中分析app时会用到的一些frida小技巧。
1.1.Frida远程过程调用(rpc)
有时候分析一个应用的算法时找到了算法的实现方法但方法的逻辑特别复杂或被混淆了怎么办?
这时候我们可以选择一个简单而粗暴的方式,直接刚,啊呸,直接调。
frida支持在js代码中使用rpc.exports关键字对js函数进行导出,导出方法可在python代码中通过script.exports.导出符号()进行调用。配合之前说过的frida的方法主动调用,可以很好的完成对应用中的算法或核心方法进行主动单独调用。
function Hook10(){
Java.perform(function(){
console.log("Frida Test Hook10");
// 主动调用类静态方法
var clszz = Java.use("cn.gemini.k.fridatest.FridaHook1");
console.log("func3_verify_static ret:"+clszz.func3_verify_static(">>>pwd<<<"));
});
}
rpc.exports = {
exporthook10: Hook10 //将方法导出为exporthook10符号,这里要注意导出名千万不能有大写字母或下划线
};
python代码
# -*- coding: UTF-8 -*-
import frida
import sys
# 目标包名
appPacknName = "cn.gemini.k.fridatest"
scriptFile = "hook_script.js"
# 输出日志的回调方法
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
device = frida.get_usb_device()
# spawn模式,找到目标包名并重启,在启动前注入脚本
pid = device.spawn([appPacknName])
session = device.attach(pid)
# 注意这里需要将device.attach(pid)这句代码写在前面,这样执行才符合预期(启动时程序白屏,等待下面这行代码来恢复执行)
# 其实在https://www.jianshu.com/p/b833fba1bffe这篇文章中有提到
device.resume(pid)
# 方式一: 通过js文件创建hook代码
with open(scriptFile, encoding='UTF-8') as f:
script = session.create_script(f.read())
# 方式二: 直接将hook代码写在python文件中
# script = session.create_script(js_code)
script.on("message", on_message)
script.load() # 把js代码注入到目标应用中
# 避免结束
# sys.stdin.read()
# frida RPC测试
script.exports.exporthook10() # exportmain为js文件中的导出符号
1.2.Frida手动加载dex
破解应用时如果想在应用中执行我们自己写的Java类代码通过frida怎么实现?
可以将自定义的Java类编译成一个dex文件,懒得单独编译也可以直接去apk文件中获取,需要注意的是有些apk可能存在多个dex文件,这里需要找一下一定要是含有我们Java类的那个dex。
dex文件准备好后使用adb工具push到设备的"/data/local/tmp/“目录下方便我们的frida代码加载,之后通过Java.openClassFile(”/data/local/tmp/my.dex").load()对目标dex进行加载。这样就可以通过Java.use调用我们直接写的方法了。
function hook() {
Java.perform(function () {
Java.openClassFile("/data/local/tmp/my.dex").load();
var cls = Java.use("xx.xxxxxx.x.xxxxxxxxxxxx"); // 自定义的Java类
console.log(cls);
var obj = cls.$new(); // 实