基于frida检测demo来学习frida检测及anti

原文地址:https://www.zhuoyue360.com/crack/108.html

image.png

前言

随着逆向的攻防强度不断的提升,目前主流的移动安全厂商的加固服务基本上都已包含了常见Hook框架的反调试,我们最常见的hook工具如下:

  1. frida
  2. xposed

为了更好的提升自己相关的经验,我们可以拿这类demo来进行原理的学习.

分析

demo应用在未启动frida的情况下,点击点我按钮发现. 亮了一个frida-agent路径.我们可以反编译该应用去看看它如何检测的.
image.png

1. frida-agent路径

根据它的代码可以看到,该检测案例是通过判断下面两个条件,只要满足以下两个其中之一,则判定frida存在.

  1. /data/local/tmp/re.frida.server/frida-agent-64.so路径的内容是否存在
  2. /data/local/tmp/re.frida.server/frida-agent.so路径的文件是否存在
    public static boolean a() {boolean z = new File("/data/local/tmp/re.frida.server/frida-agent-64.so").exists() || new File("/data/local/tmp/re.frida.server/frida-agent.so").exists();if (z) {Log.e("Ming-CheckFrida", "/data/local/tmp/re.frida.server/frida-agent-64.so中发现Frida特征");}return z;}

看了下,我们的确存在这些应用.我们删除一下看看.
image.png
re.frida.server目录删除就可以了. 当然,这种方法并不好. 我们可以尝试Hook一下 File,把入参包含frida-agent的fileName给他一个不存在的值,即可绕过该检测. 可以看到已经成功的绕过了frida-agent检测项.
image.pngimage.png

let _File = Java.use("java.io.File");
_File.$init.overload("java.lang.String").implementation = function(fileName){var f = '';if (fileName.indexOf("frida-agent") > -1){f = "/sdcard/fuck_frida";}else{f= fileName}console.log("fileName ->" + f,f.indexOf("frida-agent"))return this.$init(f);}

2.TCP检测

根据下面的代码片段,有点基础的读者应该不难看出.它是在检测端口69a2,69a2端口是十六进制的表示,那么其十进制的表示是27042端口.

this.t = (Switch) findViewById(R.id.switchTcp);
this.t.setChecked(false);
String a2 = CheckFrida.a("/proc/net/tcp6");
String a3 = CheckFrida.a("/proc/net/tcp");
if (a2 == null || ClockFaceView.VALUE_PLACEHOLDER.equals(a2)) {z2 = false;
} else {z2 = false;for (String str : a2.split("\n")) {if (str.toLowerCase().contains(":69a2")) {Log.e("Ming-CheckFrida", "tcp文件中发现Frida特征");z2 = true;}}
}
if (a3 != null && !ClockFaceView.VALUE_PLACEHOLDER.equals(a3)) {for (String str2 : a3.split("\n")) {if (str2.toLowerCase().contains(":69a2")) {Log.e("Ming-CheckFrida", "tcp文件中发现Frida特征");z2 = true;}}
}
public static String a(String str) {try {FileInputStream fileInputStream = new FileInputStream(str);byte[] bArr = new byte[RecyclerView.c0.FLAG_ADAPTER_FULLUPDATE];String str2 = ClockFaceView.VALUE_PLACEHOLDER;for (int read = fileInputStream.read(bArr); read > 0; read = fileInputStream.read(bArr)) {str2 = str2 + new String(bArr, 0, read);}fileInputStream.close();return str2;} catch (IOException e) {e.printStackTrace();return ClockFaceView.VALUE_PLACEHOLDER;}
}

image.png

那么我们该如何做呢? 看到上面的方法a可以看出,它是以读文件的方式进行检测的. 此时我们应该以自定义端口的方式进行frida的启动及Hook.

frida-server启动命令:
./frida-server-16.0.2-android-arm64 -l 0.0.0.0:7777
frida hook 自定义端口命令
frida -H 192.168.123.85:7777 -F -l .\hook_frida_check.js

再来看看效果,Wow!! 看来这不只是解决了TCP检测项,我们还顺手的解决了Native-端口检测. 其原理都是一样的.就是看看27042端口是否打开,咱们从本质上去解决就好啦!
image.png

3.map文件

根据下面代码,我们可以看到.它是通过读取文件/proc/self/maps的内容是否包含frida字眼进行检测的.

this.t = (Switch) findViewById(R.id.switchJMap);
this.t.setChecked(false);
if (CheckFrida.a("/proc/self/maps").contains("frida")) {Log.e("Ming-CheckFrida", "/proc/self/maps发现Frida特征");z = true;
} else {z = false;
}

