声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
字数 856,阅读大约需 5 分钟
前言
-
• Challenge 0x8 native层hook。
Challenge 0x8
APP说明
通过在native层hook 函数,打印它的传入参数,得到flag。
反编译查看需要输入什么
反编译与分析
String ip
中。判断ip值是否正确是来自native层的方法cmpstr。public native int cmpstr(String str);
static {
System.loadLibrary("frida0x8");
}
-
• System.loadLibrary("frida0x8"); -
• 加载so文件,文件名为lib + frida0x8 + .so -
• 如果Java层需要调用so中的函数,就需要将so加载到内存中。
Challenge 0x8.apk
,进入lib/arm64-v8a,具体选择哪个架构的so文件,取决于Android机的架构。
package com.ad2001.frida0x8;
public native int cmpstr(String str);
对应的native层的方法名
Java_com_ad2001_frida0x8_MainActivity_cmpstr
Java + 包名 + 类名 + 方法名,中间用下划线
_
隔开Java层的cmpstr只接受一个参数,但在native层却接受三个。
第三个参数是我们传入的str,前两个参数是默认的,一般是
JNIEnv *env
jobject thiz
光标移动到参数上,
快捷键y
修改变量类型
快捷键n
修改变量名
IDA常见快捷键这里不做赘述。
因为有打印结果,结果特征值是Password
查看log日志
adb logcat | findstr Password
在实际测试APP的过程中,有时候也会遇到日志打印请求和响应包,打印请求体和返回值的。
开发人员为了方便自测试,就可能在开发过程中打印相关信息,便于调试。到了封板的时候,忘记将相关log打印移除。我们就可以从中直接获取请求响应的相关信息,便于构造数据包。对我们定位发包位置、加解密函数都有帮助。
所以,如果遇到APP存在抓包检测的时候,看看它的日志,没准有意外收获。
除此之外,我们还有别的办法。
比如打印strcmp
的传入参数。
frida脚本
进入到了native层,我们的绝大部分的hook操作都需要函数地址。
代码如下:
functionhook_strcmp_64() {
// 通过函数名称寻找导出函数的地址,寻找libc.so中的函数strcmp地址,如果找不到返回null
var strcmp = Module.findExportByName("libc.so", "strcmp");
if (strcmp) {
// 通过找到的strcmp地址,hook
// 参数1:需要hook的函数地址
// 参数2:callbacks,即回调函数。其中onEnter是函数执行前,传入参数是strcmp的传参,以数组形式保存在args中;onLeave是函数执行完毕,传入参数是返回值
// onEnter,除非其中有具体的停止或者跳出操作,不然不影响原函数的正常执行
Interceptor.attach(strcmp, {
onEnter: function (args) {
// 打印参数
var str1 = Memory.readCString(args[0]);
var str2 = Memory.readCString(args[1]);
if (str1.includes("frida0x8")) {
console.log("nstrcmp called:");
console.log("str1:", str1);
console.log("str2:", str2);
// 保存参数以便在onLeave中使用
this.str1 = str1;
this.str2 = str2;
}
},
onLeave: function (retval) {
// 打印返回值
}
});
console.log("[+] strcmp hooked (64-bit)");
} else {
console.log("[-] strcmp not found in libc.so (64-bit)");
}
}
functionhook_native_method() {
hook_strcmp_64()
}
setImmediate(hook_native_method)
// frida -U -f com.ad2001.frida0x8 -l main.js
因为strcmp调用很多,全部打印app可以崩溃,所以我们打印参数存在特定字符frida0x8
的strcmp函数的传入参数。
参考资料
-
• frida监听内存读写 https://blog.csdn.net/weixin_56039202/article/details/127041865 -
• Frida Javascript api #Memory 与 #MemoryAccessMonitor (中文版) https://www.jianshu.com/p/c767822ca1f6
欢迎关注公众号~~~
原文始发于微信公众号(进击的HACK):frida native层hook函数 0x06
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论