Frida源码编译及定制

4,916 阅读4分钟

一、 背景

在日常逆向APP过程中,少不了各种Java、Native的Hook, Frida作为当下非常流行的Hook框架自然得到不少人的青睐。

二、 编译

下面介绍关于Frida项目的编译方法:

  1. 同步代码(由于子项目过多,经常失败,建议科学下载):
git clone --recurse-submodules https://github.com/frida/frida
  1. 指定NDK目录,最新版本Frida需要最低NDK版本为r25
ANDROID_NDK_ROOT=/Users/apple/Downloads/android-ndk-r25b
  1. 安装node.js
nvm install node
  • node version: v19.4.0
  • npm version : 9.2.0
  • nvm version : 0.39.2
  1. 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的特征检测,如文件特征,包括

  1. 本地文件:
/data/local/tmp/re.frida.server/frida-agent-64.so
  1. 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 修改特征

  1. server.vala 文件,修改 DEFAULT_DIRECTORY :
修改前:
	private const string DEFAULT_DIRECTORY = "re.frida.server";
        
修改后: 
    	private const string DEFAULT_DIRECTORY = "mytest";
  1. 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
  1. 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