移动安全调试框架Frida最新版编译安装指南

admin 2025年4月10日14:07:56评论6 views字数 12496阅读41分39秒阅读模式
移动安全调试框架Frida最新版编译安装指南
移动安全调试框架Frida最新版编译安装指南
移动安全必备,手把手教你编译安装Frida最新版!
移动安全调试框架Frida最新版编译安装指南

在逆向工程与动态分析领域,Frida凭借其强大的脚本化Hook能力和跨平台特性,已成为移动安全研究人员的核心工具之一。然而,随着Frida版本的迭代更新,互联网中可搜索到的其配置资料都较为过时,在编译与安装新版本Frida源码时已经不再适用。本文将结合Frida官方文档与笔者的实践,系统性地梳理Frida目前最新版本的编译与安装的步骤,为大家魔改和编译Frida奠定基础。

  • Frida项目地址:https://github.com/frida/frida
  • 官方文档:https://frida.re/docs/building/
  • 当前Frida版本:16.7.4
  • 环境:MacOS 14.3

从项目地址中clone(包括子项目):

git clone --recurse-submodules https://github.com/frida/frida
移动安全调试框架Frida最新版编译安装指南
一、本地编译与安装
(一)MacOS端证书配置
移动安全调试框架Frida最新版编译安装指南
根据项目README可知,MacOS还需要配置额外的证书才可安装Frida:
移动安全调试框架Frida最新版编译安装指南
接下来的第一步为创建证书,这里选择手动创建安装证书的方式[1]。打开钥匙串访问工具,在菜单中点击“证书助理”->“创建证书”,填写证书名称,身份类型选择“自签名根证书”,证书类型选择“代码签名”,并勾上“让我覆盖这些默认值”:
移动安全调试框架Frida最新版编译安装指南
然后一路继续,有效期可以填长一点,实测最长可以填7300天,直到最后“指定用于该证书的位置”这里选“系统”:

移动安全调试框架Frida最新版编译安装指南

创建完成后退出钥匙串访问工具以刷新。现在使用以下命令可以查找到你的证书,确认keychain这里为"System.keychain"
security find-certificate -c 你的证书名称
移动安全调试框架Frida最新版编译安装指南
使用以下命令以确认证书未过期:
security find-certificate -p -c 你的证书名称 | openssl x509 -checkend 0
移动安全调试框架Frida最新版编译安装指南
接下来第二步是信任证书。重新打开钥匙串访问工具,在“系统”->“证书”中找到前文中创建的证书,右键点击证书选择“显示简介”,在“信任”->“代码签名”处选择“始终信任”。
移动安全调试框架Frida最新版编译安装指南
退出钥匙串访问工具以刷新。然后使用以下命令检查证书信任类型,包含“Code Signing”即可:
security dump-trust-settings -d | grep -A5 你的证书名称
移动安全调试框架Frida最新版编译安装指南
最后配置环境变量
export MACOS_CERTID=你的证书名称export IOS_CERTID=你的证书名称export WATCHOS_CERTID=你的证书名称export TVOS_CERTID=你的证书名称

并且重启taskgated模块以确保新证书被接受:

sudo killall taskgated
(二)项目编译
移动安全调试框架Frida最新版编译安装指南
为本机当前架构编译软件,直接在Frida项目文件夹中运行:

