安卓这档事08

Frida写数据

1
2
3
4
5
6
7
8
//一般写在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(); //关闭
}

Frida_inlineHook与读写汇编

Inline hook(内联钩子)是一种在程序运行时修改函数执行流程的技术。它通过修改函数的原始代码,将目标函数的执行路径重定向到自定义的代码段,从而实现对目标函数的拦截和修改。

简单来说就是可以对任意地址的指令进行hook读写操作

常见inlinehook框架: Android-Inline-Hook whale Dobby substrate

找个时间看看(

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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) {
}
}
)
})
}
}

上面这个是将运行到指定地址,然后再修改寄存器:

image-20240325213431747

因为是onEnter,所以是运行到这一行,然后把W22修改成1

将目标地址的汇编解析成指令

1
2
3
var soAddr = Module.findBaseAddress("lib52pojie.so");
var codeAddr = Instruction.parse(soAddr.add(0x10428));
console.log(codeAddr.toString());

使用Frida提供的Instruction库

在目标地址覆写汇编指令

有个用于将ARM汇编转为16进制数据的网站

1
2
3
4
5
6
7
8
9
10
11
12
function hookTest2(){
var soAddr = Module.findBaseAddress("lib52pojie.so");
var codeAddr = soAddr.add(0x10428);
Memory.patchCode(codeAddr,4,function(code){
const writer = new Arm64Writer(code,{pc:codeAddr});
var res = hexToBytes("20008052");//这个是arm指令转的16进制字符串
console.log(res);
writer.putBytes(res);
writer.flush();
}
);
}

普通Native函数的主动调用

数据类型 描述
void 无返回值
pointer 指针
int 整数
long 长整数
char 字符
float 浮点数
double 双精度浮点数
bool 布尔值
1
2
3
4
5
6
7
8
9
function hookTest2(){
// jni主动调用:
var soAddr = Module.findBaseAddress("lib52pojie.so")
var funAddr = soAddr.add(0x0000e85c); // char* AES_ECB_PKCS7_Decrypt(char* arg1, char* arg2)
var AESAddr = new NativeFunction(funAddr, 'pointer', ['pointer', 'pointer'])
var encTxt = Memory.allocUtf8String("OOmGYpk6s0qPSXEPp4X31g==")
var key = Memory.allocUtf8String("wuaipojie0123456")
console.log(AESAddr(encTxt, key).readCString())
}

常见的Trace工具

工具名称 描述 链接
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

有空看Stalker

frida-trace

官网文档

官网代码

frida-trace去hook调试的目标的写法,是和frida是一样的

命令例子:

1
2
frida-trace.exe -U -F -I "lib52pojie.so" -i "Java_"  
#附加当前进程并追踪lib52pojie.so里的所有Java_开头的jni导出函数

-U -F和frida是一样的,这里不再解释

  • -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:日志输出到文件