一、 背景
在日常逆向APP过程中,少不了各种Java、Native的Hook, Frida作为当下非常流行的Hook框架自然得到不少人的青睐。
二、 编译
下面介绍关于Frida项目的编译方法:
- 同步代码(由于子项目过多,经常失败,建议科学下载):
git clone --recurse-submodules https://github.com/frida/frida
- 指定NDK目录,最新版本Frida需要最低NDK版本为r25
ANDROID_NDK_ROOT=/Users/apple/Downloads/android-ndk-r25b
- 安装node.js
nvm install node
- node version: v19.4.0
- npm version : 9.2.0
- nvm version : 0.39.2
- Make编译
运行make,会列出所有编译选项:
make
Usage: make TARGET [VARIABLE=value]
Where TARGET specifies one or more of:
/* gum */
gum-macos Build for macOS
gum-ios Build for iOS
gum-watchos Build for watchOS
gum-tvos Build for tvOS
gum-android-x86 Build for Android/x86
gum-android-x86_64 Build for Android/x86-64
gum-android-arm Build for Android/arm
gum-android-arm64 Build for Android/arm64
check-gum-macos Run tests for macOS
/* core */
core-macos Build for macOS
core-ios Build for iOS
core-watchos Build for watchOS
core-tvos Build for tvOS
core-android-x86 Build for Android/x86
core-android-x86_64 Build for Android/x86-64
core-android-arm Build for Android/arm
core-android-arm64 Build for Android/arm64
check-core-macos Run tests for macOS
如果测试机是64位,那么就选择arm64:
make core-android-arm64
当编译完成之后, 会在build/frida-android-arm64 目录找到编译后的二进制文件
➜ bin git:(main) ls
frida-inject frida-portal frida-server gum-graft
三、绕过检测思路
3.1 文件特征
如今很多APP都加入了防Frida的方案,并且很多时候都是基于Frida的特征检测,如文件特征,包括
- 本地文件:
/data/local/tmp/re.frida.server/frida-agent-64.so
- maps表:
blueline:/ # cat /proc/25459/maps |grep frida
cd5c3000-cda7a000 r--p 00000000 fd:02 139384 /data/local/tmp/re.frida.server/frida-agent-32.so
cda7a000-ce4b4000 r-xp 004b6000 fd:02 139384 /data/local/tmp/re.frida.server/frida-agent-32.so
ce4b4000-ce527000 r--p 00eef000 fd:02 139384 /data/local/tmp/re.frida.server/frida-agent-32.so
ce528000-ce539000 rw-p 00f62000 fd:02 139384 /data/local/tmp/re.frida.server/frida-agent-32.so
3.2 修改特征
- server.vala 文件,修改 DEFAULT_DIRECTORY :
修改前:
private const string DEFAULT_DIRECTORY = "re.frida.server";
修改后:
private const string DEFAULT_DIRECTORY = "mytest";
- linux-host-session.vala 文件, 修改 HAVE_EMBEDDED_ASSETS 块内容:
#if HAVE_EMBEDDED_ASSETS
var blob32 = Frida.Data.Agent.get_frida_agent_32_so_blob ();
var blob64 = Frida.Data.Agent.get_frida_agent_64_so_blob ();
var emulated_arm = Frida.Data.Agent.get_frida_agent_arm_so_blob ();
var emulated_arm64 = Frida.Data.Agent.get_frida_agent_arm64_so_blob ();
agent = new AgentDescriptor (PathTemplate ("frida-agent-<arch>.so"),
new Bytes.static (blob32.data),
new Bytes.static (blob64.data),
new AgentResource[] {
new AgentResource ("frida-agent-arm.so", new Bytes.static (emulated_arm.data), tempdir),
new AgentResource ("frida-agent-arm64.so", new Bytes.static (emulated_arm64.data), tempdir),
},
AgentMode.INSTANCED,
tempdir);
#endif
- 修改 frida-agent-<arch>.so 为 test.so
- 修改 frida-agent-arm.so 和 frida-agent-arm64.so 为 test-arm.so 和 test-arm64.so
- system.vala文件 , 修改get_system_tmp 函数:
修改前:
private extern static string get_system_tmp ();
修改后:
private static string get_system_tmp (){
return "/data/local/tmp/sample/";
}
==重新编译并运行==
再次运行并查看注入情况:
blueline:/ # cat /proc/4479/maps |grep tmp
cf944000-cfdfb000 r--p 00000000 fd:02 142052 /data/local/tmp/sample/test/test-32.so
cfdfb000-d0835000 r-xp 004b6000 fd:02 142052 /data/local/tmp/sample/test/test-32.so
d0835000-d08a8000 r--p 00eef000 fd:02 142052 /data/local/tmp/sample/test/test-32.so
d08a9000-d08ba000 rw-p 00f62000 fd:02 142052 /data/local/tmp/sample/test/test-32.so
此时已经没有了frida相关特征
3.3 使用定制库hluwa
以上仅仅描述了基本的文件特征修改,目前已经相关定制库可以更全面的绕过frida检测 github.com/hluwa/Patch…
3.4.1 下载编译
在frida源码同级目录下,clone hluwa代码
git clone https://github.com/hluwa/Patchs.git
由于hluwa目前的版本只适配到了frida 15.0.4版本,所以需要将frida代码切换到15.0.4分支
git checkout 15.0.4
git submodule update --recursive
进入frida-core目录,执行合并命令:
git am ../../Patchs/strongR-frida/frida-core/*.patch
合并完成,回到frida目录,需要修改 build/frida_version.h 文件(如果没有则需要手动添加) , 将内容改为:
应用:strongR-frida: io_re_frida_server
#ifndef __FRIDA_VERSION_H__
#define __FRIDA_VERSION_H__
#define FRIDA_VERSION "15.0.4"
#define FRIDA_MAJOR_VERSION 15
#define FRIDA_MINOR_VERSION 0
#define FRIDA_MICRO_VERSION 4
#define FRIDA_NANO_VERSION 0
#endif
安装lief库
python3 -m pip install lief
使用make编译
【编译问题】 如果遇到找不到Node
Oops. It appears Node.js is not installed.
We need it for processing JavaScript code at build-time.
Check PATH or set NODE to the absolute path of your Node.js binary.
重新使用命令 nvm install node
3.4.2 运行
运行hluwa的定制frida_server,观察注入情况,可以发现注入的so文件已经全都是随机数:
blueline:/ # cat /proc/11203/maps|grep /data/local/tmp
922e5000-93107000 r-xp 00000000 fd:02 31011 /data/local/tmp/d3809a7c-7320-4a91-bb7a-d6cfc498aeb6/0555f0b7-52ea-4396-a454-fd500ed48249-32.so
93107000-9315f000 r--p 00e21000 fd:02 31011 /data/local/tmp/d3809a7c-7320-4a91-bb7a-d6cfc498aeb6/0555f0b7-52ea-4396-a454-fd500ed48249-32.so
9315f000-9316d000 rw-p 00e79000 fd:02 31011 /data/local/tmp/d3809a7c-7320-4a91-bb7a-d6cfc498aeb6/0555f0b7-52ea-4396-a454-fd500ed48249-32.so
941b0000-941b1000 r--p 00ecb000 fd:02 31011 /data/local/tmp/d3809a7c-7320-4a91-bb7a-d6cfc498aeb6/0555f0b7-52ea-4396-a454-fd500ed48249-32.so