版权归作者所有,如有转发,请注明文章出处:cyrus-studio.github.io/blog/
下载 Frida 源码
Frida 源码:github.com/frida/frida
下载源码
1git clone https://github.com/frida/frida.git 2
安装相关依赖:
1sudo apt-get install build-essential git lib32stdc++-9-dev \ 2 libc6-dev-i386 nodejs npm 3
安装 Python
1sudo apt install -y python3-dev python3-setuptools python3-wheel python3-pip 2
安装 Node.js
nvm 是一个 Node.js 版本管理器,在同一台机器上管理多个 Node.js 版本,并随时切换。
1curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 2 3source ~/.bashrc 4 5nvm install 18 6nvm use 18 7
安装任意版本 Node.js
1nvm install 18 2nvm install 20 3
一键切换
1nvm use 18 2
实现项目隔离,你可以:
1nvm use 18 # 编译 Frida 2nvm use 16 # 其他项目 3
验证:
1node -v 2
安装 NDK
下载并解压 ndk
1mkdir ndk 2cd ndk 3 4wget https://dl.google.com/android/repository/android-ndk-r29-linux.zip 5unzip android-ndk-r29-linux.zip 6
配置 ANDROID_NDK_ROOT
1export ANDROID_NDK_ROOT=~/ndk/android-ndk-r29 2
编译 Frida
设置目标运行平台(host)是 Android ARM64(aarch64)
1$ ./configure --host=android-arm64 2The Meson build system 3Version: 1.4.99 4Source dir: /mnt/case_sensitive/frida 5Build dir: /mnt/case_sensitive/frida/build 6Build type: cross build 7Project name: frida 8Project version: 17.8.3 9C compiler for the host machine: /mnt/case_sensitive/ndk/android-ndk-r29/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -target aarch64-none-linux-android21 (clang 21.0.0 "Android (13989888, +pgo, +bolt, +lto, +mlgo, based on r563880c) clang version 21.0.0 (https://android.googlesource.com/toolchain/llvm-project 5e96669f06077099aa41290cdb4c5e6fa0f59349)") 10C linker for the host machine: /mnt/case_sensitive/ndk/android-ndk-r29/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -target aarch64-none-linux-android21 ld.lld 21.0.0 11C compiler for the build machine: /usr/bin/cc (gcc 11.4.0 "cc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0") 12C linker for the build machine: /usr/bin/cc ld.bfd 2.38 13Build machine cpu family: x86_64 14Build machine cpu: x86_64 15Host machine cpu family: aarch64 16Host machine cpu: aarch64 17Target machine cpu family: aarch64 18Target machine cpu: aarch64 19Program python3 found: YES (/usr/bin/python3) 20... 21
开始编译
1make 2
解决编译报错
fatal error: pyconfig.h: No such file or directory
编译器找不到:pyconfig.h
1[347/349] Compiling C object subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.o 2FAILED: subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.o 3/usr/bin/cc -Isubprojects/frida-python/frida/_frida/_frida.abi3.so.p -Isubprojects/frida-python/frida/_frida -I../subprojects/frida-python/frida/_frida -Isubprojects/frida-core/src/api -I../subprojects/frida-core/src/api -Isubprojects/frida-gum -I../subprojects/frida-gum -Isubprojects/frida-gum/gum -I../subprojects/frida-gum/gum -I../subprojects/frida-gum/gum/arch-x86 -I../subprojects/frida-gum/gum/arch-arm -I../subprojects/frida-gum/gum/arch-arm64 -I../subprojects/frida-gum/gum/arch-mips -Isubprojects/frida-gum/libs -I../subprojects/frida-gum/libs -Isubprojects/frida-gum/libs/gum/heap -I../subprojects/frida-gum/libs/gum/heap -Isubprojects/frida-gum/libs/gum/prof -I../subprojects/frida-gum/libs/gum/prof -I../subprojects/frida-gum/gum/backend-linux/include -I../subprojects/frida-gum/gum/backend-elf -I../subprojects/frida-gum/gum/backend-libunwind/include -Isubprojects/frida-gum/bindings -I../subprojects/frida-gum/bindings -I/usr/lib/include/python3.10 -I/usr/lib/include/x86_64-linux-gnu/python3.10 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/glib-2.0 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/lib/glib-2.0/include -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/gee-0.8 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/json-glib-1.0 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/capstone -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/libsoup-3.0 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/gio-unix-2.0 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/libusb-1.0 -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/quickjs -I/mnt/case_sensitive/frida/deps/sdk-linux-x86_64/include/nice -fvisibility=hidden -fdiagnostics-color=always -DNDEBUG -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Os -g -ffunction-sections -fdata-sections -fPIC -pthread -DNGTCP2_STATICLIB -DNGHTTP2_STATICLIB -DGUM_STATIC -DFFI_STATIC_BUILD -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS -DPy_LIMITED_API=0x03070000 -MD -MQ subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.o -MF subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.o.d -o subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.o -c ../subprojects/frida-python/frida/_frida/extension.c 4../subprojects/frida-python/frida/_frida/extension.c:33:11: fatal error: pyconfig.h: No such file or directory 5 33 | # include <pyconfig.h> 6 | ^~~~~~~~~~~~ 7compilation terminated. 8[348/349] Generating subprojects/frida-core/src/api/frida-core-library with a custom command 9ninja: build stopped: subcommand failed. 10Command '['/usr/bin/python3', '/mnt/case_sensitive/frida/releng/meson/meson.py', 'compile']' returned non-zero exit status 1. 11make: *** [Makefile:4: all] Error 1 12
解决方案:
1# 创建目录 2sudo mkdir /usr/lib/include/ 3 4# 创建一个软链接(symbolic link) 5sudo ln -s /usr/include/python3.10/ /usr/lib/include/ 6
当访问 /usr/include/python3.10 时,实际访问 /usr/lib/include/python3.10
1/mnt/case_sensitive/frida$ find /usr/ -name pyconfig.h 2/usr/include/x86_64-linux-gnu/python3.10/pyconfig.h 3/usr/include/python3.10/pyconfig.h 4
清理并重编译
1rm -rf build 2make 3
查看指定目录的软链接:
1$ ls -l /usr/lib/include 2total 0 3lrwxrwxrwx 1 root root 24 Mar 27 13:25 python3.10 -> /usr/include/python3.10/ 4
有 -> 才是软链接
如果想删除软链接:
1sudo rm /usr/lib/include/python3.10 2
只删除:/usr/lib/include/python3.10 (link),不会删除:/usr/include/python3.10 (真实目录)
EOFError: Compressed file ended before the end-of-stream marker was reached
tar.xz 没下载完整 / 被截断 / 缓存坏了
1$ make 2INFO: autodetecting backend as ninja 3INFO: calculating backend command to run: /mnt/case_sensitive/frida/deps/toolchain-linux-x86_64/bin/ninja 4[265/309] Generating subprojects/frida-core/lib/gadget/frida-gadget with a custom command 5[266/309] Generating subprojects/frida-core/compat/arch-support with a custom command 6FAILED: subprojects/frida-core/compat/arch-support.bundle subprojects/frida-core/compat/frida-helper subprojects/frida-core/compat/frida-agent.so subprojects/frida-core/compat/frida-gadget.so 7/usr/bin/python3 ../subprojects/frida-core/compat/build.py compile subprojects/frida-core/compat/arch-support.bundle.p gASVKQMAAAAAAACMCF9fbWFpbl9flIwFU3RhdGWUk5QpgZR9lCiMBHJvbGWUjApzdWJwcm9qZWN0lIwIYnVpbGRkaXKUjAdwYXRobGlilIwJUG9zaXhQYXRolJOUKIwBL5SMA21udJSMDmNhc2Vfc2Vuc2l0aXZllIwFZnJpZGGUjAVidWlsZJSMC3N1YnByb2plY3RzlIwKZnJpZGEtY29yZZSMBmNvbXBhdJR0lFKUjAx0b3BfYnVpbGRkaXKUaAooaAtoDGgNaA5oD3SUUpSMDWZyaWRhX3ZlcnNpb26UjAYxNy44LjOUjAdob3N0X29zlIwHYW5kcm9pZJSMC2hvc3RfY29uZmlnlE6MEWFsbG93ZWRfcHJlYnVpbGRzlI+UKIwJdG9vbGNoYWlulIwIc2RrOmhvc3SUjAlzZGs6YnVpbGSUkIwHb3V0cHV0c5SMC2NvbGxlY3Rpb25zlIwLT3JkZXJlZERpY3SUk5QpUpQoaACMC091dHB1dEdyb3VwlJOUKYGUfZQojARhcmNolE6MB3RyaXBsZXSUTowNZXh0cmFfZW52aXJvbpR9lHViXZRoAIwGT3V0cHV0lJOUKYGUfZQojAppZGVudGlmaWVylIwTYXJjaF9zdXBwb3J0X2J1bmRsZZSMBG5hbWWUjBNhcmNoLXN1cHBvcnQuYnVuZGxllIwEZmlsZZRoCmgShZRSlIwGdGFyZ2V0lIwAlHViYWgoKYGUfZQoaCuMA2FybZRoLE5oLX2UdWJdlChoMSmBlH2UKGg0jA1oZWxwZXJfbGVnYWN5lGg2jAxmcmlkYS1oZWxwZXKUaDhoCowDc3JjlGhFhpRSlGg7aEV1YmgxKYGUfZQoaDSMDGFnZW50X2xlZ2FjeZRoNowOZnJpZGEtYWdlbnQuc2+UaDhoCowDbGlilIwFYWdlbnSUaEyHlFKUaDuMC2ZyaWRhLWFnZW50lHViaDEpgZR9lChoNIwNZ2FkZ2V0X2xlZ2FjeZRoNowPZnJpZGEtZ2FkZ2V0LnNvlGg4aApoTYwGZ2FkZ2V0lGhVh5RSlGg7jAxmcmlkYS1nYWRnZXSUdWJldXViLg== 8Traceback (most recent call last): 9 File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 680, in <module> 10 main(sys.argv) 11 File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 66, in main 12 args.func(args) 13 File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 61, in <lambda> 14 command.set_defaults(func=lambda args: compile(args.privdir, pickle.loads(base64.b64decode(args.state)))) 15 File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 443, in compile 16 configure(sourcedir=REPO_ROOT, 17 File "/mnt/case_sensitive/frida/releng/meson_configure.py", line 199, in configure 18 host_sdk_prefix, _ = deps.ensure_sdk(host_machine, deps_dir, on_progress=on_progress) 19 File "/mnt/case_sensitive/frida/releng/deps.py", line 142, in ensure_sdk 20 state = sync(Bundle.SDK, machine, sdk_prefix, version, on_progress) 21 File "/mnt/case_sensitive/frida/releng/deps.py", line 208, in sync 22 tar.extractall(staging_dir) 23 File "/usr/lib/python3.10/tarfile.py", line 2289, in extractall 24 self._extract_one(tarinfo, path, set_attrs=not tarinfo.isdir(), 25 File "/usr/lib/python3.10/tarfile.py", line 2352, in _extract_one 26 self._extract_member(tarinfo, os.path.join(path, tarinfo.name), 27 File "/usr/lib/python3.10/tarfile.py", line 2435, in _extract_member 28 self.makefile(tarinfo, targetpath) 29 File "/usr/lib/python3.10/tarfile.py", line 2488, in makefile 30 copyfileobj(source, target, tarinfo.size, ReadError, bufsize) 31 File "/usr/lib/python3.10/tarfile.py", line 252, in copyfileobj 32 buf = src.read(bufsize) 33 File "/usr/lib/python3.10/lzma.py", line 200, in read 34 return self._buffer.read(size) 35 File "/usr/lib/python3.10/_compression.py", line 68, in readinto 36 data = self.read(len(byte_view)) 37 File "/usr/lib/python3.10/_compression.py", line 99, in read 38 raise EOFError("Compressed file ended before the " 39EOFError: Compressed file ended before the end-of-stream marker was reached 40ninja: build stopped: subcommand failed. 41Command '['/usr/bin/python3', '/mnt/case_sensitive/frida/releng/meson/meson.py', 'compile']' returned non-zero exit status 1. 42make: *** [Makefile:4: all] Error 1 43
解决方案:
1# 删除损坏的 SDK 2rm -rf deps/sdk-android-arm64 3 4# 删除 build 5rm -rf build/ 6 7# 重新下载 8./configure --host=android-arm64 9
但一直卡在 Downloading SDK ...
1$ ./configure --host=android-arm64 2Downloading SDK 20260311 for android-arm64... 3
Frida 的 SDK 实际来自:
1https://build.frida.re/deps/ 2
当前日志:
1Downloading SDK 20260311 for android-arm64 2
对应文件是:
1sdk-android-arm64.tar.xz 2
下载地址是:
1https://build.frida.re/deps/20260311/sdk-android-arm64.tar.xz 2
sdk下载链接生成规则就在 releng/deps.py 中
1$ grep -R "build.frida.re" -n releng/ 2releng/deps.py:249: s3_url = "s3://build.frida.re/deps/{version}/{filename}".format(version=version, filename=filename) 3releng/deps.py:1096:BUNDLE_URL = "https://build.frida.re/deps/{version}/{filename}" 4grep: releng/__pycache__/deps.cpython-310.pyc: binary file matches 5releng/post-process-oabi.py:12:ARM64E_URL = "https://build.frida.re/deps/{version}/sdk-ios-arm64e.tar.xz" 6
手动下载并解压 SDK 到 deps
1# 1. 进入 deps 2cd ./deps/ 3 4# 2. 手动下载 5$ wget https://build.frida.re/deps/20260311/sdk-android-arm64.tar.xz 6 7# 3. 解压 8mkdir -p ./sdk-android-arm64 && tar -xf sdk-android-arm64.tar.xz -C ./sdk-android-arm64 --strip-components=1 9 10# 4. 返回 11cd .. 12 13# 5. 继续配置 14./configure --host=android-arm64 15
编译完成
编译完成 frida-server 生成在:
1frida\build\subprojects\frida-core\server\frida-server 2
编译指定版本的 Frida
查看所有 Frida 版本
列出所有版本(tags)
1git tag 2
如果只看 Frida 主版本(过滤):
1git tag | grep ^16 2
或者按时间排序:
1git tag --sort=-creatordate 2
查看当前版本
1git describe --tags 2
或:
1git tag --points-at HEAD 2
编译指定版本
比如编译 frida 16.7.19
1# 切版本 2git checkout 16.7.19 3 4# 强制同步 submodule 到 tag 对应版本 5git submodule update --init --recursive --force 6 7# 确认子模块是否已经同步 8git submodule status 9 10# 清理旧构建 11rm -rf build 12 13# 配置(Android) 14./configure --host=android-arm64 15 16# 编译 17make 18
下载对应版本的 deps
1~/frida$ ./configure --host=android-arm64 2Downloading toolchain 20250512... 3Extracting toolchain... 4Downloading SDK 20250512 for linux-x86_64... 5Extracting SDK... 6Downloading SDK 20250512 for android-arm64... 7Extracting SDK... 8NDK r25 is required (found r29, which is unsupported) 9
不同版本对 NDK 版本要求也不一样
1# 下载对应版本的 NDK 2wget https://dl.google.com/android/repository/android-ndk-r25-linux.zip 3# 解压 NDK 4unzip android-ndk-r29-linux.zip 5 6# 修改 ANDROID_NDK_ROOT 7export ANDROID_NDK_ROOT=~/ndk/android-ndk-r25 8 9# 查看当前 ANDROID_NDK_ROOT 10echo $ANDROID_NDK_ROOT 11
《Frida 源码编译全流程:自己动手编译 frida-server》 是转载文章,点击查看原文。