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-pip
sudo apt-get install flex bison
如果出现如下问题,大概率你用的是ubuntu18.04,赶紧换20.04吧,听人劝,吃饱饭
如果还是这个问题,没事,不急,可能源没这个库,切换源试试
到此处,建议虚拟机建一个还原点,再接着后面操作
4.4.安装proxychains
后续的操作会涉及到外网下载,所以最好还是配置上这个,可以代理到真机的科学上,然后加速下载外网文件
sudo apt-get install proxychains
4.5.配置proxychains
先看看安装到哪里了:
whereis proxychains
find / -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.bz2
https://build.frida.re/deps/20220701/sdk-android-x86_64.tar.bz2
https://build.frida.re/deps/20220701/sdk-android-arm.tar.bz2
https://build.frida.re/deps/20220701/sdk-android-arm64.tar.bz2
5.5.配置真机与虚拟机sftp互通
上面的文件要怎么传入虚拟机呢?如果你安装了vm-tools的,可以直接拖进去,但是我发现拖进去的操作,经常有很多错误,而且很多时候拖进去的文件还不完整,就 很奇葩
所以这里准备配置sftp互通,直接上传过去。
虚拟机的ip:
这里我选用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-r24
export 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.手动修改
当然,你如果不放心,也可以手动修改回到虚拟机的frida目录里,找frida_rpc位置,然后对照着修改:
如果你不知道是哪个文件,你可以按照如下操作,grep过滤出来
vim ./frida-core/lib/base/rpc.vala
照着改就行了:
保存退出
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