做爬虫的朋友,经常会遇到逆向app的场景,大多数app通过反编译,然后硬撸代码,不过效率很低,因为没办法像js一样动态调试加断点得出传递的参数与返回的结果。不过运用frida 实现hooke可以用一个新的函数替代原来的函数,在这个新的函数中你可以通过自定义实现调试拿取你想要的数据。
3.1 根据Frida官网记载,可以通过pyhton,pip下载,如下
3.2 使用pip命令下载
pip install frida-tools
3.3 也可以手动从Frida的GitHub版本页面中获取
3.4 安装AndroidSDK(省略…后期补上)
3.5 配置模拟器(推荐可以用夜深模拟器)
3.5 配置Frida-server(省略…后期补上)
4.1 Frida官网有一个猜拳小游戏的app例子:CTF 2015 APK
4.2 安装apk到模拟器,如下所示
4.3 python代码
import frida, sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
jscode = open("1.js","r",encoding="utf-8").read()
process = frida.get_remote_device().attach('com.example.seccon2015.rock_paper_scissors')
"""注入"""
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
"""是设置消息传出时的回调"""
sys.stdin.read()
4.4 js代码
/**
* Java.perform
* 确保当前线程已经连接VM
* **/
Java.perform(function () {
// Function to hook is defined here
var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity'); //Java.use 指向某个类的指针,参数中com.example.seccon2015.rock_paper_scissors.MainActivity就是我i们需要HOOK的哪个类
// Whenever button is clicked
//
/**
* Call the original onClick handler
* 思就是Hook前面获取到的类中的onClick方法,后面跟着的赋值函数的部分,函数的参数为对应要Hook方法的参数,
* 内部执行的部分就是在对应方法被调用时所执行的代码,
* 这里它是先打了一个onClick日志,
* 然后调用了原始方法(如果不调用的话原始方法不会被执行),
* 接着它将m、n、cnt(变量具体含义请自行反编译APP后查看代码)的值做了修改,
* 最后,它又打了一个携带着cnt变量值的日志。
* **/
var onClick = MainActivity.onClick;
onClick.implementation = function (v) {
// Show a message to know that the function got called
send('onClick');
onClick.call(this, v);
// Set our values after running the original onClick handler
this.m.value = 0;
this.n.value = 1;
this.cnt.value = 999;
// Log to the console that it's done, and we should have the flag!
console.log('Done:' + JSON.stringify(this.cnt));
};
console.log('Done:'+name)
});