Frida介绍
Frida 是一款基于 Python + JavaScript的 Hook 与调试框架,可运行在Win、Mac、Linux、Android、iOS等平台
它是一款易用的跨平台Hook工具,主要被用作动态二进制插桩技术
Frida安装
1.安装Frida模块,命令为pip install frida
2.安装frida-tools模块,命令为pip install frida-tools
3.根据android cpu版本去下载相应frida-server,然后去
下载
https://github.com/frida/frida/releases
相应的版本
我这里使用的是模拟器,选择frida-server-14.2.15-android-x86.xz
4.解压后将文件传输到模拟器中的/data/local/tmp目录下,设置可执行权限并运行
5.输入
frida-ps -U
命令后输出模拟器进程,说明frida安装成功
Frida Java层Hook
使用一个Crackme进行Hook
已经找到Crackme关键函数在calcSN中
运行apk程序,随意输入用户名和注册码会有toast弹框注册码错误
编写Hook脚本,脚本如下:
# -*- coding: utf-8 -*-
import frida, sys
jscode ="""
Java.perform(function () {
var utils = Java.use('com.droider.sn.MainActivity');
utils.calcSN.implementation = function (username) {
var res = this.calcSN(username)
console.log("Hook Start...");
send(arguments[0]);
send(res);
return res;
}
});
"""
def message(message, data):
if message["type"] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.droider.sn')
script= process.create_script(jscode)
script.on("message", message)
script.load()
sys.stdin.read()
运行模拟器中的frida_server,设置端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
运行Hook代码,点击注册按钮,用户名和注册码被打印出来
Frida Native层Hook
编写demo
运行后效果如下图
点击按钮
显示3
开始使用Frida进行hook,前面用的模拟器做的java层hook,native层hook需要使用真机
首先查看真机版本,然后选择对应frida_server进行下载
下载好后,运行frida_server_arm,设置端口转发
开始编写hook代码
关键的是so模块名(libnative-lib.so)与函数名(Java_com_example_myapplication_MainActivity_add),通过ida查看函数名
hook代码如下
import frida
import sys
jscode = """
Java.perform(function(){
Interceptor.attach(Module.findExportByName("libnative-lib.so","Java_com_example_myapplication_MainActivity_add"),{
onEnter: function(args) {
send("Hook start");
send("args[2]=" + args[2]);
send("args[3]=" + args[3]);
},
onLeave: function(retval){
send("return:"+retval);
retval.replace(17);
}
});
});
"""
def message(message, data):
if message["type"] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.example.myapplication')
script= process.create_script(jscode)
script.on("message", message)
script.load()
sys.stdin.read()
运行代码
发现显示的为17,说明hook成功