bangbang加固某银行APP,Frida强检测。

1、什么是 Frida 检测?

Frida 检测是指目标应用通过特定的技术手段,检查自身是否被 Frida 工具附加(attached)或注入了脚本。这种检测通常出现在需要保护知识产权、防止作弊或避免敏感数据泄露的应用中,例如:游戏防作弊、移动支付应用的安全防护、银行或金融类应用的安全保障。如果检测到 Frida 的存在,应用可能会采取以下措施:终止运行、上报异常行为、屏蔽某些功能

2、尝试注入frida

APP:dGFpemhvdXlpbmhhbmc=

版本:3.0.0.5

frida版本:官网frida16.5.2

2.1首先改一下frida端口,狐妖面具配置一下MagiskHider,排除下root检测以及端口检测后注入,发现直接闪退。

在这里插入图片描述

2.2 使用mt管理器查看下是哪个加固

确定是bangbnag
在这里插入图片描述

2.3 看一下加载了打开了哪些第三方so文件

function hook_dlopen(){
    //Android8.0之后加载so通过android_dlopen_ext函数
    var android_dlopen_ext = Module.findExportByName(null,"android_dlopen_ext");
    console.log("addr_android_dlopen_ext",android_dlopen_ext);
    Interceptor.attach(android_dlopen_ext,{
        onEnter:function(args){
            var pathptr = args[0];
            if(pathptr!=null && pathptr != undefined){
                var path = ptr(pathptr).readCString();
                console.log("android_dlopen_ext:",path);
            }
        },
        onLeave:function(retvel){
        }
    })
}
hook_dlopen()
function create_pthread_create() {
    const pthread_create_addr = Module.findExportByName(null, "pthread_create")
    const pthread_create = new NativeFunction(pthread_create_addr, "int", ["pointer", "pointer", "pointer", "pointer"]);
    return new NativeCallback((parg0, parg1, parg2, parg3) => {
        const module = Process.findModuleByAddress(parg2);
        const so_name = module.name;
        const baseAddr = module.base
        console.log("pthread_create", so_name, "0x" + parg2.sub(baseAddr).toString(16), "0x" + parg3.toString(16))
        // 成功的返回值是0
        return pthread_create(parg0, parg1, parg2, parg3)
    }, "int", ["pointer", "pointer", "pointer", "pointer"])
}


// 或者
function replace_thread() {
    var new_pthread_create = create_pthread_create()
    var pthread_create_addr = Module.findExportByName(null, "pthread_create")
    // 函数替换
    Interceptor.replace(pthread_create_addr, new_pthread_create);
}

replace_thread()

加载完libDexHelper.so直接闪退说明这里有问题
在这里插入图片描述
查看下libDexHelper.so的JNI_OnLoad是否加载完成

const module = Process.findModuleByName('libDexHelper.so');
const JNI_OnLoad = module.findExportByName("JNI_OnLoad");
Interceptor.attach(JNI_OnLoad, {
    onEnter: function () {
        console.log('进来')
    },
    onLeave: function () {
        console.log('离开')
    }

})

发现并没有加载完成,说明监测点大概率在JNI_OnLoad
在这里插入图片描述

3 、使用Stalker trace

3.1 使用ida64反汇编一下libDexHelper.so,发现搜不到,但是我们hook又加载了,所以应该是有壳,用一下yang神大佬的工具dump一下。

https://github.com/lasting-yang/frida_dump

在这里插入图片描述

这里也是成功dump下来
在这里插入图片描述
再次搜索,可以搜索到。这里取一下JNI_OnLoad函数开始地址以及函数结束地址
在这里插入图片描述

3 、Stalker trace 执行了哪些汇编指令

Interceptor.attach(JNI_OnLoad, {
     onEnter: function () {
         const threadId = Process.getCurrentThreadId();
         const base = module.base;
         const startBase = JNI_OnLoad;
         const size = 开始地址- 结束地址;
         Stalker.follow(threadId, {
             transform: function (iterator) {
                 let instruction = iterator.next();
                 const baseFirstAddress = instruction.address;
                 const isModuleCode = baseFirstAddress.compare(startBase) >= 0 &&
                     baseFirstAddress.compare(startBase.add(size)) <= 0;
                 if (isModuleCode) {
                     if (module) {
                         const name = "libDexHelper.so";
                         const offset = baseFirstAddress.sub(base);
                         console.log(`[transform] start: ${baseFirstAddress} name:${name} offset: ${offset} base: ${base}`);
                     } else {
                         console.log(`[transform] start: ${baseFirstAddress}`);
                     }
                 }
                 do {
                     const curRealAddr = instruction.address;
                     const curOffset = curRealAddr.sub(baseFirstAddress);
                     const curOffsetInt = curOffset.toInt32()
                     const instructionStr = instruction.toString()
                     if (isModuleCode) {

                         console.log("\t" + curRealAddr + " <+" + curOffsetInt + ">: " + instructionStr);
                     }
                     iterator.keep();
                 } while ((instruction = iterator.next()) !== null);
                 if (isModuleCode) {
                     console.log()
                 }
             }
         })
     },
     onLeave: function () {
         console.log("成功结束")
     }
 })

