android frida检测绕过

Frida检测是一种常见的安卓逆向技术,常用于防止应用程序被反向工程。如果您遇到了Frida检测,您可以尝试以下方法来绕过它:

  1. 使用Magisk Hide模块:Magisk是一个强大的安卓root工具,它附带了一个Magisk Hide模块,可以帮助您隐藏root权限。这可以帮助您绕过Frida检测。

  2. 使用Xposed框架:Xposed框架可以帮助您实现一些高级的安卓逆向技术,包括绕过Frida检测。您可以使用Xposed模块来隐藏您的应用程序信息。

  3. 使用Frida Gadget:Frida Gadget是一个用于Frida检测的小型应用程序,可以帮助您绕过检测。将其与Frida一起使用,可以帮助您实现高级的安卓逆向技术。

 apk案例分析

在使用frida 附加时候发现进程退出,我们首先查看是在哪里结束进程的

function hook_dlopen() {
    Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"),
        {
            onEnter: function (args) {
                var pathptr = args[0];
                if (pathptr !== undefined && pathptr != null) {
                    var path = ptr(pathptr).readCString();
                    console.log("load " + path);
                }
            }
        }
    );
}

 通过 dlopen可以发现在模块libnative-lib.so 执行处进程结束

 分析模块libnative-lib.so,找关键位置

 有两处位退出进程位置函数 check_loop通过maps 内存中的关键字符串查找检测frida.

void __fastcall __noreturn check_loop(void *a1)
{
    for ( i = 0; ; ++i )
    {
        fd = open("/proc/self/maps", 0);
        if ( fd >= 1 )
        {
            while ( read(fd, buf, 0x200u) >= 1 )
            {
                v11 = buf;
                v10 = "frida";
                haystack = buf;
                needle = "frida";
                if ( strstr(buf, "frida") )
                {
                    v1 = getpid();
                    kill(v1, 9);
                }
                if ( sscanf(buf, "%x-%lx %4s %lx %*s %*s %s", &buf[516], &buf[512], &v5, &v4, s) == 5
            && v5 == 114
            && v6 == 112
            && !v4 )
                {
                    strlen(s);
                }
            }
        }
        close(fd);
        sleep(1u);
    }
}

 通过断点标记这两处进程退出位置方便后续返回查看

修改位置有两处,直接IDA keypath nop掉重打包,或这利用frida hook.下面用frida hook方式nop掉结束进程的两处关键点  

1.nop 掉0x9498处exit调用

 2.nop 掉0x92C2处kill

 实现代码如下

//指令输出
function dis(address, number) {
    for (var i = 0; i < number; i++) {
        var ins = Instruction.parse(address);
        console.log("address:" + address + "--dis:" + ins.toString());
        address = ins.next;
    }
}
/*call_function
 static void call_function(const char* function_name __unused,
                           linker_ctor_function_t function,
                           const char* realpath __unused       //加载的当前模块路径
) 
  }*/

