文章目录
- 前言
- 一、编译最新版本
- 1.搭建环境
- 2.代码下载
- 3.编译
- 二、魔改再编译
- 1.切换到指定tag:15.1.12
- 2.打hluda patch
- 3.编译
前言
对于frida的编译和魔改想必大家都已经不陌生了,看雪上一搜一大堆,但是大神们基本都是基于ubuntu环境搞的,今天就记录下我在mac环境下编译的详细步骤,其实大体上一致,区别就在于编译环境搭建和负责去特征的anti-anti-frida.py脚本有些差异
一、编译最新版本
好了,下面就开始咔咔一顿操作吧。。。
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目录下的静态库哦!别怪我没提醒你~
(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试试去吧