./configure
以进行环境依赖检查和配置。
可以用./configure -h查看可添加的自定义配置,如使用ARM架构的MacOS最好指定前缀(如--prefix=/opt/homebrew)。
usage: configure [-h] [--prefix PREFIX] [--build BUILD] [--host HOST]                 [--enable-symbols] [--enable-shared]                 [--with-meson {internal,system}]                 [--without-prebuilds {toolchain,sdk,sdk:build,sdk:host}]                 [--enable-frida-tools] [--disable-frida-tools]                 [--enable-graft-tool] [--disable-graft-tool]                 [--enable-gadget] [--disable-gadget] [--enable-server]                 [--disable-server] [--enable-portal] [--enable-inject]                 [--disable-inject] [--enable-frida-clr] [--enable-frida-node]                 [--enable-frida-python] [--disable-frida-python]                 [--enable-frida-swift] [--enable-frida-qml]generic options:  -h, --help            show this help message and exit  --prefix PREFIX       install files in PREFIX  --build BUILD         configure for building on BUILD  --host HOST           cross-compile to build binaries to run on HOST  --enable-symbols      build binaries with debug symbols included (default:                        disabled)  --enable-shared       enable building shared libraries (default: disabled)  --with-meson {internal,system}                        which Meson implementation to use (default: internal)  --without-prebuilds {toolchain,sdk,sdk:build,sdk:host}                        do not make use of prebuilt bundlesproject-specific options:  --enable-frida-tools  build CLI tools, like frida, frida-trace, etc.                        (default: auto)  --disable-frida-tools  --enable-graft-tool   build gum-graft tool (default: auto)  --disable-graft-tool  --enable-gadget       build frida-gadget (default: auto)  --disable-gadget  --enable-server       build frida-server (default: auto)  --disable-server  --enable-portal       build frida-portal (default: disabled)  --enable-inject       build frida-inject (default: auto)  --disable-inject  --enable-frida-clr    build .NET bindings (default: disabled)  --enable-frida-node   build Node.js bindings (default: disabled)  --enable-frida-python                        build Python bindings (default: auto)  --disable-frida-python  --enable-frida-swift  build Swift bindings (default: disabled)  --enable-frida-qml    build QML bindings (default: disabled)

注意Frida项目的绝对路径不要含有中文,不然会有一些非常规报错。

如无问题则运行以下命令以进行编译:

make

MacOS端编译期间会弹出多次该对话框,均填写当前具有sudo权限的用户名和密码即可:

移动安全调试框架Frida最新版编译安装指南
如下显示即为编译完成:
移动安全调试框架Frida最新版编译安装指南
(三)安装
移动安全调试框架Frida最新版编译安装指南

一般来说直接运行以下命令即完成本机Frida的安装:

