乐于分享
好东西不私藏

Frida 源码编译全流程:自己动手编译 frida-server

Frida 源码编译全流程:自己动手编译 frida-server

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

下载 Frida 源码

Frida 源码:https://github.com/frida/frida

官方文档:https://frida.re/docs/building/

下载源码

git clone https://github.com/frida/frida.git

安装相关依赖:

sudo apt-get install build-essential git lib32stdc++-9-dev \    libc6-dev-i386 nodejs npm

安装 Python

sudo apt install -y python3-dev python3-setuptools python3-wheel python3-pip

安装 Node.js

nvm 是一个 Node.js 版本管理器,在同一台机器上管理多个 Node.js 版本,并随时切换。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashsource ~/.bashrcnvm install 18nvm use 18

安装任意版本 Node.js

nvm install 18nvm install 20

一键切换

nvm use 18

实现项目隔离,你可以:

nvm use 18   # 编译 Fridanvm use 16   # 其他项目

验证:

node -v

安装 NDK

下载并解压 ndk

mkdir ndkcd ndkwget https://dl.google.com/android/repository/android-ndk-r29-linux.zipunzip android-ndk-r29-linux.zip

配置 ANDROID_NDK_ROOT

export ANDROID_NDK_ROOT=~/ndk/android-ndk-r29

编译 Frida

设置目标运行平台(host)是 Android ARM64(aarch64)

$ ./configure --host=android-arm64The Meson build systemVersion: 1.4.99Source dir: /mnt/case_sensitive/fridaBuild dir: /mnt/case_sensitive/frida/buildBuild type: cross buildProject name: fridaProject version: 17.8.3C 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)")C 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.0C compiler for the build machine: /usr/bin/cc (gcc 11.4.0 "cc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0")C linker for the build machine: /usr/bin/cc ld.bfd 2.38Build machine cpu family: x86_64Build machine cpu: x86_64Host machine cpu family: aarch64Host machine cpu: aarch64Target machine cpu family: aarch64Target machine cpu: aarch64Program python3 found: YES (/usr/bin/python3)...

开始编译

make

解决编译报错

fatal error: pyconfig.h: No such file or directory

编译器找不到:pyconfig.h

[347/349] Compiling C object subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.oFAILED: subprojects/frida-python/frida/_frida/_frida.abi3.so.p/extension.c.o/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../subprojects/frida-python/frida/_frida/extension.c:33:11: fatal error: pyconfig.h: No such file or directory   33 | # include <pyconfig.h>      |           ^~~~~~~~~~~~compilation terminated.[348/349] Generating subprojects/frida-core/src/api/frida-core-library with a custom commandninja: build stopped: subcommand failed.Command '['/usr/bin/python3', '/mnt/case_sensitive/frida/releng/meson/meson.py', 'compile']' returned non-zero exit status 1.make: *** [Makefile:4: all] Error 1

解决方案:

# 创建目录sudo mkdir /usr/lib/include/# 创建一个软链接(symbolic link)sudo ln -s /usr/include/python3.10/ /usr/lib/include/

参考:https://github.com/frida/frida/issues/3253

当访问 /usr/include/python3.10 时,实际访问 /usr/lib/include/python3.10

/mnt/case_sensitive/frida$ find /usr/ -name pyconfig.h/usr/include/x86_64-linux-gnu/python3.10/pyconfig.h/usr/include/python3.10/pyconfig.h

清理并重编译

rm -rf buildmake

查看指定目录的软链接:

$ ls -l /usr/lib/includetotal 0lrwxrwxrwx 1 root root 24 Mar 27 13:25 python3.10 -> /usr/include/python3.10/

有 -> 才是软链接

如果想删除软链接:

sudo rm /usr/lib/include/python3.10

只删除:/usr/lib/include/python3.10  (link),不会删除:/usr/include/python3.10      (真实目录)

EOFError: Compressed file ended before the end-of-stream marker was reached

tar.xz 没下载完整 / 被截断 / 缓存坏了

