1.了解Frida-Native-Hook读写、主动调用
2.了解常见的frida_trace工具
3.了解控制流混淆对抗新思路
1.教程Demo(更新)
2.jadx-gui
3.VS Code
4.jeb
什么是inlinehook?
Inline hook(内联钩子)是一种在程序运行时修改函数执行流程的技术。它通过修改函数的原始代码,将目标函数的执行路径重定向到自定义的代码段,从而实现对目标函数的拦截和修改。
简单来说就是可以对任意地址的指令进行hook读写操作
常见inlinehook框架:
Android-Inline-Hook
whale
Dobby
substrate
PS:Frida的inlinehook不是太稳定,崩溃是基操,另外新版的frida兼容性会比较好
nativefunction
jni的主动调用
参考java的主动调用,简单快捷
官方文档
frida-trace 可以一次性监控一堆函数地址。还能打印出比较漂亮的树状图,不仅可以显示调用流程,还能显示调用层次。并且贴心的把不同线程调用结果用不同的颜色区分开了。
大佬整理的文档:
frida-trace
包含/排除模块或函数:
Java 方法跟踪:
附加方式:
日志输出:
-o
:日志输出到文件
前提
使用方法
-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
存储所有跟踪数据的输出路径
细品sec2023安卓赛题
JEB Decompiler 5.5.0.202311022109 mod by CXV
PS:注意jdk的版本要高于17,不然打不开
下载地址
恐怖如斯的效果对比图:
PS:珍惜表哥说dexlib2也能混淆对抗,效果比jeb的还强大
百度云
阿里云
哔哩哔哩
教程开源地址
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压
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
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();
}
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();
}
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);
this
.context.x22 = ptr(1);
},
onLeave:
function
(retval) {
}
}
)
})
}
}
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);
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());
var
soAddr = Module.findBaseAddress(
"lib52pojie.so"
);
var
codeAddr = Instruction.parse(soAddr.add(0x10428));
console.log(codeAddr.toString());
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;
}
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;
}
数据类型 |
描述 |
void |
无返回值 |
pointer |
指针 |
int |
整数 |
long |
长整数 |
char |
字符 |
float |
浮点数 |
double |
双精度浮点数 |
bool |
布尔值 |
var
funcAddr = Module.findBaseAddress(
"lib52pojie.so"
).add(0x1054C);
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());
var
funcAddr = Module.findBaseAddress(
"lib52pojie.so"
).add(0x1054C);
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!