我们其实可以复用我们上面的脚本,当文件名称为maps的时候,我们传入虚拟的maps文件.
通过执行cat /proc/self/maps >> /sdcard/maps命令maps内容到/sdcard/maps中. 来看看效果吧~
image.png

let _File = Java.use("java.io.File");
_File.$init.overload("java.lang.String").implementation = function(fileName){var f = '';if (fileName.indexOf("frida-agent") > -1){f = "/sdcard/fuck_frida";}else if(fileName.indexOf("/proc/self/maps") > -1){f = "/sdcard/maps";}else{f= fileName}return this.$init(f);
}

4. Native-map文件

打开IDA,拖入so文件进去看看. 发现是动态注册JNI_onload被混淆了.用下registerNative
image.png
我们需要的是mCheckFridaNMap,其偏移是0xb654

[RegisterNatives] method_count: 0x6
[RegisterNatives] java_class: com.example.test.util.CheckFrida name: mCheckFridaPort sig: ()Z fnPtr: 0x7dd0acd540  fnOffset: 0x7dd0acd540 libCheckFrida.so!0x9540  callee: 0x7dd0acd020 libCheckFrida.so!0x9020
[RegisterNatives] java_class: com.example.test.util.CheckFrida name: mCheckFridaBus sig: ()Z fnPtr: 0x7dd0acda70  fnOffset: 0x7dd0acda70 libCheckFrida.so!0x9a70  callee: 0x7dd0acd020 libCheckFrida.so!0x9020
[RegisterNatives] java_class: com.example.test.util.CheckFrida name: mCheckFridaNMap sig: ()Z fnPtr: 0x7dd0acf654  fnOffset: 0x7dd0acf654 libCheckFrida.so!0xb654  callee: 0x7dd0acd020 libCheckFrida.so!0x9020
[RegisterNatives] java_class: com.example.test.util.CheckFrida name: mCheckFridaMem sig: ()Z fnPtr: 0x7dd0ad0998  fnOffset: 0x7dd0ad0998 libCheckFrida.so!0xc998  callee: 0x7dd0acd020 libCheckFrida.so!0x9020
[RegisterNatives] java_class: com.example.test.util.CheckFrida name: mCheckFridaMem2 sig: ()Ljava/lang/String; fnPtr: 0x7dd0ad010c  fnOffset: 0x7dd0ad010c libCheckFrida.so!0xc10c  callee: 0x7dd0acd020 libCheckFrida.so!0x9020
[RegisterNatives] java_class: com.example.test.util.CheckFrida name: mCheckFridaP sig: ()Ljava/lang/String; fnPtr: 0x7dd0ad0f20  fnOffset: 0x7dd0ad0f20 libCheckFrida.so!0xcf20  callee: 0x7dd0acd020 libCheckFrida.so!0x9020 

跳到目标函数发现,依然是进行了混淆的. 我们来分析分析.
image.png
查看下F5的伪代码.看到我认为是关键的.

  1. fopen打开文件,给v1
  2. 把stream的值设置为v1
// FILE *fopen(const char *filename, const char *mode);v1 = fopen((const char *)&xmmword_F0A0, &byte_F0B0);v2 = -686024801;stream = v1;

我们分别查看一下v1stream的交叉应用(选中按下x键)
v1的交叉引用:
可以发现,v1 只有一处使用了,就是把steam的值设置为v1,那么接下来,我们只需要聚焦steam即可.
image.png
steam的交叉引用
image.png

  • fclose : 关闭流
  • fgets : 从指定的流中读取数据,每次读取一行。其原型为:char *fgets(char *str, int n, FILE *stream);

我们只需要看看fgets上下文. 先到215行,结果为v41跟踪v41
image.png
根据交叉引用,去看看121行的内容.
image.png
再看看haystack的引用, 发现了一个很关键的strstr
image.png

  • strstr : 返回值为char * 类型( 返回指向 str1 中第一次出现的 str2 的指针);如果 str2 不是 str1 的一部分,则返回空指针。

此时可以hook一下,strstr函数和fopen函数
fopen hook:

