文章目录

  • 前言
  • 一、编译最新版本
  • 1.搭建环境
  • 2.代码下载
  • 3.编译
  • 二、魔改再编译
  • 1.切换到指定tag:15.1.12
  • 2.打hluda patch
  • 3.编译



前言

对于frida的编译和魔改想必大家都已经不陌生了,看雪上一搜一大堆,但是大神们基本都是基于ubuntu环境搞的,今天就记录下我在mac环境下编译的详细步骤,其实大体上一致,区别就在于编译环境搭建和负责去特征的anti-anti-frida.py脚本有些差异


一、编译最新版本

frida官网对于编译环境和编译步骤已经做了描述,如下图:

ios的Frida_sed


好了,下面就开始咔咔一顿操作吧。。。

1.搭建环境

  • xcode命令行工具
mac电脑基本都自带xcode工具,没有的话AppStore搜索安装就可
  • python 环境
要求3.10, 但是我3.7.0也可以
  • Node.js
这个就老老实实整最新版本v19.0.1,因为我用老版本编译失败了
官网(https://nodejs.org/en/download/current/)下载安装包或者brew install node都可
安装完终端测试下node -v 和 npm -v 命令没问题就ok

2.代码下载

git clone --recurse-submodules https://github.com/frida/frida.git #包括了所有子模块
这里多说一嘴吧:
1.如果clone时忘了下子模块或者clone所有子模块时有失败时候该怎么办 : 执行 git submodule update --init 直到没有出错信息
2.最后检查各子模块状态是否正常:git submodule status

3.编译

(1)首先想要编译Android平台的肯定是要依赖NDK,在frida源码目录下releng/setup-env.sh搜索ndk_required就可看到需要的版本;这里记住一定要在NDK下载地址中选择darwin版本下载安装,否则编译时在ndk目录下找不到darwin目录下的静态库哦!别怪我没提醒你~

ios的Frida_android_02


(2)终于可以开始编译了,执行make命令可以显示编译架构信息。设置临时ndk环境变量开始编译即可,这里我就用arm64举例了

export ANDROID_NDK_ROOT=/Users/xxx/program/ndk/android-ndk-r24-darwin && make core-android-arm64

顺利的话,上个厕所的功夫就编译完成了。将build/frida-android-arm64/bin/frida-server push到手机里就测试下没问题就完活

二、魔改再编译

1.切换到指定tag:15.1.12

clone下来的代码最新的是16.0.2, 因为常用15.1.12版本,所以先切换下本地代码

git checkout 15.1.12 #切换tag
git submodule update --recursive #其他子模块也跟着一起更新下

2.打hluda patch

git clone https://github.com/hluwa/Patchs.git
cd frida/frida-core
git am Patchs/strongR-frida/frida-core/*.patch

3.编译

(1)切换到老tag编译应该都会遇到下面这个问题,因为frida已将默认分支从master切换到main

报错:
make[1]: *** No rule to make target '.git/refs/heads/master', needed by 'build/frida-version.h'.  Stop.

解决办法就是将下面这次commit的改动直接恢复就行了
https://github.com/frida/frida/commit/e4c6a1e646666284ea77c36d61f20558504847b5
就两个文件releng/frida-deps.vcxproj和releng/frida.mk,别犹豫,直接把master替换成main就完事

(2)编译(命令同上)

export ANDROID_NDK_ROOT=/Users/xxx/program/ndk/android-ndk-r24-darwin && make core-android-arm64

(3)编译之后strings查看frida-server文件字符串,发现frida-core/src/anti-anti-frida.py脚本的sed貌似没有生效,这里我修改了下,可以再对frida-server执行一下,代码我贴到下面:

import lief
import sys
import random
import os

def execute_command(command):
    result = os.popen(command).read()
    return result

def hex_str(input_str):
    return "".join(execute_command('echo %s | hexdump |head -n 1'%(input_str)).split(' ')[1:len(input_str) + 1]).upper()

def replace_hex_file(source, target, input_file):
    tmp_file = os.path.join(os.path.dirname(os.path.abspath(input_file)), "tmpfile")
    # hexdump -ve '1/1 "%.2X"' file1 | sed 's/420224/121224/g' | xxd -r -p > new_updated
    execute_command("hexdump -ve '1/1 %s' %s | sed 's/%s/%s/g' | xxd -r -p > %s"%('"%.2X"', input_file, source, target, tmp_file))
    execute_command("mv %s %s"%(tmp_file, input_file))

if __name__ == "__main__":
    input_file = sys.argv[1]
    random_name = "".join(random.sample("ABCDEFGHIJKLMNO", 5))
    print(f"[*] Patch file [{input_file}] `frida` to `{random_name}`")

    binary = lief.parse(input_file)

    for symbol in binary.symbols:
        if symbol.name == "frida_agent_main":
            symbol.name = "main"
        
        if "frida" in symbol.name:
            print(f"frida in {symbol.name}")
            symbol.name = symbol.name.replace("frida", random_name)

        if "FRIDA" in symbol.name:
            print(f"FRIDA in {symbol.name}")
            symbol.name = symbol.name.replace("FRIDA", random_name)

    binary.write(input_file)

    # gum-js-loop thread
    t_feature1 = "gum-js-loop"
    hex_feature = hex_str(t_feature1)
    random_name = "".join(random.sample("abcdefghijklmn", len(t_feature1)))
    print(f"[*] Patch `gum-js-loop` to `{random_name}`")
    #os.system(f"sed -b -i s/gum-js-loop/{random_name}/g {input_file}")
    hex_random_name = hex_str(random_name)
    replace_hex_file(hex_feature, hex_random_name, input_file)

    # gmain thread
    t_feature2 = "gmain"
    hex_feature = hex_str(t_feature2)
    random_name = "".join(random.sample("abcdefghijklmn", len(t_feature2)))
    print(f"[*] Patch `gmain` to `{random_name}`")
    #os.system(f"sed -b -i s/gmain/{random_name}/g {input_file}")
    hex_random_name = hex_str(random_name)
    replace_hex_file(hex_feature, hex_random_name, input_file)

到这里对于frida线程名/文件名特征的修改就结束了,拿着魔改的frida-server试试去吧