安卓Frida Hook进阶
安卓Frida Hook进阶
实验环境
windows 10 vscode frida 16.2.1 jadx-gui jeb
实验
//一般写在app的私有目录里,不然会报错:failed to open file (Permission denied)(实际上就是权限不足)
var file_path = "/data/user/0/com.zj.wuaipojie/";
var file_handle = new File(file_path, "wb");
if (file_handle && file_handle != null) {
file_handle.write(data); //写入数据
file_handle.flush(); //刷新
file_(); //关闭
}
function inline_hook() {
var soAddr = Module.findBaseAddress("lib52pojie.so");
if (soAddr) {
var func_addr = soAddr.add(0x10428);
Java.perform(function () {
Interceptor.attach(func_addr, {
onEnter: function (args) {
cole.log(x22); //注意此时就没有args概念了
x22 = ptr(1); //赋值方法参考上一节课
},
onLeave: function (retval) {
}
}
)
})
}
}
- 将地址的指令解析成汇编
var soAddr = Module.findBaseAddress("lib52pojie.so");
var codeAddr = Instruction.parse(soAddr.add(0x10428));
cole.log(());
- Frida Api
arm转hex
直接改写汇编,改机器码
代码语言:javascript代码运行次数:0运行复制function patchCode(){
var soAddr = Module.findBaseAddress("lib52pojie.so");
var codeAddr = soAddr.add(0x10428);
var codeasm = Instruction.parse(codeAddr);
cole.log(());
Memory.patchCode(codeAddr, 4, function(code) {
ct writer = new Arm64Writer(code, { pc: codeAddr });
writer.putBytes(hexToBytes("20008052")); // MOV W0, 1
// writer.putBytes(hexToBytes("200080D2")); // MOV X0, 1
writer.flush();
});
}
function hexToBytes(str) {
var pos = 0;
var len = str.length;
if (len % 2 != 0) {
return null;
}
len /= 2;
var hexA = new Array();
for (var i = 0; i < len; i++) {
var s = str.substr(pos, 2);
var v = parseInt(s, 16);
hexA.push(v);
pos += 2;
}
return hexA;
}
frida关于nativefunction的文档:
支持的参数类型如下:
代码语言:javascript代码运行次数:0运行复制void
pointer
int
uint
long
ulong
char
uchar
size_t
ssize_t
float
double
int8
uint8
int16
uint16
int2
uint2
int64
uint64
bool
代码语言:javascript代码运行次数:0运行复制var funcAddr = Module.findBaseAddress("lib52pojie.so").add(0x1054C);
//声明函数指针
//ativeFunction的第一个参数是地址,第二个参数是返回值类型,第三个[]里的是传入的参数类型(有几个就填几个)
var aesAddr = new ativeFunction(funcAddr , 'pointer', ['pointer', 'pointer']);
var encry_text = Memory.allocUtf8String("OOmGYpk6s0qPSXEPp4X1g=="); //开辟一个指针存放字符串
var key = Memory.allocUtf8String('wuaipojie012456');
cole.log(aesAddr(encry_text ,key).readCString());
jni函数还是原来那一套,比如下面输出返回值,并修改返回值为true
代码语言:javascript代码运行次数:0运行复制function hooktest(){
Java.perform(function() {
var securityUtilClass = Java.use("com.zj.wuaipojie.util.SecurityUtil");
// 定义要调用的 JI 方法
var checkVipMethod = ();
// 在 Frida 中调用 JI 方法
checkVipMethod.implementation = function() {
cole.log("Calling Java_com_zj_wuaipojie_util_SecurityUtil_checkVip method...");
// 在这里可以添加自定义逻辑
// 调用原始 JI 方法
var result = ();
// 输出结果
cole.log("Result: " + result);
// 返回结果
return true;
};
});
}
工具名称 | 描述 | 链接 |
---|---|---|
jnitrace | 老牌,经典,信息全,携带方便 | jnitrace |
jnitrace-engine | 基于jnitrace,可定制化 | jnitrace-engine |
jtrace | 定制方便,信息全面,直接在_agent.js或者_agent_stable.js 里面加自己的逻辑就行 | jtrace |
hook_art.js | 可提供jni trace,可以灵活的增加你需要hook的函数 | hook_art.js |
JI-Frida-Hook | 函数名已定义,方便定位 | JI-Frida-Hook |
findhash | ida插件,可用于检测加解密函数,也可作为ative Trace库 | findhash |
Stalker | frida官方提供的代码跟踪引擎,可以在ative层方法级别,块级别,指令级别实现代码修改,代码跟踪 | Stalker |
sktrace | 类似 ida 指令 trace 功能 | sktrace |
frida-qbdi-tracer | 速度比frida stalker快,免补环境 | frida-qbdi-tracer |
### 4.1 frida-trace | ||
Frida-Trace 是 Frida 框架提供的一个功能强大的工具,用于追踪和监视目标应用程序中的函数调用。通过 Frida-Trace,用户可以轻松地跟踪函数的调用、参数和返回值,并实时查看这些信息。以下是 Frida-Trace 的一些主要特点和用法介绍: |
主要特点:
- 动态追踪:Frida-Trace 可以实时监视目标应用程序中的函数调用,无需重启应用或重新编译代码。
- 灵活性:用户可以根据需要选择要追踪的函数,包括系统库函数和自定义函数。
- 函数参数和返回值:除了函数调用,Frida-Trace 还可以显示函数的参数和返回值,帮助用户更好地理解函数的执行过程。
- 易用性:Frida-Trace 提供了简洁的命令行接口,用户可以通过命令轻松设置和启动函数追踪。
- `-i` / `-a`: 跟踪 C 函数或 so 库中的函数。
PS:-a 包含模块+偏移跟踪,一般用于追踪未导出函数,例子:-a "lib52pojie.so!0x479c"
包含/排除模块或函数:
- `-I` : 包含指定模块。
- `-X` : 排除指定模块。
Java 方法跟踪:
- `-j JAVA_METHOD`: 包含 Java 方法。
- `-J JAVA_METHOD`: 排除 Java 方法。
附加方式:
- `-f`:通过 spwan 方式启动
- `-F`:通过 attach 方式附加当前进程
日志输出:
`-o`:日志输出到文件
使用案例:
注意下面需要打开相应的app保持在屏幕上
代码语言:javascript代码运行次数:0运行复制#附加当前进程并追踪lib52pojie.so里的所有Java_开头的jni导出函数
frida-trace -U -F -I "lib52pojie.so" -i "Java_"
4.2 jnitrace
安装
代码语言:javascript代码运行次数:0运行复制pip install jnitrace==..0
使用
代码语言:javascript代码运行次数:0运行复制//attach模式附加52pojie.so并输出日志,其中wuaipojie是进程名,可以通过frida-ps -U查看
jnitrace -m attach -l lib52pojie.so wuaipojie -o trace.json
jnitrace -m spawn -l lib52pojie.so com.zj.wuaipojie
代码语言:javascript代码运行次数:0运行复制`-l libnative-lib.so`- 用于指定要跟踪的库
`-m <spawn|attach>`- 用于指定要使用的 Frida 附加机制
`-i <regex>`- 用于指定应跟踪的方法名称,例如,`-i Get -i Registeratives`将仅包含名称中包含 Get 或 Registeratives 的 JI 方法
`-e <regex>`- 用于指定跟踪中应忽略的方法名称,例如,`-e ^Find -e GetEnv`将从结果中排除所有以 Find 开头或包含 GetEnv 的 JI 方法名称
`-I <string>`- 用于指定应跟踪的库的导出
`-E <string>`用于指定不应跟踪的库的导出
`-o path/output.json`- 用于指定`jnitrace`存储所有跟踪数据的输出路径
4. sktrace
地址:.git
这个类似 ida 指令 trace 功能,显示每个执行的汇编的寄存器的值
代码语言:javascript代码运行次数:0运行复制python sktrace.py -m attach -l lib52pojie.so -i 0x10B4 wuaipojie
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 11 条评论) |
本站网友 天津金元宝商厦 | 25分钟前 发表 |
排除指定模块 | |
本站网友 股票自动交易软件 | 0秒前 发表 |
用于追踪和监视目标应用程序中的函数调用 | |
本站网友 电价调整 | 1分钟前 发表 |
`-i Get -i Registeratives`将仅包含名称中包含 Get 或 Registeratives 的 JI 方法 `-e <regex>`- 用于指定跟踪中应忽略的方法名称 | |
本站网友 sharesdk | 2分钟前 发表 |
灵活性:用户可以根据需要选择要追踪的函数 | |
本站网友 服装行业分析 | 0秒前 发表 |
并实时查看这些信息 | |
本站网友 蒲公英茶哪些人不宜喝 | 8分钟前 发表 |
function(code) { ct writer = new Arm64Writer(code | |
本站网友 水烟怎么抽 | 7分钟前 发表 |
- `-f` | |
本站网友 中国民企 | 25分钟前 发表 |
通过 Frida-Trace | |
本站网友 治疗便秘的偏方 | 12分钟前 发表 |
携带方便jnitracejnitrace-engine基于jnitrace | |
本站网友 广州肚皮舞培训学校 | 20分钟前 发表 |
`-e ^Find -e GetEnv`将从结果中排除所有以 Find 开头或包含 GetEnv 的 JI 方法名称 `-I <string>`- 用于指定应跟踪的库的导出 `-E <string>`用于指定不应跟踪的库的导出 `-o path/output.json`- 用于指定`jnitrace`存储所有跟踪数据的输出路径4. sktrace地址:.git这个类似 ida 指令 trace 功能 |