sudo make install
可以看到所安装的内容大致分为以下几类(可以在项目目录内build/meson-info/intro-install_plan.json看到):
// 二进制软件"{bindir}/frida""{bindir}/frida-apk""{bindir}/frida-compile""{bindir}/frida-create""{bindir}/frida-discover""{bindir}/frida-itrace""{bindir}/frida-join""{bindir}/frida-kill""{bindir}/frida-ls""{bindir}/frida-ls-devices""{bindir}/frida-ps""{bindir}/frida-pull""{bindir}/frida-push""{bindir}/frida-rm""{bindir}/frida-trace""{bindir}/gum-graft"// shell自动补全配置"{datadir}/fish/vendor_completions.d/frida.fish"// 头文件"{includedir}/frida-1.0/frida-core.h""{includedir}/frida-1.0/gum/arch-arm/gumarmreg.h""{includedir}/frida-1.0/gum/arch-arm/gumarmrelocator.h""{includedir}/frida-1.0/gum/arch-arm/gumarmwriter.h""{includedir}/frida-1.0/gum/arch-arm/gumthumbrelocator.h""{includedir}/frida-1.0/gum/arch-arm/gumthumbwriter.h""{includedir}/frida-1.0/gum/arch-arm64/gumarm64backtracer.h""{includedir}/frida-1.0/gum/arch-arm64/gumarm64reader.h""{includedir}/frida-1.0/gum/arch-arm64/gumarm64relocator.h""{includedir}/frida-1.0/gum/arch-arm64/gumarm64writer.h""{includedir}/frida-1.0/gum/arch-mips/gummipsrelocator.h""{includedir}/frida-1.0/gum/arch-mips/gummipswriter.h""{includedir}/frida-1.0/gum/arch-x86/gumx86reader.h""{includedir}/frida-1.0/gum/arch-x86/gumx86relocator.h""{includedir}/frida-1.0/gum/arch-x86/gumx86writer.h""{includedir}/frida-1.0/gum/gum-heap.h""{includedir}/frida-1.0/gum/gum-prof.h""{includedir}/frida-1.0/gum/gum.h""{includedir}/frida-1.0/gum/gumapiresolver.h""{includedir}/frida-1.0/gum/gumbacktracer.h""{includedir}/frida-1.0/gum/gumcloak.h""{includedir}/frida-1.0/gum/gumcodeallocator.h""{includedir}/frida-1.0/gum/gumcodesegment.h""{includedir}/frida-1.0/gum/gumdarwin.h""{includedir}/frida-1.0/gum/gumdarwinbacktracer.h""{includedir}/frida-1.0/gum/gumdarwingrafter.h""{includedir}/frida-1.0/gum/gumdarwinmapper.h""{includedir}/frida-1.0/gum/gumdarwinmodule.h""{includedir}/frida-1.0/gum/gumdarwinmoduleresolver.h""{includedir}/frida-1.0/gum/gumdarwinsymbolicator.h""{includedir}/frida-1.0/gum/gumdefs.h""{includedir}/frida-1.0/gum/gumelfmodule.h""{includedir}/frida-1.0/gum/gumenumtypes.h""{includedir}/frida-1.0/gum/gumevent.h""{includedir}/frida-1.0/gum/gumeventsink.h""{includedir}/frida-1.0/gum/gumexceptor.h""{includedir}/frida-1.0/gum/gumfunction.h""{includedir}/frida-1.0/gum/gumheapapi.h""{includedir}/frida-1.0/gum/guminterceptor.h""{includedir}/frida-1.0/gum/guminvocationcontext.h""{includedir}/frida-1.0/gum/guminvocationlistener.h""{includedir}/frida-1.0/gum/gumkernel.h""{includedir}/frida-1.0/gum/gumlibc.h""{includedir}/frida-1.0/gum/gummemory.h""{includedir}/frida-1.0/gum/gummemoryaccessmonitor.h""{includedir}/frida-1.0/gum/gummemorymap.h""{includedir}/frida-1.0/gum/gummetalarray.h""{includedir}/frida-1.0/gum/gummetalhash.h""{includedir}/frida-1.0/gum/gummodule.h""{includedir}/frida-1.0/gum/gummoduleapiresolver.h""{includedir}/frida-1.0/gum/gummodulemap.h""{includedir}/frida-1.0/gum/gummoduleregistry.h""{includedir}/frida-1.0/gum/gumprintf.h""{includedir}/frida-1.0/gum/gumprocess.h""{includedir}/frida-1.0/gum/gumreturnaddress.h""{includedir}/frida-1.0/gum/gumspinlock.h""{includedir}/frida-1.0/gum/gumstalker.h""{includedir}/frida-1.0/gum/gumswiftapiresolver.h""{includedir}/frida-1.0/gum/gumsymbolutil.h""{includedir}/frida-1.0/gum/gumsysinternals.h""{includedir}/frida-1.0/gum/gumthreadregistry.h""{includedir}/frida-1.0/gum/gumtls.h""{includedir}/frida-1.0/gum/heap/gumallocationblock.h""{includedir}/frida-1.0/gum/heap/gumallocationgroup.h""{includedir}/frida-1.0/gum/heap/gumallocationtracker.h""{includedir}/frida-1.0/gum/heap/gumallocatorprobe.h""{includedir}/frida-1.0/gum/heap/gumboundschecker.h""{includedir}/frida-1.0/gum/heap/gumcobject.h""{includedir}/frida-1.0/gum/heap/gumcobjecttracker.h""{includedir}/frida-1.0/gum/heap/guminstancetracker.h""{includedir}/frida-1.0/gum/heap/gumpagepool.h""{includedir}/frida-1.0/gum/heap/gumsanitychecker.h""{includedir}/frida-1.0/gum/prof/gumbusycyclesampler.h""{includedir}/frida-1.0/gum/prof/gumcallcountsampler.h""{includedir}/frida-1.0/gum/prof/gumcyclesampler.h""{includedir}/frida-1.0/gum/prof/gummalloccountsampler.h""{includedir}/frida-1.0/gum/prof/gumprofiler.h""{includedir}/frida-1.0/gum/prof/gumprofilereport.h""{includedir}/frida-1.0/gum/prof/gumsampler.h""{includedir}/frida-1.0/gum/prof/gumusertimesampler.h""{includedir}/frida-1.0/gum/prof/gumwallclocksampler.h""{includedir}/frida-1.0/gumjs/guminspectorserver.h""{includedir}/frida-1.0/gumjs/gumjs.h""{includedir}/frida-1.0/gumjs/gumscript.h""{includedir}/frida-1.0/gumjs/gumscriptbackend.h""{includedir}/frida-1.0/gumjs/gumscriptscheduler.h"// 库文件"{libdir_static}/frida-base-1.0.vapi""{libdir_static}/frida-base.h""{libdir_static}/frida-payload-1.0.vapi""{libdir_static}/frida-payload.h""{libdir_static}/libfrida-base-1.0.a""{libdir_static}/libfrida-gum-1.0.a""{libdir_static}/libfrida-gum-heap-1.0.a""{libdir_static}/libfrida-gum-prof-1.0.a""{libdir_static}/libfrida-gumjs-1.0.a""{libdir_static}/libfrida-gumjs-inspector-1.0.a""{libdir_static}/libfrida-payload-1.0.a""{libdir}/libfrida-core-1.0.a""{libdir}/pkgconfig/frida-base-1.0.pc""{libdir}/pkgconfig/frida-core-1.0.pc""{libdir}/pkgconfig/frida-gum-1.0.pc""{libdir}/pkgconfig/frida-gum-heap-1.0.pc""{libdir}/pkgconfig/frida-gum-prof-1.0.pc""{libdir}/pkgconfig/frida-gumjs-1.0.pc""{libdir}/pkgconfig/frida-gumjs-inspector-1.0.pc""{libdir}/pkgconfig/frida-payload-1.0.pc"// 资源数据"{prefix}/share/gir-1.0/Frida-1.0.gir""{prefix}/share/vala/vapi/frida-gum-1.0.vapi""{prefix}/share/vala/vapi/frida-gum-darwin-1.0.vapi""{prefix}/share/vala/vapi/frida-gum-heap-1.0.vapi""{prefix}/share/vala/vapi/frida-gumjs-1.0.vapi""{prefix}/share/vala/vapi/frida-gumjs-inspector-1.0.vapi"// Python依赖包"{py_platlib}/frida/__init__.py""{py_platlib}/frida/_frida.abi3.so""{py_platlib}/frida/_frida/__init__.pyi""{py_platlib}/frida/_frida/py.typed""{py_platlib}/frida/core.py""{py_platlib}/frida/py.typed""{py_purelib}/frida_tools/__init__.py""{py_purelib}/frida_tools/_repl_magic.py""{py_purelib}/frida_tools/apk.py""{py_purelib}/frida_tools/application.py""{py_purelib}/frida_tools/cli_formatting.py""{py_purelib}/frida_tools/compiler.py""{py_purelib}/frida_tools/creator.py""{py_purelib}/frida_tools/discoverer.py""{py_purelib}/frida_tools/fs_agent.js""{py_purelib}/frida_tools/itracer_agent.js""{py_purelib}/frida_tools/join.py""{py_purelib}/frida_tools/kill.py""{py_purelib}/frida_tools/ls.py""{py_purelib}/frida_tools/lsd.py""{py_purelib}/frida_tools/model.py""{py_purelib}/frida_tools/ps.py""{py_purelib}/frida_tools/pull.py""{py_purelib}/frida_tools/push.py""{py_purelib}/frida_tools/reactor.py""{py_purelib}/frida_tools/repl.py""{py_purelib}/frida_tools/rm.py""{py_purelib}/frida_tools/tracer.py""{py_purelib}/frida_tools/tracer_agent.js""{py_purelib}/frida_tools/tracer_ui/tracer_ui.zip"

