插件生成代码
GitHub – AnxiangLemon/MyIdaFrida: Generate Frida Script
常用方法
打印寄存器内容
this.context.寄存器
# ex:this.context.x1
打印字符串内容
# 方法1
var jString = Java.cast(参数, Java.use('java.lang.String'));
console.log("参数:", jString.toString());
# 方法2
var JNIEnv = Java.vm.getEnv();
var originalStrPtr = JNIEnv.getStringUtfChars(参数, null).readCString();
console.log("参数:", originalStrPtr);
修改参数-整数类型
# 修改传入参数
args[0] = ptr(1000); //参数修改为整数 1000,使用ptr方法将1000转为指针再赋值
# 修改返回参数
retval.replace(20000); //使用replace方法返回值修改
修改参数-字符串类型
# 修改传入参数
onEnter: function(args){ //args传入参数
var JNIEnv = Java.vm.getEnv();
var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();
console.log("参数:", originalStrPtr);
var modifiedContent = "至尊";
var newJString = JNIEnv.newStringUtf(modifiedContent);
args[2] = newJString;
}
# 修改返回参数
onLeave: function(retval){ //retval返回值
var returnedJString = Java.cast(retval, Java.use('java.lang.String'));
console.log("返回值:", returnedJString.toString());
var JNIEnv = Java.vm.getEnv();
var modifiedContent = "无敌";
var newJString = JNIEnv.newStringUtf(modifiedContent);
retval.replace(newJString);
}
Hook_Libc
libc.so
: 这是一个标准的 C 语言库,用于提供基本的系统调用和功能,如文件操作、字符串处理、内存分配等。在Android系统中,libc
是最基础的库之一。
# hook字符串比较
function hook_strcmp() {
var pt_strcmp = Module.findExportByName("libc.so", 'strcmp');
Interceptor.attach(pt_strcmp, {
onEnter: function (args) {
var str1 = args[0].readCString();
var str2 = args[1].readCString();
if (str2.indexOf("hh") !== -1) {
console.log("strcmp-->", str1, str2);
this.printStack = true;
}
}, onLeave: function (retval) {
if (this.printStack) {
var stack = Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join("\n");
console.log("Stack trace:\n" + stack);
}
}
})
}
写数据
一般写在app的私有目录里,不然会报错:failed to open file (Permission denied)(实际上就是权限不足)
var file_path = "/data/user/0/包名/test.txt";
var file_handle = new File(file_path, "wb");
if (file_handle && file_handle != null) {
file_handle.write(data); //写入数据
file_handle.flush(); //刷新
file_handle.close(); //关闭
}
inlineHook与读写汇编
直接看视频教程来的块:吾爱破解安卓逆向入门教程《安卓逆向这档事》十六、是时候学习一下Frida一把梭了(终)_哔哩哔哩_bilibili
主动调用
静态方法
var funcAddr = Module.findBaseAddress("xxx.so").add(0x偏移量);
//声明函数指针
//NativeFunction的第一个参数是地址,第二个参数是返回值类型,第三个[]里的是传入的参数类型(有几个就填几个)
var aesAddr = new NativeFunction(funcAddr , 'pointer', ['pointer', 'pointer']);
var encry_text = Memory.allocUtf8String("xxxxx"); //开辟一个指针存放字符串
var key = Memory.allocUtf8String('xxxxx');
console.log(aesAddr(encry_text ,key).readCString());
动态方法参考java的主动调用就行
Trace
直接看视频教程来的块:吾爱破解安卓逆向入门教程《安卓逆向这档事》十六、是时候学习一下Frida一把梭了(终)_哔哩哔哩_bilibili
感谢:【新提醒】《安卓逆向这档事》十六、是时候学习一下Frida一把梭了(终) – 『移动安全区』 – 吾爱破解 – LCG – LSG |安卓破解|病毒分析|www.52pojie.cn