Frida高级逆向-Hook Native(Java So)2
Frida Hook So 一些操作说明#
Native方法第一个参数是 JNIEnv *env 如何在Frida中获取 JNIEnv 对象呢?#
Java.vm.getEnv();
如何将string类型转换jstring类型呢?#
let jstring = Java.vm.getEnv().newStringUtf(str);
如何将jstring类型转string类型呢?#
aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
Hook So 导出函数#
let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method01');
Hook So 非导出函数#
let so_addr = Module.findBaseAddress('libxiaowei.so');
// 需要去so中找到非导出函数的地址
let encrypt_addr = so_addr.add(0x42B0);
如何在so中定义一个字符串#
let cstring = Memory.allocUtf8String("xiaoweigege");
如何将c中的字符串转成js string?#
ptr(result).readCString()
将函数地址定义成一个函数能在js中进行调用#
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x42B0);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);
在任意apk中加载so文件#
var load_model = Module.load('/data/local/tmp/libxiaowei.so');
这样操作就可以在任意地方调用so中的方法,那么我们就可以脱离apk 比如 hook 系统中 设置 来调用我们的so文件方法,达到脱离本身APK
使用示例#
var load_model = Module.load('/data/local/tmp/libxiaowei.so');
function hook_method1(str) {
let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method01');
let method1_fun = new NativeFunction(method1_addr, 'pointer', ['pointer', 'pointer', 'pointer']);
let aes_value = null
Java.perform(function () {
// Java.vm.getEnv() JNIEnv 对象获取
let jstring = Java.vm.getEnv().newStringUtf(str);
let result = method1_fun(Java.vm.getEnv(), jstring, jstring);
aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
})
return aes_value;
}
function hook_method2(str) {
let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method02');
let method1_fun = new NativeFunction(method1_addr, 'pointer', ['pointer', 'pointer', 'pointer']);
let aes_value = null
Java.perform(function () {
let jstring = Java.vm.getEnv().newStringUtf(str);
let result = method1_fun(Java.vm.getEnv(), jstring, jstring);
aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
})
return aes_value;
}
function hook_encrypt(str) {
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x42B0);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);
console.log(ptr(result).readCString())
}
function hook_decrypt(str) {
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x4538);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);
console.log(ptr(result).readCString())
}
function main() {
let value = hook_method1('xiaoweigege')
hook_method2(value)
}
setImmediate(main)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】