查看原文
其他

魔改frida特征和编译(绕过frida检测)

哆啦安全 2023-08-24

The following article is from 编角料 Author 编角料

0x0.前言(为什么会有这篇文章)

本篇文章主旨只是报以学术研究为目的,并不是要干翻所有的frida检测,本文的方法也只是一个参考,并不能过所有的frida检测
由于如标题说的超详细过程,所以整篇文章篇幅过长,有些环节如果您已经会的操作直接跳过即可。

目前2023年8月,相信各位移动安全工作者已经深有体会,现在无论大小app都有各种检测,加固,反抓包,反frida,反xposed成了家常便饭。

那么frida又是安全工作者必不可少的一个安全逆向调试工具,但是它用不了啊,直接阻碍我们的分析工作,所以我们需要作反frida对抗。所以这篇文章的意义就有了。

但是目前为止,好像有不少大佬都写过相关的文章了,其实直接看别人发的不就好了吗,这个确实是的,不过还有个,技术总是在革新,虽然我也不保证我能比之前的大佬写的有多新的技术,只能说顺便记录编译的全过程,然后这篇文章后续应该持续更新,新的技术都会加入进来(只呈现技术,编译好的成品暂不公开)

0x1.必备环境

*nux环境,你可以是macos,也可以是ubuntu,centos
vmware 虚拟机软件
安卓手机,这个就随意了。

0x2.linux环境准备

💡 这里我选用ubuntu。毕竟大佬们都选用的ubuntu,别人已经踩过的坑,咱们直接借鉴就行了,别骚包的想走非主流路线了。

1.下载镜像

这里我选用的20.04版,还是那句,别骚包的去整最新版,到时候环境依赖不支持,有些依赖库并没有及时兼容最新版,到时候你整到中途遇到各种报错就哭吧。


也不要去整很老的版本,比如如果你用18.04,可能会遇到如下安装依赖的报错:



所以,别瞎创新,最好按照步骤一点点来,推荐就20.04

下载链接:https://releases.ubuntu.com/

当然,相信有的老baby的网肯定去官网下载肯定是不行的,所以也可以选用国内的镜像源

中科大源
http://mirrors.ustc.edu.cn/ubuntu-releases/20.04/
南京大学http://mirrors.nju.edu.cn/ubuntu-releases/20.04/
上海交通大学http://ftp.sjtu.edu.cn/ubuntu-releases/20.04/
清华大学https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/
阿里云开源镜像站
http://mirrors.aliyun.com/ubuntu-releases/20.04/
浙江大学
http://mirrors.zju.edu.cn/ubuntu-releases/20.04/

各个版本下载网址:
http://mirrors.melbourne.co.uk/ubuntu-releases/

我这里就选用这个了,看清楚大小,记得下desktop版,有图形界面,操作好点,不然全是命令行,配置个网络都整半天,浪费时间


2.vmware安装系统并运行

vmware的基本操作这里就不说了,大部分操作网上的文章一大堆,相信老baby们都可以找到。

这里就直接快进到系统安装好,进入界面的状态




提一下,这些最好让他装完,别点skip,万一后面环境依赖缺失搞起来麻烦






这时候先别直接操作,把内存调大一点,不然后面卡死,先关机,调整之后,再启动





3.网络状态检测

ok,正常的

4.更新或安装必要的依赖


4.1.修改apt源







然后这里面很多,你可以自行选择一个国内的包源

找到china的:









或者你也可以点下这个,他自动测试哪个源更快:





ok,他自动给我选了腾讯云的




点了之后如下,开始更新缓存




当然,你也可以选清华的源,相对稳一点,选了点close





4.2.更新现有环境





这个步骤就稍等片刻了,这时候你可以去厕所拉个大


4.3.安装第三方库

sudo apt-get install build-essential curlgit lib32stdc++-9-dev libc6-dev-i386 nodejs npm python3-dev python3-pipsudo apt-get install flex bison



如果出现如下问题,大概率你用的是ubuntu18.04,赶紧换20.04吧,听人劝,吃饱饭