$ makeINFO: autodetecting backend as ninjaINFO: calculating backend command to run: /mnt/case_sensitive/frida/deps/toolchain-linux-x86_64/bin/ninja[265/309] Generating subprojects/frida-core/lib/gadget/frida-gadget with a custom command[266/309] Generating subprojects/frida-core/compat/arch-support with a custom commandFAILED: 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/usr/bin/python3 ../subprojects/frida-core/compat/build.py compile subprojects/frida-core/compat/arch-support.bundle.p gASVKQMAAAAAAACMCF9fbWFpbl9flIwFU3RhdGWUk5QpgZR9lCiMBHJvbGWUjApzdWJwcm9qZWN0lIwIYnVpbGRkaXKUjAdwYXRobGlilIwJUG9zaXhQYXRolJOUKIwBL5SMA21udJSMDmNhc2Vfc2Vuc2l0aXZllIwFZnJpZGGUjAVidWlsZJSMC3N1YnByb2plY3RzlIwKZnJpZGEtY29yZZSMBmNvbXBhdJR0lFKUjAx0b3BfYnVpbGRkaXKUaAooaAtoDGgNaA5oD3SUUpSMDWZyaWRhX3ZlcnNpb26UjAYxNy44LjOUjAdob3N0X29zlIwHYW5kcm9pZJSMC2hvc3RfY29uZmlnlE6MEWFsbG93ZWRfcHJlYnVpbGRzlI+UKIwJdG9vbGNoYWlulIwIc2RrOmhvc3SUjAlzZGs6YnVpbGSUkIwHb3V0cHV0c5SMC2NvbGxlY3Rpb25zlIwLT3JkZXJlZERpY3SUk5QpUpQoaACMC091dHB1dEdyb3VwlJOUKYGUfZQojARhcmNolE6MB3RyaXBsZXSUTowNZXh0cmFfZW52aXJvbpR9lHViXZRoAIwGT3V0cHV0lJOUKYGUfZQojAppZGVudGlmaWVylIwTYXJjaF9zdXBwb3J0X2J1bmRsZZSMBG5hbWWUjBNhcmNoLXN1cHBvcnQuYnVuZGxllIwEZmlsZZRoCmgShZRSlIwGdGFyZ2V0lIwAlHViYWgoKYGUfZQoaCuMA2FybZRoLE5oLX2UdWJdlChoMSmBlH2UKGg0jA1oZWxwZXJfbGVnYWN5lGg2jAxmcmlkYS1oZWxwZXKUaDhoCowDc3JjlGhFhpRSlGg7aEV1YmgxKYGUfZQoaDSMDGFnZW50X2xlZ2FjeZRoNowOZnJpZGEtYWdlbnQuc2+UaDhoCowDbGlilIwFYWdlbnSUaEyHlFKUaDuMC2ZyaWRhLWFnZW50lHViaDEpgZR9lChoNIwNZ2FkZ2V0X2xlZ2FjeZRoNowPZnJpZGEtZ2FkZ2V0LnNvlGg4aApoTYwGZ2FkZ2V0lGhVh5RSlGg7jAxmcmlkYS1nYWRnZXSUdWJldXViLg==Traceback (most recent call last):  File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 680, in <module>    main(sys.argv)  File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 66, in main    args.func(args)  File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 61, in <lambda>    command.set_defaults(func=lambda args: compile(args.privdir, pickle.loads(base64.b64decode(args.state))))  File "/mnt/case_sensitive/frida/build/../subprojects/frida-core/compat/build.py", line 443, in compile    configure(sourcedir=REPO_ROOT,  File "/mnt/case_sensitive/frida/releng/meson_configure.py", line 199, in configure    host_sdk_prefix, _ = deps.ensure_sdk(host_machine, deps_dir, on_progress=on_progress)  File "/mnt/case_sensitive/frida/releng/deps.py", line 142, in ensure_sdk    state = sync(Bundle.SDK, machine, sdk_prefix, version, on_progress)  File "/mnt/case_sensitive/frida/releng/deps.py", line 208, in sync    tar.extractall(staging_dir)  File "/usr/lib/python3.10/tarfile.py", line 2289, in extractall    self._extract_one(tarinfo, path, set_attrs=not tarinfo.isdir(),  File "/usr/lib/python3.10/tarfile.py", line 2352, in _extract_one    self._extract_member(tarinfo, os.path.join(path, tarinfo.name),  File "/usr/lib/python3.10/tarfile.py", line 2435, in _extract_member    self.makefile(tarinfo, targetpath)  File "/usr/lib/python3.10/tarfile.py", line 2488, in makefile    copyfileobj(source, target, tarinfo.size, ReadError, bufsize)  File "/usr/lib/python3.10/tarfile.py", line 252, in copyfileobj    buf = src.read(bufsize)  File "/usr/lib/python3.10/lzma.py", line 200, in read    return self._buffer.read(size)  File "/usr/lib/python3.10/_compression.py", line 68, in readinto    data = self.read(len(byte_view))  File "/usr/lib/python3.10/_compression.py", line 99, in read    raise EOFError("Compressed file ended before the "EOFError: Compressed file ended before the end-of-stream marker was reachedninja: build stopped: subcommand failed.Command '['/usr/bin/python3', '/mnt/case_sensitive/frida/releng/meson/meson.py', 'compile']' returned non-zero exit status 1.make: *** [Makefile:4: all] Error 1

解决方案:

# 删除损坏的 SDKrm -rf deps/sdk-android-arm64# 删除 buildrm -rf build/# 重新下载./configure --host=android-arm64

但一直卡在 Downloading SDK …

$ ./configure --host=android-arm64Downloading SDK 20260311 for android-arm64...

Frida 的 SDK 实际来自:

https://build.frida.re/deps/

当前日志:

Downloading SDK 20260311 for android-arm64

对应文件是:

sdk-android-arm64.tar.xz

下载地址是:

https://build.frida.re/deps/20260311/sdk-android-arm64.tar.xz

sdk下载链接生成规则就在 releng/deps.py 中

$ grep -R "build.frida.re" -n releng/releng/deps.py:249:    s3_url = "s3://build.frida.re/deps/{version}/{filename}".format(version=version, filename=filename)releng/deps.py:1096:BUNDLE_URL = "https://build.frida.re/deps/{version}/{filename}"grep: releng/__pycache__/deps.cpython-310.pyc: binary file matchesreleng/post-process-oabi.py:12:ARM64E_URL = "https://build.frida.re/deps/{version}/sdk-ios-arm64e.tar.xz"

手动下载并解压 SDK 到 deps

# 1. 进入 depscd ./deps/# 2. 手动下载$ wget https://build.frida.re/deps/20260311/sdk-android-arm64.tar.xz# 3. 解压mkdir -p ./sdk-android-arm64 && tar -xf sdk-android-arm64.tar.xz -C ./sdk-android-arm64 --strip-components=1# 4. 返回cd ..# 5. 继续配置./configure --host=android-arm64

编译完成

编译完成 frida-server 生成在:

frida\build\subprojects\frida-core\server\frida-server
word/media/image1.png

编译指定版本的 Frida

查看所有 Frida 版本

列出所有版本(tags)

git tag

如果只看 Frida 主版本(过滤):

git tag | grep ^16

或者按时间排序:

git tag --sort=-creatordate

查看当前版本

git describe --tags

或:

git tag --points-at HEAD

编译指定版本

比如编译 frida 16.7.19

# 切版本git checkout 16.7.19# 强制同步 submodule 到 tag 对应版本git submodule update --init --recursive --force# 确认子模块是否已经同步git submodule status# 清理旧构建rm -rf build# 配置(Android)./configure --host=android-arm64# 编译make

下载对应版本的 deps

~/frida$ ./configure --host=android-arm64Downloading toolchain 20250512...Extracting toolchain...Downloading SDK 20250512 for linux-x86_64...Extracting SDK...Downloading SDK 20250512 for android-arm64...Extracting SDK...NDK r25 is required (found r29, which is unsupported)

不同版本对 NDK 版本要求也不一样

# 下载对应版本的 NDKwget https://dl.google.com/android/repository/android-ndk-r25-linux.zip# 解压 NDKunzip android-ndk-r29-linux.zip# 修改 ANDROID_NDK_ROOTexport ANDROID_NDK_ROOT=~/ndk/android-ndk-r25# 查看当前 ANDROID_NDK_ROOTecho $ANDROID_NDK_ROOT