这样手动安装的Frida虽然能够成功导入运行,但由于绕过了Python的包管理机制,会导致pip无法正确识别已安装的版本,当后续安装依赖Frida的Python包时,pip会误判Frida缺失而重新下载安装,从而覆盖手动编译的版本。而且这种安装方式默认将Python依赖包安装到/usr/local目录下,如果使用了pyenv等Python环境管理工具,会导致依赖包无法正确安装到当前虚拟环境的site-packages目录中,以至于本机Python导入时找不到模块。

依赖包载入pip list
在PEP 376中有对Python依赖包的规范,需要在依赖包文件夹同目录下包含name + '-' + version + '.dist-info'文件夹,即包目录下需要同时有以下文件夹(make install后应该只有fridafrida_tools):
移动安全调试框架Frida最新版编译安装指南
dist-info文件夹需包含以下内容:
1. METADATA:元数据。 
2. RECORD:记录已安装文件的列表。
3. INSTALLER:记录用于安装项目的工具名称。
Python里提供了相应的生成dist-info文件夹的API,无需手动生成,分别在frida/subprojects/frida-pythonfrida/subprojects/frida-tools目录中使用以下命令即可使用项目中的setup.py生成模块对应的dist-info文件夹:
python3 setup.py dist_info
移动安全调试框架Frida最新版编译安装指南
移动安全调试框架Frida最新版编译安装指南
将生成的两个dist-info文件夹转移到fridafrida_tools文件夹的同目录下即可。此时pip可以正常读取:
$ pip3 list | grep fridafrida                                             16.7.4frida-tools                                       13.6.2.dev18
依赖包转移到可导入路径
如找不到模块,使用以下命令查看当前Python的环境路径:
python3 -c "import site; print(site.getsitepackages())"
将前文中的fridafrida_tools及它们的dist-info文件夹转移到该路径下即可。
移动安全调试框架Frida最新版编译安装指南
二、Android端服务器编译与安装
Android端的编译需要在配置时使用以下命令。注意:该命令会覆盖上一次配置后生成的build文件夹,如换架构编译需将前一次的编译结果备份。
./configure --host=android-arm64
其中host参数用于指定架构编译,如手机为arm64架构那么设置为android-arm64,32位为android-arm
使用该指令需要用环境变量指定NDK,第一次运行时会提示所需的版本:
移动安全调试框架Frida最新版编译安装指南
这说明需要使用r25版NDK。在官网NDK下载链接[2](或旧版本下载链接[3])中下载当前编译环境(如笔者编译环境需下载android-ndk-r26d-darwin.dmg)的对应版本NDK:
移动安全调试框架Frida最新版编译安装指南
下载并提取后将ANDROID_NDK_ROOT环境变量赋值为该NDK的绝对路径:
export ANDROID_NDK_ROOT=/前置路径/AndroidNDK9519653.app/Contents/NDK
然后再次运行以下命令即可完成编译:
./configure --host=android-arm64make
移动安全调试框架Frida最新版编译安装指南
Android端主要需要的是Frida的服务器,将frida/build/subprojects/frida-core/server/frida-server传到手机里就可以了,需要的其他文件如frida-gadget.so也在frida/build/subprojects/frida-core路径下。
移动安全调试框架Frida最新版编译安装指南
三、相关链接
[1]https://sourceware.org/gdb/wiki/PermissionsDarwin

