Frida在安卓逆向的过程中是一款很好用的hook框架,就目前情况而言,对Frida的检测越来越多,因此我们需要对Frida进行魔改,抹去它的一些特征信息,从而对抗加固厂商的检测。
1. 编译环境
- 操作系统:Ubuntu 22.04
- 目标Frida版本:14.2.12
- 注意事项:
- 换源,节省时间
- 切换用户shell为bash,而不是dash
1.1 安装依赖
首先安装编译Frida所需要的依赖:
sudo apt update
sudo apt-get install build-essential tree ninja-build gcc-multilib g++-multilib lib32stdc++-9-dev flex bison xz-utils ruby ruby-dev python3-requests python3-setuptools python3-dev python3-pip libc6-dev libc6-dev-i386 nodejs npm -y
然后安装lief,这是一个python库,在魔改Frida时会用到:
python3 -m pip install lief
1.2 下载配置Android NDK
值得一提的是,要下载的NDK版本与想要编译的Frida版本有关,可在Frida目录下的releng/setup-env.sh查看需要下载的NDK版本:
cat releng/setup-env.sh |grep "ndk_required="
14.2.12版本对应的NDK为22,下载r22版本的NDK并解压
wget https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip
unzip android-ndk-r22-linux-x86_64.zip
然后将解压后的NDK添加到环境变量中:
export ANDROID_NDK_ROOT=/home/ubuntu/android-ndk-r22
export PATH=$ANDROID_NDK_ROOT:$PATH
然后执行命令ndk-build -v,如果有版本信息输出,说明环境变量配置生效了。
2. 编译Frida
2.1 下载
git clone --recurse-submodules -b 14.2.12 https://github.com/frida/frida
cd frida
2.2 编译toolchain和sdk
根据官方指南我们应该编译toolchain和sdk,官方下载地址如下:
https://build.frida.re/deps/20210123/toolchain-linux-x86_64.tar.bz2
https://build.frida.re/deps/20210123/sdk-linux-x86_64.tar.bz2
https://build.frida.re/deps/20210123/sdk-android-arm.tar.bz2
https://build.frida.re/deps/20210123/sdk-android-arm64.tar.bz2
上述下载地址中的20210123是frida中releng/deps.mk中的frida_deps_version:
cat releng/deps.mk | grep "frida_deps_version"
后面部分则是toolchain-{平台-架构}.tar.bz2。
在frida目录下新建build目录,然后在build目录下通过wget下载上述文件:
mkdir build
cd build
wget https://build.frida.re/deps/20210123/toolchain-linux-x86_64.tar.bz2
wget https://build.frida.re/deps/20210123/sdk-linux-x86_64.tar.bz2
wget https://build.frida.re/deps/20210123/sdk-android-arm.tar.bz2
wget https://build.frida.re/deps/20210123/sdk-android-arm64.tar.bz2
然后回到frida目录执行以下命令:
chmod -R 777 ./*
sh releng/setup-env.sh
输出大概是这样:
如果不手动下载,sh脚本以及make的时候也会帮你下载,但是手动下载方便一点。
然后在build目录下创建头文件frida-version.h,如果没有就手动创建,然后根据自己编译版本填入下面代码:
#ifndef __FRIDA_VERSION_H__
#define __FRIDA_VERSION_H__
#define FRIDA_VERSION "14.2.12"
#define FRIDA_MAJOR_VERSION 14
#define FRIDA_MINOR_VERSION 2
#define FRIDA_MICRO_VERSION 12
#define FRIDA_NANO_VERSION 0
#endif
2.3 打patch
1)去除frida:rpc特征
diff --git a/lib/interfaces/session.vala b/lib/interfaces/session.vala
old mode 100644
new mode 100755
index 16ff05ed..87fcdec4
--- a/lib/interfaces/session.vala
+++ b/lib/interfaces/session.vala
@@ -879,7 +879,7 @@ namespace Frida {
var request = new Json.Builder ();
request
.begin_array ()
- .add_string_value ("frida:rpc")
+ .add_string_value ((string) GLib.Base64.decode("ZnJpZGE6cnBj="))
.add_string_value (request_id)
.add_string_value ("call")
.add_string_value (method)
@@ -932,7 +932,7 @@ namespace Frida {
}
public bool try_handle_message (string raw_message) {
- if (raw_message.index_of ("\"frida:rpc\"") == -1)
+ if (raw_message.index_of ((string) GLib.Base64.decode("ImZyaWRhOnJwYyI=")) == -1)
return false;