function hook_native(){var add = Module.findExportByName(null,"fopen");console.log("fopenaddr", add);Interceptor.attach(add,{onEnter:function(args){console.log("[+]fopen("+args[0].readCString()+")")},onLeave:function(){console.log("[-]fopen")}})var strstr = Module.findExportByName(null,"strstr");console.log("strstr addr", add);Interceptor.attach(strstr,{onEnter:function(args){console.log("[+]strstr("+args[0].readCString()+","+args[1].readCString()+")")},onLeave:function(){console.log("[-]strstr")}})
}
function call_maps(){Java.perform(function(){let CheckFrida = Java.use("com.example.test.util.CheckFrida");CheckFrida.mCheckFridaNMap();})
}
function hook(){hook_native();call_maps()
}
setImmediate(hook_native)

hook 日志:
通过fopen方法可以发现,它读的是/proc/self/maps,通过strstr可以发现它是在比较是否包含frida字符串.

call_maps()
[+]fopen(/proc/self/maps)
[-]fopen
[+]strstr(12c00000-12c80000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(12c80000-12e00000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(12e00000-13100000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(13100000-13200000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(13200000-14100000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(14100000-14140000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(14140000-14180000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(14180000-141c0000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(141c0000-14200000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(14200000-14240000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(14240000-16480000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(16480000-164c0000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(164c0000-16500000 ---p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(16500000-32c00000 rw-p 00000000 00:00 0                                  [anon:dalvik-main space (region space)]
,frida)
[-]strstr
[+]strstr(7032d000-705b4000 rw-p 00000000 103:11 1544                              /system/framework/arm64/boot.art
,frida)
[-]strstr
[+]strstr(705b4000-706a3000 rw-p 00000000 103:11 1523                              /system/framework/arm64/boot-core-libart.art
,frida)
[-]strstr
[+]strstr(706a3000-706d9000 rw-p 00000000 103:11 1535                              /system/framework/arm64/boot-okhttp.art
,frida)
[-]strstr
[+]strstr(706d9000-7071a000 rw-p 00000000 103:11 1520                              /system/framework/arm64/boot-bouncycastle.art
,frida)
[-]strstr
[+]strstr(7071a000-7072a000 rw-p 00000000 103:11 1517                              /system/framework/arm64/boot-apache-xml.art
,frida)
[-]strstr
[+]strstr(7072a000-70fe6000 rw-p 00000000 103:11 1529                              /system/framework/arm64/boot-framework.art
,frida)
[-]strstr
[+]strstr(70fe6000-71019000 rw-p 00000000 103:11 1526                              /system/framework/arm64/boot-ext.art
,frida)
[-]strstr
[+]strstr(71019000-71110000 rw-p 00000000 103:11 1538                              /system/framework/arm64/boot-telephony-common.art
,frida)
[-]strstr
[+]strstr(71110000-7111e000 rw-p 00000000 103:11 1541                              /system/framework/arm64/boot-voip-common.art
,frida)
[-]strstr
[+]strstr(7111e000-71133000 rw-p 00000000 103:11 1532                              /system/framework/arm64/boot-ims-common.art
,frida)
[-]strstr
[+]strstr(71133000-71136000 rw-p 00000000 103:11 1514                              /system/framework/arm64/boot-android.test.base.art

那么我们依然使用上面maps文件中的方法 - 伪造maps文件
image.png

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

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

相关文章

腾讯云轻量应用服务器镜像应用模板清单大全

腾讯云轻量应用服务器支持多种应用模板镜像,Windows和Linux镜像模板都有,如:宝塔Linux面板腾讯云专享版、WordPress、WooCommerce、LAMP、Node.js、Docker CE、K3s、宝塔Windows面板和ASP.NET等应用模板镜像,腾讯云服务器网分享腾…

聊一下互联网开源变现

(点击即可收听) 互联网开源变现其实是指通过开源软件或者开放源代码的方式,实现收益或盈利。这种方式越来越被广泛应用于互联网行业 在互联网开源变现的模式中,最常见的方式是通过捐款、广告、付费支持或者授权等方式获利。 例如,有些开源软件…

Linux 基础(五)常用命令-文件属性

文件属性 文件权限文件属性修改文件权限属性 文件所有者 文件权限 文件属性 Linux中文件权限 可以通过文件属性体现; 使用 ll 查看文件列表 最前面的 l d 表示文件类型 1 5 表示硬链接数 或者 子文件夹个数 所属用户 所属用户组 文件大小 创建/更新时间 文件&…

首个女性向3A手游要来了?获IGN认可,《以闪亮之名》能否突出重围

最近的手游市场可以说是热度十足,各大厂商都发布了旗下新作的消息,3A高自由度似乎成了所有新游的主基调,但说起与众不同,那便不得不说这款《以闪亮之名》,这是本季度新游中唯一一个女性向3A作品。 这款手游主打超自由时…

2009年“五一”假期市民旅游指南

信息来源于:上海旅游官网 为使广大市民更好地领略上海的都市风情,满足 市民的旅游消费需求,丰富节日生活 ,本市部分景点 、旅游企业 精心策划,积极准备,推出一系列适合市民市内旅游的节目,在…

常州嬉戏谷游玩全攻略

攻略导读:常州环球动漫嬉戏谷,一座国际动漫游戏体验博览园,颠覆传统,突破创新,定位鲜明,以满足逾4亿中国互联网用户的庞大娱乐需求为目标,以更适合未来前往的体验型公园为前瞻。假面文化的“梦幻…

第四十八周周报

学习目标: 修改ViTGAN 学习内容: 位置编码和多尺度 学习时间: 8.5-8。12 学习产出: 这两周主要工作在修改ViTGAN的结构和代码,将相对位置编码加入ViTGAN并将生成器变为多尺度,由于匹配维度很困难&am…

Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二):几个坑 附录官网文档:core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中,这些聚合根通常会发布领域事件。Sp…

pass 软件_PASS软件非劣效Logrank检验的h1参数如何设置?

前言 近日,有朋友在《统计咨询》公众号咨询:在使用PASS中的Non-Inferiority Logrank Tests程序计算样本量时,h1(Hazard Rate of Reference Group) 这个参数不懂得如何设置?见下图红色矩形标注的参数。相信这个也是其他很多朋友碰…

简单聊聊什么是Sass、Pass和Iass?

Iass,Pass和Saas都是什么意思?想必大家都听过也查阅过资料。但现在网上很多文章都会把一些比较简单的概念包装得非常牛气,逼格很高,各种高大上就是不说大白话,本文正好通过搭建网校平台为例和小伙伴简单分享一下它们之…

项目如何简单的使用pass平台部署服务

目录 前言: 一:Pass平台的优势 二:Pass平台的相关要素 三:docker|jenkins\k8s\pass\git之间关系 四:项目如何使用pass 五:pass平台常规操作 5.1应用重启 5.1.1定位到命名空间下的容器项目 5.1.2服务…

云计算之IasS、PasS、SaaS

越来越多的软件,开始采用云服务。 云服务只是一个统称,可以分成三大类。 IaaS:基础设施服务,Infrastructure-as-a-servicePaaS:平台服务,Platform-as-a-serviceSaaS:软件服务,Softw…

pass平台的搭建

Docker容器化部署Rancher CentOS 7.0默认使用的是firewall作为防火墙 查看防火墙状态 firewall-cmd --state ​ 停止firewall systemctl stop firewalld.service ​ 禁止firewall开机启动 systemctl disable firewalld.service ​ 安装rancher docker run -d --restart=unless-…

pass,saas区别

毫无疑问,PaaS与企业在服务与开发过程中的需求密切相关,特别是随着云计算的发展和企业平台化战略的驱动,企业对于云原生应用和全新的应用开发都提出了更高要求,而PaaS作为“承上启下”的中间层也变得越来越重要,更成为…

saas,pass介绍

毫无疑问,PaaS与企业在服务与开发过程中的需求密切相关,特别是随着云计算的发展和企业平台化战略的驱动,企业对于云原生应用和全新的应用开发都提出了更高要求,而PaaS作为“承上启下”的中间层也变得越来越重要,更成为…

Saas、Pass和lass

lass:需要将源码系统署到服务器上才能让大家访问,那服务器从哪来,咱们可以单独买一台实体服务器放家里放公司里,但是这样成本会比较高,而且维护会比较麻烦,所以更方便的方式就是去云服务平台,租…

SaaS,iass 和pass,你知道吗?

一、IaaS IaaS是Infrastructure as a server的缩写,意思是基础设施即服务。又云端公司把IT环境的基础设施建设好,然后直接对外出租硬件服务器或者虚拟机。消费者可以利用所有计算基础设施,包括处理CPU、内存、存储、网络和其它基本的计算资源…

saas和pass的区别

毫无疑问,PaaS与企业在服务与开发过程中的需求密切相关,特别是随着云计算的发展和企业平台化战略的驱动,企业对于云原生应用和全新的应用开发都提出了更高要求,而PaaS作为“承上启下”的中间层也变得越来越重要,更成为…

云计算的服务:Iass,Pass,Sass,Cass,Pass 区别及应用

一、什么是云计算 云计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。云计算甚至可以让你体验每秒10万亿次的运算能力&…

​LeetCode解法汇总1572. 矩阵对角线元素的和

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你一个正…