function hook() {
    //call_function("DT_INIT", init_func_, get_realpath());
    var linkermodule = Process.getModuleByName("linker");
    var call_function_addr = null;
    var symbols = linkermodule.enumerateSymbols();
    for (var i = 0; i < symbols.length; i++) {
        var symbol = symbols[i];
        if (symbol.name.indexOf("__dl__ZL13call_functionPKcPFviPPcS2_ES0_") != -1) {
            call_function_addr = symbol.address;
        }
    }
    Interceptor.attach(call_function_addr, {
        onEnter: function (args) {
            var type = ptr(args[0]).readUtf8String();
            var address = args[1];
            var sopath = ptr(args[2]).readUtf8String();
            console.log("loadso:" + sopath + "--addr:" + address + "--type:" + type);
            if (sopath.indexOf("libnative-lib.so") != -1) {
                var libnativemodule = Process.getModuleByName("libnative-lib.so");
                var base = libnativemodule.base;

                //nop kill
                //    .text:000092BA                 B               loc_92BC
                //    .text:000092BC ; ---------------------------------------------------------------------------
                //    .text:000092BC
                //    .text:000092BC loc_92BC                                ; CODE XREF: check_loop(void *)+5E↑j
                //    .text:000092BC                 BLX             getpid
                //    .text:000092C0                 MOVS            R1, #9  ; sig
                //    .text:000092C2                 BLX             kill
                console.log("---------------- nop kill begin -------------")
                dis(base.add(0x92BA).add(1), 10);
               //方式一修改内存
               // Memory.protect(base.add(0x92C2), 4, 'rwx');
               // base.add(0x92C2).writeByteArray([0x00, 0xbf, 0x00, 0xbf]);
                //方式二修改内存
                var patchaddr=base.add(0x92C2);
                Memory.patchCode(patchaddr, 4, patchaddr => {
                    var cw = new ThumbWriter(patchaddr);
                    cw.putNop();
                    var cw = new ThumbWriter(patchaddr.add(0x2));
                    cw.putNop();
                    cw.flush();
                  });
                console.log("++++++++++++ nop kill end   +++++++++++++")
                dis(base.add(0x92BA).add(1), 10);
                // nop exit
                //   .text:0000948E                 CMP             R0, #0
                //   .text:00009490                 BEQ             loc_949C
                //   .text:00009492                 B               loc_9494
                //   .text:00009494 ; ---------------------------------------------------------------------------
                //   .text:00009494
                //   .text:00009494 loc_9494                          ; CODE XREF: anti_frida_loop(void)+26↑j
                //   .text:00009494                 MOV.W           R0, #0xFFFFFFFF ; status
                //   .text:00009498                 BLX             exit
                console.log("--------------- nop exit begin -------------")
                dis(base.add(0x948E).add(1), 10);  //keystone
                Memory.protect(base.add(0x9498), 4, 'rwx');
                base.add(0x9498).writeByteArray([0x00, 0xbf, 0x00, 0xbf]);
                console.log("+++++++++++++++ nop exit end   +++++++++++++")
                dis(base.add(0x948E).add(1), 10);
            }
        }
    })
}
function main(){
  hook();
}
setImmediate(main);

 总结:

绕过Frida检测的方法有很多种,以下是一些可能的方法:

1. 使用Frida Bypass插件:这是一款Frida插件,可以自动绕过Frida检测,并让Frida无法对应用程序进行监控。

2. 使用Frida Gadget库:这是一个动态Frida库,可以在运行时注入Frida,以避免被检测到。

3. 修改应用程序代码:通过修改应用程序代码,可以让Frida无法监控应用程序。

4. 使用防检测框架:有些防检测框架可以绕过Frida的检测,例如Xposed框架、VirtualXposed、Magisk等。

5. 使用其他工具:除了Frida,还有其他工具可以用来监控应用程序,例如Xposed、Cydia Substrate等。如果使用这些工具,Frida将无法监控应用程序。

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Frida是一款功能强大的开源工具,用于动态分析、调试和修改应用程序。它可以在不修改应用程序源代码的情况下,以细粒度的方式对应用程序进行调试和修改。Frida支持多种操作系统和架构,并且可以通过不同的传输协议与目标应用程序进行通信。 在Frida中,过端口检测是一种用于确定目标应用程序正在监听哪些端口的技术。通过过端口检测,我们可以查找应用程序正在使用的网络接口和服务,了解应用程序正在与哪些主机进行通信。 Frida使用了一种被称为“frida-trace”的命令行工具来实现端口检测功能。在使用该工具时,我们可以指定目标应用程序的名称或进程ID,并且可以过滤出我们感兴趣的特定端口。 通过以下步骤可以进行frida的过端口检测: 1. 安装Frida框架并设置环境变量。 2. 打开终端或命令提示符,输入命令“frida-trace -R <应用程序名称或进程ID>”并按下回车键。这将启动Frida-trace工具,并将其连接到目标应用程序。 3. 输入命令“<函数名称>@@<库名称>”来指定要追踪的函数和库。例如,如果我们要追踪应用程序中的“connect”函数,可以输入命令“connect@@libc.so”。 4. 按下回车键后,Frida-trace将开始追踪指定的函数,并显示与该函数相关的网络连接信息,包括本地IP地址、本地端口、远程IP地址和远程端口。 通过frida进行端口检测可以帮助我们深入了解应用程序的网络行为,发现可能存在的安全风险或潜在的漏洞。同时,它还可以用于调试网络通信问题和分析应用程序与服务器之间的通信协议。 需要注意的是,在进行端口检测时,我们应该遵守相关的法律法规,并且只在合法授权的范围内使用Frida工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值