记录一下学习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( function(){ var Myjni = Java.use("com.example.whathappened.MyJNI.Myjni"); var result = Myjni.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; } } );
|
因为刚学所以只有基础知识 以后有新东西再放上来