frida native层hook函数 0x06

admin 2025年6月10日02:08:33评论23 views字数 2543阅读8分28秒阅读模式
frida native层hook函数 0x06

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢

文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。

frida native层hook函数 0x06

字数 856,阅读大约需 5 分钟

前言

  • • Challenge 0x8 native层hook。

Challenge 0x8

APP说明

通过在native层hook 函数,打印它的传入参数,得到flag。

frida native层hook函数 0x06
f867b9f573d7a41db28612c7ba28adc3.png

反编译查看需要输入什么

反编译与分析

我们在界面输入的内容,最终会赋值给String ip中。判断ip值是否正确是来自native层的方法cmpstr。
frida native层hook函数 0x06
b8102573cc558032e45db58de69ae12f.png
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,
frida native层hook函数 0x06
e96d2a2a5476ba50711d5ca058a980eb.png

具体选择哪个架构的so文件,取决于Android机的架构。

package com.ad2001.frida0x8;

public native int cmpstr(String str);

对应的native层的方法名

Java_com_ad2001_frida0x8_MainActivity_cmpstr
解释:
Java + 包名 + 类名 + 方法名,中间用下划线_隔开
frida native层hook函数 0x06
92308da34b8a55085fa961d380972d69.png

Java层的cmpstr只接受一个参数,但在native层却接受三个。
第三个参数是我们传入的str,前两个参数是默认的,一般是

JNIEnv *env 
jobject thiz

光标移动到参数上,
快捷键y修改变量类型
快捷键n修改变量名

IDA常见快捷键这里不做赘述。

frida native层hook函数 0x06
f75ba3230ecc52bf1bc2ec341bbd575e.png

因为有打印结果,结果特征值是Password
查看log日志

adb logcat | findstr Password
成功获取flag
frida native层hook函数 0x06
61cb894d02125c47dbfef2f024a5fd70.png

在实际测试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, {
onEnterfunction (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;
                }
            },
onLeavefunction (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 native层hook函数 0x06
2cec982e931e7822c2d381685b53d101.png

参考资料

  • • 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

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月10日02:08:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   frida native层hook函数 0x06https://cn-sec.com/archives/4148241.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息