作者论坛账号:正己
这是面向 0基础 新手入门 的视频动画教程,后面一大段文字只是视频讲解课件,直接拉到底部点击“阅读原文”观看视频,手把手教学,入门建议从第一课学起,持续更新中。
由吾爱破解论坛移动安全区版主 正己录制的吾爱破解安卓逆向 0基础 新手小白 视频教程《安卓逆向这档事》正式上线啦,如果你想学习安卓逆向,这是一个不错的机会呦!
吾爱破解安卓逆向入门教程《安卓逆向这档事》十五、是时候学习一下Frida一把梭了(下)
PS:感谢北京金诚同达(沈阳)律师事务所-黄律师一直无偿帮我解疑
1.了解Frida-Native-Hook读写、主动调用
2.了解常见的frida_trace工具
3.了解控制流混淆对抗新思路
1.教程Demo(更新)
2.jadx-gui
3.VS Code
4.jeb
复制代码 隐藏代码//一般写在app的私有目录里,不然会报错:failed to open file (Permission denied)(实际上就是权限不足)
var file_path = "/data/user/0/com.zj.wuaipojie/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?
Inline hook(内联钩子)是一种在程序运行时修改函数执行流程的技术。它通过修改函数的原始代码,将目标函数的执行路径重定向到自定义的代码段,从而实现对目标函数的拦截和修改。
简单来说就是可以对任意地址的指令进行hook读写操作
常见inlinehook框架:
Android-Inline-Hook
whale
Dobby
substrate
PS:Frida的inlinehook不是太稳定,崩溃是基操,另外新版的frida兼容性会比较好
复制代码 隐藏代码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) {
console.log(this.context.x22); //注意此时就没有args概念了
this.context.x22 = ptr(1); //赋值方法参考上一节课
},
onLeave: function (retval) {
}
}
)
})
}
}
将地址的指令解析成汇编
复制代码 隐藏代码var soAddr = Module.findBaseAddress("lib52pojie.so");
var codeAddr = Instruction.parse(soAddr.add(0x10428));
console.log(codeAddr.toString());
Frida Api
arm转hex
复制代码 隐藏代码var soAddr = Module.findBaseAddress("lib52pojie.so");
var codeAddr = soAddr.add(0x10428);
Memory.patchCode(codeAddr, 4, function(code) {
const writer = new Arm64Writer(code, { pc: codeAddr });
writer.putBytes(hexToBytes("20008052"));
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;
}
nativefunction
数据类型 | 描述 |
---|---|
void | 无返回值 |
pointer | 指针 |
int | 整数 |
long | 长整数 |
char | 字符 |
float | 浮点数 |
double | 双精度浮点数 |
bool | 布尔值 |
复制代码 隐藏代码var funcAddr = Module.findBaseAddress("lib52pojie.so").add(0x1054C);
//声明函数指针
//NativeFunction的第一个参数是地址,第二个参数是返回值类型,第三个[]里的是传入的参数类型(有几个就填几个)
var aesAddr = new NativeFunction(funcAddr , 'pointer', ['pointer', 'pointer']);
var encry_text = Memory.allocUtf8String("OOmGYpk6s0qPSXEPp4X31g=="); //开辟一个指针存放字符串
var key = Memory.allocUtf8String('wuaipojie0123456');
console.log(aesAddr(encry_text ,key).readCString());
jni的主动调用
参考java的主动调用,简单快捷
工具名称 | 描述 | 链接 |
---|---|---|
jnitrace | 老牌,经典,信息全,携带方便 | jnitrace |
jnitrace-engine | 基于jnitrace,可定制化 | jnitrace-engine |
jtrace | 定制方便,信息全面,直接在_agent.js或者_agent_stable.js 里面加自己的逻辑就行 | jtrace |
hook_art.js | 可提供jni trace,可以灵活的增加你需要hook的函数 | hook_art.js |
JNI-Frida-Hook | 函数名已定义,方便定位 | JNI-Frida-Hook |
findhash | ida插件,可用于检测加解密函数,也可作为Native Trace库 | findhash |
Stalker | frida官方提供的代码跟踪引擎,可以在Native层方法级别,块级别,指令级别实现代码修改,代码跟踪 | Stalker |
sktrace | 类似 ida 指令 trace 功能 | sktrace |
frida-qbdi-tracer | 速度比frida stalker快,免补环境 | frida-qbdi-tracer |
PS:这次介绍的几款工具都是基础用法,更深入的还需要大家去看看源码学习
官方文档
frida-trace 可以一次性监控一堆函数地址。还能打印出比较漂亮的树状图,不仅可以显示调用流程,还能显示调用层次。并且贴心的把不同线程调用结果用不同的颜色区分开了。
大佬整理的文档:
frida-trace
复制代码 隐藏代码D:\> frida-trace.exe --help
用法: frida-trace [options] target位置参数:
args extra arguments and/or target选项:
-h, --help 显示帮助
-D ID, --device ID 通过 ID 连接设备
-U, --usb 通过 USB 连接设备
-R, --remote 连接到远程 frida-server
-H HOST, --host HOST 连接到远程 host 上的 frida-server
--certificate 证书 设置证书,通过 TSL 与 host 交互
--origin ORIGIN 设置连接到远程服务的 "Origin" 头部
--token TOKEN 设置 与host 认证
--keepalive-interval 时间间隔。0表示禁用,-1表示基于传输自动选择
--p2p 建立一个点对点的连接
--stun-server ADDRESS 设置--p2p 的 STUN 服务地址
--relay address,username,password,turn-{udp,tcp,tls} 添加--p2p 延迟
-f TARGET, --file TARGET spawn 模式
-F, --attach-frontmost 附加到最前端的 application
-n NAME, --attach-name NAME 附加到一个名字
-N IDENTIFIER, --attach-identifier IDENTIFIER 附加到标识符
-p PID, --attach-pid PID 附加到 pid
-W PATTERN, --await PATTERN
await spawn matching PATTERN
--stdio {inherit,pipe}
stdio behavior when spawning (defaults to “inherit”)
--aux option set aux option when spawning, such as “uid=(int)42” (supported types are:
string, bool, int)
--realm {native,emulated} 附件的范围
--runtime {qjs,v8} 使用的脚本运行环境
--debug 启用 Node.js 兼容的脚本调试器
--squelch-crash 如果启用,将不会将崩溃报告转储到控制台
-O FILE, --options-file FILE 将信息保存到文件中
--version 显示版本号
-i
/ -a
: 跟踪 C 函数或 so 库中的函数。
PS:-a 包含模块+偏移跟踪,一般用于追踪未导出函数,例子:-a "lib52pojie.so!0x4793c"
包含/排除模块或函数:
-I
: 包含指定模块。
-X
: 排除指定模块。
Java 方法跟踪:
-j JAVA_METHOD
: 包含 Java 方法。
-J JAVA_METHOD
: 排除 Java 方法。
附加方式:
-f
:通过 spwan 方式启动
-F
:通过 attach 方式附加当前进程
日志输出:-o
:日志输出到文件
复制代码 隐藏代码使用案例:
frida-trace -U -F -I "lib52pojie.so" -i "Java_" #附加当前进程并追踪lib52pojie.so里的所有Java_开头的jni导出函数
前提
复制代码 隐藏代码pip install jnitrace==3.3.0
使用方法
复制代码 隐藏代码jnitrace -m attach -l lib52pojie.so com.zj.wuaipojie -o trace.json //attach模式附加52pojie.so并输出日志
-l libnative-lib.so
- 用于指定要跟踪的库-m <spawn|attach>
- 用于指定要使用的 Frida 附加机制-i <regex>
- 用于指定应跟踪的方法名称,例如,-i Get -i RegisterNatives
将仅包含名称中包含 Get 或 RegisterNatives 的 JNI 方法-e <regex>
- 用于指定跟踪中应忽略的方法名称,例如,-e ^Find -e GetEnv
将从结果中排除所有以 Find 开头或包含 GetEnv 的 JNI 方法名称-I <string>
- 用于指定应跟踪的库的导出-E <string>
用于指定不应跟踪的库的导出-o path/output.json
- 用于指定jnitrace
存储所有跟踪数据的输出路径
复制代码 隐藏代码python sktrace.py -m attach -l lib52pojie.so -i 0x103B4 com.zj.wuaipojie
细品sec2023安卓赛题
JEB Decompiler 5.5.0.202311022109 mod by CXV
PS:注意jdk的版本要高于17,不然打不开
下载地址
恐怖如斯的效果对比图:
PS:珍惜表哥说dexlib2也能混淆对抗,效果比jeb的还强大
待更新
Trace大盘点
[原创]frida-qbdi-tracer
优化jnitrace以及增强信息打印
jnitrace、frida-trace、Stalker、sktrace、Frida Native Trace、r0tracer、strace、IDA trace、Unidbg Trace
Frida Stalker - Tracing binary instructions
frida hook so层方法大全
Inline HOOK
点击左下角“阅读原文”,进入 B站 在线观看视频教程,欢迎一键三连转发~
-官方论坛
www.52pojie.cn
👆👆👆