0%

Frida学习记录

记录一下学习Frida的历程

环境配置

雷电模拟器(版本9.0.70.0)的安卓版本为Android9 处理器框架为x86_x64 建议使用

Frida Server14.2.18 + Python3.8 + Frida14.2.18(pip install frida==14.2.18, frida-tools==9.2.5)的环境配置

下载完服务器后使用adb将其移入模拟器中:

1
2
adb -s emulator-5554 push fs \data\local\tmp
adb -s emulator-5554 shell "chmod 777 \data\local\tmp\fs"

常用命令

在模拟器上安装frida-server后用adb命令adb -s deviceID shell "/data/local/tmp/fs&"启用服务器 此时再打开一个终端进行端口转发:

1
2
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

现在可以使用frida-ps -U显示进程和包名 假设已经写好hook脚本hook.js 并且要hook的程序正在运行 可以使用frida -U -f 包名 -l hook.js将脚本注入程序中

hook脚本编写

hook结果和参数 修改结果

以以下的包为例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.example.whathappened.MyJNI;

public class Myjni {
static {
System.loadLibrary("whathappened");
}

public static native String getstr() {
}
int func(int x, int y) {
return x + y;
}
String func(String x) {
return x.toLowerCase();
}
}

getstr是一个JNI注册的native函数 没有参数只有返回值 可以使用这个脚本来hook结果:

1
2
3
4
5
6
7
Java.perform(        //hook脚本要执行的函数
function(){
var Myjni = Java.use("com.example.whathappened.MyJNI.Myjni"); //找到目标类并重载到指定的变量中
var result = Myjni.getstr(); //主动调用并获取这个类中的getstr函数执行的结果
console.log("result: " + result);
}
);

对func函数如果想打印参数和结果的话需要区分重载:

1
2
3
4
5
6
7
8
9
10
11
12
13
Java.perform(
function(){
var Myjni = Java.use("com.example.whathappened.MyJNI.Myjni");
Myjni.func.overload("int", "int").implementation = function(x, y){ //明确重载类型
var origin_res = this.func(x, y); //调用原函数
console.log("Origin call:func(" + x + ", " + y + ") ->" + origin_res);
}
Myjni.func.overload("java.lang.String").implementation = function(s){
var newres = s.toUpperCase(); //修改原函数的功能
return newres;
}
}
);

因为刚学所以只有基础知识 以后有新东西再放上来