如果还是这个问题,没事,不急,可能源没这个库,切换源试试






到此处,建议虚拟机建一个还原点,再接着后面操作

4.4.安装proxychains

后续的操作会涉及到外网下载,所以最好还是配置上这个,可以代理到真机的科学上,然后加速下载外网文件


sudo apt-get install proxychains



4.5.配置proxychains


先看看安装到哪里了:

whereis proxychainsfind / -name proxychains



ok,就在这,就是需要配置这个conf了

先打开真机的科学工具



记得把这个打开



确认真机可以打开外网站点



记下真机的局域网IP





ping下看能不能通:





回到虚拟机里,sudo  vi /etc/proxychains.conf

默认配置如下:



修改为:这个IP 和端口就是刚才的真机的局域网ip和科学的局域网端口





4.6.测试科学

访问httpbin就知道,但是用proxychains之后发现无法解析





这个应该是dns的问题,配置下就好了

4.7.配置dns


ok,现在好了。





4.8. pip 安装lief库

这个就没啥可说的,安装不了就换源重试



5.配置编译环境

       根据frida官方的简单的概述:

https://frida.re/docs/building/



依赖我们已经装过了,pull 下frida源码

5.1.拉取指定版本的frida源

git操作这里就不展开说了。

-b 就是指定分支的拉取,默认是拉取master主分支的代码


这里我选用15.1.28,这个版本习惯了,我电脑的环境都是这个版本

git clone -b 15.1.28 --recurse-submodules https://github.com/frida/frida

这里会很慢:



所以可以用proxychains,速度不行就切换节点



我换了一个很快的节点:



分分钟拉取完

5.2.编译toolchain

proxychains make -f Makefile.toolchain.mk



等待片刻,完了:


接着根据官方文档:



5.3.编译这个x86_64的

make -f Makefile.sdk.mk FRIDA_HOST=linux-x86_64


然后就卡这里了



再重试就报错了:


怎么办?

5.4.手动下载需要的文件

先看看对应的版本号:


https://build.frida.re/deps/20220701/toolchain-linux-x86_64.tar.bz2 # toolchains 工具
https://build.frida.re/deps/20220701/sdk-linux-x86_64.tar.bz2 # sdk 工具
# 这些是需要编译的对应架构的文件,也都一并下载了
https://build.frida.re/deps/20220701/sdk-android-x86.tar.bz2https://build.frida.re/deps/20220701/sdk-android-x86_64.tar.bz2https://build.frida.re/deps/20220701/sdk-android-arm.tar.bz2https://build.frida.re/deps/20220701/sdk-android-arm64.tar.bz2





5.5.配置真机与虚拟机sftp互通

上面的文件要怎么传入虚拟机呢?如果你安装了vm-tools的,可以直接拖进去,但是我发现拖进去的操作,经常有很多错误,而且很多时候拖进去的文件还不完整,就 很奇葩


所以这里准备配置sftp互通,直接上传过去。

虚拟机的ip:


ping可以ping通的


这里我选用termiux工具,直接连接的时候发现,报错了:



很尴尬了,是哪里的问题呢,防火墙是关闭的,而且也开了22端口的





排查是发现,就没有ssh-server




安装ssh-server:

sudo apt-get install openssh-server -y



再来:



现在真机再连接,现在不保存,这个是第一次连接的时候会有的:





退出,用sftp连接:





现在直接拖进去,这个拖的操作不会出现bug,文件也很完整的



5.6.执行releng/setup-env.sh



5.7.配置ndk

先看releng/setup-env.sh里的ndk版本,由于我用得是frida15.1.28的,网上的很多是用的ndk22,别盲目照着网上的文章跟着操作,到时候对不上,你又费时间排查问题

cat releng/setup-env.sh |grep ndk



去这里下载:

https://developer.android.com/ndk/downloads

https://github.com/android/ndk/wiki/Unsupported-Downloads



下载里面的24 linux版



解压,这个位置随意,只要能直接调用即可,等会儿要配置到环境变量上



记下ndk的路径





vim ~/.bashrc