[2]https://developer.android.com/ndk/downloads
[3]https://github.com/android/ndk/wiki/Unsupported-Downloads

移动安全调试框架Frida最新版编译安装指南
山石网科是中国网络安全行业的技术创新领导厂商,由一批知名网络安全技术骨干于2007年创立,并以首批网络安全企业的身份,于2019年9月登陆科创板(股票简称:山石网科,股票代码:688030)。
现阶段,山石网科掌握30项自主研发核心技术,申请560多项国内外专利。山石网科于2019年起,积极布局信创领域,致力于推动国内信息技术创新,并于2021年正式启动安全芯片战略。2023年进行自研ASIC安全芯片的技术研发,旨在通过自主创新,为用户提供更高效、更安全的网络安全保障。目前,山石网科已形成了具备“全息、量化、智能、协同”四大技术特点的涉及边界安全、云安全、数据安全、业务安全、内网安全、智能安全运营、安全服务、安全运维等八大类产品服务,50余个行业和场景的完整解决方案。
移动安全调试框架Frida最新版编译安装指南

原文始发于微信公众号(山石网科安全技术研究院):移动安全调试框架Frida最新版编译安装指南

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月10日14:07:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   移动安全调试框架Frida最新版编译安装指南https://cn-sec.com/archives/3939729.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息