主要参考链接,本文是r0ysue系列文章的复现
本文附件仓库
frida是面向开发人员、逆向工程师和安全研究人员的动态工具集
可以用它将JavaScript的片段或自己的库注入Windows,MacOS,GNU/Linux,iOS,Android和QNX上的本机应用程序。Frida还提供了一些在Frida API之上构建的简单工具。
环境配置
Windows平台:pip install frida
root过的pixel 2 android 10:下载amd64位的frida-server并使用adb安装
Windows平台通过frida-ps -U
测试是否能够呈现app进程
frida-server版本和pip安装的frida版本要一致
关闭selinux:
adb shell getenforce
adb shell setenforce 0
frida直接运行js脚本:
-U usb,-f target,-l script,–no-pause 在启动后自动开始主线程
frida -U -f com.example.testfrida2 -l 1.js --no-pause
基本能力Ⅰ:hook参数、修改结果
附件:1.apk 1.js
app中onCreate函数中调用fun(50,30),fun函数实现:
public void fun(int x , int y ){
Log.d("Sum" , String.valueOf(x+y));
}
frida js:
- Dalvik层的代码必须定义为一个函数并使用**Java.perform(…)**注册
- Java.use选取要HOOK的类
- 将目标方法的implementation属性修改为一个新的函数,其参数的数量必须与原函数相同
- 运行原方法只需在函数内部调用this.方法名
- setImmediate()用于异步执行一段代码,越快越好
function main() {
Java.perform(() => {
var my_class = Java.use("com.example.testfrida2.MainActivity");
my_class.fun.implementation = function(x,y){
this.fun(2,5);
console.log("x => " + x + " y => " + y);
};
});
}
setImmediate(main)
运行效果:
logcat | grep Sum,看到log改变:
基本能力Ⅱ:参数构造、方法重载、隐藏函数的处理
附件:2.apk、2.js
app中定义一个成员、两个fun及其调用:
private String total = "@@@###@@@";
onCreate函数中:
fun(50,30);
Log.d("ROYSUE.string" , fun("LoWeRcAsE Me!!!!!!!!!"));
void fun(int x , int y ){
Log.d("ROYSUE.Sum" , String.valueOf(x+y));
}
String fun(String x){
total +=x;
return x.toLowerCase();
}
String secret(){
return total;
}
frida js:
- overload实现函数重载
- java string类型数据需获取java.lang.String类,通过**类.new()**方法构造函数
- Java.choose方法可以用来调用隐藏函数
- onMatch查找类的实例,调用每个类实例的方法,有多少类实例就会调用多少次
- Java.choose选择内存中已有的实例,Java.use会新建实例
function main() {
Java.perform(() => {
var string_class = Java.use("java.lang.String");
var my_class = Java.use("com.example.testfrida2.MainActivity");
my_class.fun.overload("java.lang.String").implementation = function(x){
console.log("Original arg: " + x );
var my_string = string_class.$new("My Test String#####");
var ret = this.fun(my_string);
console.log("Return value: " + ret);
return ret;
};
my_class.fun.overload("int" , "int").implementation = function(x,y){
console.log("x => " + x + " y => " + y);
this.fun(x, y);
console.log("*************************************");
};
Java.choose("com.example.testfrida2.MainActivity" , {
onMatch : function(instance)