在这里插入图片描述
最后一个代码块执行到0x31a3c,最后一个指令是 0x73ac687af0 <+180>: bl #0x73ac68494c,打开ida看一下,这里是一个函数的开头,看一下这个函数做了什么,再次使用Stalker,改一下0x31a3c函数起始位置以及0x31a3c函数结束位置,再次执行
在这里插入图片描述
这里执行到了0x32a48这个代码块,最后通过br指令跳转到x11寄存器存储的内存地址继续执行代码。这段指令将立即数 0x10DC 装载到寄存器 W11 中。由于没有后续指令修改 X11 的值,可以推断 X11 的值为 0x10DC。
在这里插入图片描述
通过ida查看这段地址,发现是一段死代码,返回去看一下C
在这里插入图片描述
通过检测libc.so来检测,如果有frida特征返回1,然后通过JUMPOUT跳转到死代码,这样就好办了,我们直接修改sub_4B2E0(*v71, “libc.so”, format);的返回值为0就可以了
在这里插入图片描述

Interceptor.attach(base.add(0x4B2E0),{
    onLeave:function (retval){
        retval.replace(ptr(0));
    }
})

这里libDexHelper.so成功加载并结束,app,frida api正常使用
在这里插入图片描述

完结撒花!

<think>好的,用户想了解如何用Frida绕过小红书的安全检测。首先,我需要回忆一下Frida的基本原理。Frida是一个动态插桩工具,允许用户注入JavaScript代码到目标进程中,从而监控或修改应用的行为。不过,小红书这类应用通常会有反调试机制,比如检测Frida的存在。 根据用户提供的引用[1],检测Frida的一种方法是通过检查/proc/self/fd和/proc/self/task/pid/fd下的文件,寻找与Frida相关的文件。所以,绕过这种检测可能需要隐藏这些文件痕迹,或者修改Frida的默认配置,比如改变端口号,避免使用默认的27042端口。 接下来,引用[2]提到小红书可能使用了libtiny.so和libxyass.so这样的混淆库来处理一些请求头参数,比如x-mini-sig和shield。这意味着可能需要用Unidbg这样的工具来模拟执行这些so文件,或者通过动态分析来绕过混淆。用户可能需要学习Unidbg来应对控制流混淆的问题。 用户可能需要具体的步骤,比如如何配置Frida避免被检测,如何Hook关键函数来绕过签名验证。例如,Hook与请求头生成相关的函数,替换或绕过shield参数的生成过程。此外,还需要注意时间戳相关的头信息,如x-b3-traceid,可能需要动态生成正确的值。 同时,需要考虑小红书的检测机制是否还有其他层面,如环境检测(root、模拟器)、SSL Pinning等。用户可能需要结合多种工具,比如Xposed模块配合使用,或者使用r2frida进行更底层的分析。 最后,要提醒用户注意法律风险,逆向工程可能违反用户协议,需谨慎操作。需要确保回答中提到的步骤合法,并调仅供学习研究之用。</think>关于Frida工具在小红书应用中的安全检测绕过方法,需结合应用防护机制及动态调试技术进行分析。以下是关键步骤和注意事项: ### 一、Frida检测规避基础 1. **默认端口修改** 小红书的防护系统会监控默认的Frida服务端口$27042$。建议使用非标准端口启动: ```bash frida-server -l 0.0.0.0:8080 ``` 通过修改`adb forward`转发规则建立连接[^1]。 2. **特征文件隐藏** 使用`readlink`检查文件描述符时需规避特征: ```python Interceptor.attach(Module.findExportByName("libc.so", "readlink"), { onLeave: function(retval) { const path = retval.readCString(); if(path.includes("frida")) { retval.writeUtf8String("/dev/null"); } } }); ``` ### 二、核心防护机制分析 小红书使用的防护体系包含: 1. **动态签名验证** 在`libtiny.so`中实现请求头$x-mini-sig$的动态生成,该库采用控制流平坦化混淆技术。可通过Hook`JNI_OnLoad`函数定位关键算法: ```javascript Java.perform(function() { const System = Java.use('java.lang.System'); System.currentTimeMillis.implementation = function() { return 1234567890; // 固定时间戳绕过时间校验 }; }); ``` 2. **设备指纹绑定** `libxyass.so`负责生成$x-legacy-did$等设备指纹参数。需Hook`__system_property_get`函数修改设备特征值: ```javascript Interceptor.attach(Module.findExportByName("libc.so", "__system_property_get"), { onEnter: function(args) { this.propName = Memory.readCString(args[0]); }, onLeave: function(retval) { if(this.propName === "ro.serialno") { Memory.writeUtf8String(retval, "custom_serial"); } } }); ``` ### 三、高级对抗技术 1. **内存特征擦除** 针对Frida线程特征进行内存扫描防护: ```javascript const pthread_create = Module.findExportByName("libc.so", "pthread_create"); Interceptor.attach(pthread_create, { onEnter: function(args) { const threadName = Memory.readCString(args[3]); if(threadName.indexOf("gum-js-loop") !== -1) { args[3].writeUtf8String("app_worker_thread"); } } }); ``` 2. **SSL Pinning绕过** 结合JustTrustMe模块与自定义证书锁定解除: ```javascript SSL_CTX_set_cert_verify_callback.implementation = function(ctx, callback) { return 1; // 制返回验证成功 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值