android frida检测绕过

news2024/11/8 3:09:19

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将无法监控应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二阳大规模来袭,热图地图分析新冠疫情期间的高发地点,掌握防控重点!

一、概述 最近&#xff0c;新冠疫情似乎又要“卷土重来”... 身边逐渐有人传来“二阳”或者“三羊”的消息&#xff0c;网上相关的讨论和报道也变得越来越多。 据「钟南山院士」在大湾区科学论坛上的发言&#xff0c;预测模型seirs显示&#xff0c;第二波新冠疫情已于4月中旬开…

当数据汇聚成海,Excel 表成为我们的航海图,如何在茫茫数据中找到目标?——Excel 表中某个范围内的单元格遍历思路

本篇博客会讲解力扣“2194. Excel 表中某个范围内的单元格”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是输出示例和提示&#xff1a; 这道题的解题思路是&#xff1a;模拟&#xff0c;遍历每一列&#xff0c;某一列遍历完后遍历下一列。 下面我们需…

爆肝整理,性能测试-全链路压测与普通压测区别总结,进阶高级测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 抛出一个问题&…

Shell脚本:expect脚本免交互

Shell脚本&#xff1a;expect脚本免交互 expect脚本免交互 一、免交互基本概述&#xff1a;1.交互与免交互的区别&#xff1a;2.格式&#xff1a;3.通过read实现免交互&#xff1a;4.通过cat实现查看和重定向&#xff1a;5.变量替换&#xff1a; 二、expect安装&#xff1a;1.…

Docker Registry部署

之前执行 docker pull的命令都是从 docker hub上拉取的&#xff0c;是docker 公共仓库&#xff0c;如果在公司中使用docker&#xff0c;我们不可能把自己的镜像上传到公共仓库&#xff0c;这个时候就需要一个自己的仓库&#xff08;私有仓库&#xff09;&#xff0c;在局域网之…

usb 驱动

usb 驱动 usb 的基本概念 这个忽略&#xff0c; 基本上usb 是啥都知道 usb 的拓扑结构 usb 是一种主从结构的系统 usb主机由usb主控之器&#xff08;Host Controller)和根集线器&#xff08;Root Hub&#xff09; 构成 usb 主控制器&#xff1a; 主要负责数据处理(就是我…

微信怎么批量自动添加好友?

如何批量加客户资源到微信&#xff0c;怎么加微信好友&#xff0c;这个基本上熟悉的人都会知道。 实际上&#xff0c;你知道所有添加微信好友的方式吗&#xff1f;或者说&#xff0c;你知道如何批量加客户微信吗&#xff1f; 比如说在一定时间内&#xff0c;把你所有的客户资…

AIGC文本生成智能应用(ChatGPT)提示工程师技巧

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下AIGC文本生成智能提示工程师技巧。 当你在使用类似于ChatGPT这样的AIGC文本生成智能应用时&#xff0c;有没有想过&#xff0c;你所问的问题中的每一个词语对AIGC文本生成智能应用给你的回答的好…

记忆的助记器|如何使用联想记忆法

联想记忆法&#xff0c;也被称为记忆宫殿技术&#xff0c;已经使用了数千年&#xff0c;其记录可以追溯到古罗马和希腊。虽然现代第二大脑工具抢走了它的一些人气&#xff0c;但联想记忆法仍然是最有效的记忆方法之一。下面是你为什么需要在你的知识管理系统中使用它。 什么是…

比较快捷的设置第三方app 有系统权限和签名

1. app 里面添加 android:sharedUserId"android.uid.system" 2.编译出app.apk ,拷贝到源码目录 里面有很多签名文件 build\target\product\security 3. 拷贝签名工具到这个目录 签名工具原目录 out/host/linux-x86/framework/signapk.jar 4.拷贝需要的库文件到这…

Retry重试机制(五十)