添加如下代码,保存退出

export ANDROID_NDK_ROOT=/home/geek/Desktop/android-ndk-r24export PATH=$ANDROID_NDK_ROOT:$PATH





让环境生效:

source~/.bashrc


ndk-build -v,如果出现如下说明配置好了



0x3.编译


1.官方编译

先来看看官方编译,看这一套,咱们配置对不对,后续再来搞去特征的编译

这里也不用修改releng/frida-deps.vcxproj和releng/frida.mk文件里的master改为main,你按照我上面走下来的,这两个文件里的已经是main了,不用改。


接下来,官方版本的frida,开始如下编译了:

make core-android-arm64


报错了,仔细看,意思是我们没有设置哪个ndk变量,但是刚设置了呀,



再看,这个终端窗口里,ndk还不生效,尴尬,关了重开一个终端,ok,在编译了







擦,报错了,仔细看报错信息,说node.js没有安装,那装下node先

apt install nodejs npm -y


这里,我建议你,虚拟机建一个还原点,等会儿可能会用到

之后继续make:



又是漫长的等待



建议,可以打一把王者再来看结果

ok,编译好了,现在没有报错



看看它输出,找找输出路径



进去看看:



ok,把这个整到安卓手机上,也可以整到真机,然后真机adb push过去,也可以直接手机连接虚拟机操作






现在真机这边用frida启动一下安卓的设置看看能不能调起来,



ok,非常nice。

是,到这里,并不是本篇文章的重点,还是文章开头那句话,现在各路app,都会对frida有检测,启动frida就报错退出的,很多,检测手段也不少,所以,我们需要,进行去特征

2.魔改编译hluda参照一波

    看你选择,看虚拟机是否要回到我刚才提到的还原点,也可以不还原回去,修改了特征了之后重新编译,它后续会覆盖之前的。

首先,魔改frida比较出名的,肯定还是葫芦娃的hluda,那么先跟着操作下,别人都改了啥

https://github.com/AAAA-Project/Patchs/tree/master/strongR-frida/frida-core

https://github.com/hzzheyang/strongR-frida-android这里也有成品,另外一个大佬维护的


2.1. 一键自动修改操作