当新的世界出现&#xff0c;请立即向他奔去 上一章简单介绍了Melody 监控(四十九), 如果没有看过,请观看上一章 本章节文章参考: https://juejin.cn/post/7234107489390116925 https://blog.csdn.net/hongyuan19/article/details/118995696 一. 重试 一.一 什么是重试 重…

身份证信息查看 案例

7-14位&#xff1a;出生年、月、日 17位&#xff1a;性别&#xff08;奇数男性、偶数女性&#xff09; 人物信息为&#xff1a;出生年月日&#xff1a;XXXX年X月X日 性别为&#xff1a;男/女 /** Copyright (c) 2017, 2023, zxy.cn All rights reserved.**/ package cn.str…

做了大半年软测,上班接触不到技术性的东西,是在浪费时间吗?

最近接到粉丝私信&#xff0c;苦恼目前的工作状态&#xff1a; 来这个公司大半年&#xff0c;现在主要做的是类似于淘宝的购物商城&#xff0c;以前也做应用系统什么的&#xff0c;可是感觉公司的软件测试岗位都是不着边的&#xff0c;因为做的都是功能测试&#xff0c;来了这么…

让你的文字更出色:编辑和校对的有效策略

要让你的文字更出色&#xff0c;掌握编辑和校对的有效策略至关重要。 以下是一些建议&#xff0c;帮助你提高编辑和校对水平&#xff0c;让你的作品更具吸引力和说服力。 1.分阶段进行编辑和校对 编辑和校对最好分阶段进行。先进行大局观的编辑&#xff0c;关注文章结构、逻辑…

Wildfly配置Datasources

配置Datasources前&#xff0c;需要先配置对应的JDBC驱动&#xff0c;配置方法&#xff0c;可以参考&#xff1a; Wildfly配置mysql8.0的JDBC驱动 之后&#xff0c;配置对应的Datasources。配置方法有两种&#xff0c;一种是通过管理后台配置&#xff0c;一种是通过手工修改配…

GLaDOS加速网络套餐edu教育网邮箱免费使用

产品介绍 教育优惠分享的好处&#xff0c;就是能一对一接触到网友的真实需求和最新的教育优惠产品&#xff0c;今天的这款也是网友投稿分享。 GLaDOS用于教育&#xff1a;建立开放思想和开放社会 GLaDOS Education可帮助学生&#xff0c;教师和学校找到他们掌握网络所需的工具…

【Python爬虫+数据分析】采集电商平台数据信息,并做可视化演示

文章目录 前言一、准备工作二、分析目标网站1.商品信息 三、编写爬虫程序五、总结 前言 随着电商平台的兴起&#xff0c;越来越多的人开始在网上购物。而对于电商平台来说&#xff0c;商品信息、价格、评论等数据是非常重要的。因此&#xff0c;抓取电商平台的商品信息、价格、…

虚拟机中使用Nginx + Keepalived 实现高可用 Web 负载均衡笔记

环境介绍 物理操作系统&#xff1a;Windows10 虚拟机软件&#xff1a;VMWare Workstation 16 Pro 虚拟操作系统统&#xff1a;CentOS7 Nginx&#xff1a;1.24.0 Keepalived&#xff1a;2.2.8 资源规划 在VMWare Worksattion中安装了2台CentOS7的虚拟机&#xff0c;桥接方式下…

ROS:常用可视化工具的使用

目录 一、日志输出工具——rqt_console二、绘制数据曲线——rqt_plot三、图像渲染工具——rqt_image_view四、图形界面总接口——rqt五、Rviz六、Gazebo 一、日志输出工具——rqt_console 启动海龟键盘控制节点&#xff0c;打开日志输出工具 roscorerosrun turtlesim turtles…

项目资源利用率是什么?如何提高?

任何项目经理的主要职责之一是跟踪项目资源&#xff0c;以便在需要时随时可用。为此&#xff0c;他们必须衡量资源利用率。通过计算资源利用率&#xff0c;项目经理和企业主可以更好地了解如何安排劳动力或设备等资源&#xff0c;以尽量降低成本&#xff0c;提高生产力&#xf…