cd frida/frida-core
git clone https://github.com/hluwa/Patchs.git
git config --global user.email 'test@gmail.com'
git config --global user.name 'geekbyte'
git am Patchs/strongR-frida/frida-core/*.patch


以下是借助git工具解决冲突自动更改文件的操作



2.2.手动修改

    当然,你如果不放心,也可以手动修改


2.2.1.去掉frida_rpc特征

回到虚拟机的frida目录里,找frida_rpc位置,然后对照着修改:



如果你不知道是哪个文件,你可以按照如下操作,grep过滤出来

vim ./frida-core/lib/base/rpc.vala






照着改就行了:

保存退出


2.2.2.去除frida-server特征

vim ./frida-core/server/server.vala



改的时候,发现,15.1.28多了个这个,要不要改呢?万一改了出问题咋办,没事,这里是字符串,那就是字符串拼接吧:







这里也有,都改了

2.2.3 frida-pipe_linjector

2.2.4.io_frida_agent_so


2.2.5.symbol_frida_agent_main



新建anti-anti-frida.py文件


import lief
import sys
import random
import os
if __name__ == "__main__":
input_file = sys.argv[1]
print(f"[*] Patch frida-agent: {input_file}")
random_name = "".join(random.sample("ABCDEFGHIJKLMNO", 5))
print(f"[*] Patch `frida` to `{random_name}``")
binary = lief.parse(input_file)
if not binary:
exit()
for symbol in binary.symbols:
if symbol.name == "frida_agent_main":
symbol.name = "main"
if "frida" in symbol.name:
symbol.name = symbol.name.replace("frida", random_name)
if "FRIDA" in symbol.name:
symbol.name = symbol.name.replace("FRIDA", random_name)
binary.write(input_file)


后续的跟着改,然后test-agent.vala里的frida相关字符串有很多,也用base64解码一下





这里就不一一展示了

anti-anti-frida.py 文件根据上面的,添加信息




2.2.6.frida-protocol_unexpected_command


ok,以上都改完了,虚拟机建一个还原点

2.3.重新编译

      上面修改完了之后,把tmp-android-arm64的文件里的全删了

看你要不要先make clean一下,clean的时候 ,记得事先备份frida-core文件夹,不然会被删除,clean完再移动过来,再来编译

make core-android-arm64

我擦,这里报错了,进去看看



进去看看这个报错位置,复制的时候,把【+】 复制进去了。



删掉,重新编译



又有新的报错,看看



看起来,好像是要一个空格,加上继续编译:






还是不行,这有点尴尬了。



结果发现是这里的问题,ok,改完继续


ok,没有报任何错

把他搞出来,整到手机上



用fridacheck看看效果:






有点东西,即使魔改过了,还是能检测这么多。


⚠️注: 这里由于我是用的15版的frida,网上的教程有的是14版,新版的frida,有些特征和旧版不一样,所以如果还用hluda那一套修改的话,有些特征并没有被修改到

所以这时候就需要深度魔改了,这里面的被检测项,每一个都可以点击:

然后你就可以拿着上面的词汇去网上搜索相关技术文章,看看怎么用来检测的,然后针对性处理

3.进一步魔改

上面的截图,可以看出,已经其实如果是根据hluda来修改的话,还是有很多特征的,说更直接点,现在各路检测,hluda已经不够用了,所以还得进一步魔改


3.1. uuid检测对抗





这里这个uuid就是被检测的一个特征,frida每次启动都会生成一个uuid的文件夹,然后里面有一堆的文件,这个就别拿来检测特征了,我尝试过用(string) GLib.Base64.encode(GLib.Uuid.string_random()).replace('-','').replace('/\d+/','test')+"fr" 还是不行,会被检测到,文章是公开的,为了不被安全人员收集,我就不公开了,自行修改了


3.2.frida-helper

frida-helper也会被拿来检测,你把这个文件改个名字或者啥,都行

3.3./data/local/tmp

这个目录也会被拿来检测,所以,怎么操作就看你自己了

3.3.还有其他的特征

这个就你自己去发现了,还是那句,文章是公开的,为了不被安全人员收集,我就不公开了,自行修改了

3.4.重新编译



说明下,这个线程检测,由于frida它偶尔有,偶尔没有,所以问题不大的,

如果要针对这个pool_frida修改的话,这个就涉及到内核层面了,把kernel/sys.c添加如下红框框住的地方接口

这种细节操作就涉及魔改rom了,考虑放到后面的文章讲解


或者frida 注入时,延时10s左右启动即可,实在不行再配合一个antifrida的js脚本就可以了





然后仅仅是这个app检测的话,其实还不够严格,像一线加固厂的企业壳的检测,比这个还要狠,所以这里只是一个参考,更多的细节,就各位看官自己去摸索了。


4.frida检测对抗尝试

说来就来,无名侠大佬刚好看到我在说编译了这个,立马给了我一个检测frida的,试试,g,被检测到了

再来看珍惜佬的hunter,没打开前,我已经有心里预期了,果然

所以啊,革命尚未成功,还得练


当然目前这个也并不是一无是处,除了头部厂的app或者有针对性检测的,常规的检测还是可以用的。


参考资料

http://blog.wen2go.site/2022/07/29/20220729/http://blog.wen2go.site/2022/07/29/20220729/https://blog.seeflower.dev/archives/16/https://github.com/TUGOhost/anti_Android

您可能也对以下帖子感兴趣

老司机带你快速上手:Openmetadata本地化编译及K8s发版详解
35岁程序员使用Cursor和Devbox手撕基于Rust的WASM智能合约
Android 15 上适配 16K Page Size 的填坑思路,以 IJKPlayer 为例子
IntelliJ IDEA 2024.3 K2 模式已发布稳定版,Android Studio Meerkat 预览也正式支持
深入探索 APKTool:Android 应用的反编译与重打包工具

文章有问题?点此查看未经处理的缓存