
radare2 macOS 深度指南代码签名、调试授权与安装打包全解析【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2导读macOS 的代码签名Code Signing与系统完整性保护SIP机制让 radare2 在调试其他进程时面临额外门槛未经正确签名的二进制无法获得调试权限也无法直接以非 root 身份附加到目标进程。本文以 doc/macos.md 为骨架结合仓库中的构建脚本sys/install.sh、sys/build.sh、sys/static.sh、签名 Makefile 目标binr/radare2/Makefile、entitlements 文件binr/radare2/radare2_macos.xml与打包脚本sys/osx-pkg.sh、dist/macos/osx-pkg-uninstall.sh完整讲解在 macOS 上编译安装 radare2、处理 arm64e 指针认证、创建代码签名证书、签署二进制及其动态库、打包 .pkg 与卸载的每一步。读完本文你将能够在不使用 root 权限的前提下让 radare2 的调试器正常附加并调试目标应用并掌握手动签名与自动签名的全部路径。1. 为什么 macOS 上的 radare2 需要额外步骤radare2 是一套 UNIX 风格的逆向工程框架与命令行工具集。在 macOS 上从 Mac OS X 10.6 开始任何需要调试权限的二进制都必须经过代码签名并携带描述其权限的 plist 文件。这意味着如果你希望 radare2 能在非 root 用户身份下调试其他应用就必须完成签名与授权配置否则只能以 root 运行或者干脆无法附加调试。原文档 doc/macos.md 明确指出这套额外步骤同样适用于 iOS 用户详见 doc/ios.md其核心诉求可以概括为三点生成并信任一个代码签名证书默认名为org.radare.radare2用该证书签署 radare2 主程序与所有动态库libr*配置系统权限Developer Tools 组、必要时关闭 SIP使非特权用户能够调试。从源码层面看这些步骤并非散落的手工操作而是被固化进了构建体系sys/build.sh在检测到 Darwin 平台时会自动调用签名目标sys/build.sh 中可见其逻辑${MAKE} macos-sign macos-sign-libs CERTID${CERTID} || ( echo CERTID not defined. If you want the bins signed to debug without root ... )其中CERTID默认即为org.radare.radare2见 sys/build.sh与 Makefile 中的定义保持一致。2. 自动编译安装radare2 在 macOS 上自动编译安装的入口是$ sys/install.shsys/install.sh 会依次完成以下工作解析参数支持--install使用cp而非符号链接、--prefix指定安装前缀、--without-pull跳过远端更新等自动探测 GNU MakemacOS 上优先使用gmake在 Darwin 平台检测系统 capstone 版本决定是否使用--with-syscapstone等配置参数调用 sys/build.sh 完成 configure 与编译通过sudo make symstall默认安装目标可被--install覆盖为install安装到系统。需要说明的是该脚本在 macOS 上默认以符号链接symstall方式安装便于开发迭代若希望复制文件安装请追加--install。此外仓库在doc/下还提供 doc/macos.md 之外的交叉编译参考如 doc/cross-compile.mdmacOS SDK 相关的构建细节可参见 mk/darwin.mk其中会根据xcodebuild -version检测 Xcode 主版本号并在 Xcode 10 时通过-platform_version macos显式指定部署目标与 SDK 版本。3. 常见问题与前置条件3.1 arm64e 调试目标指针认证PAC与特殊构建当 radare2 运行在arm64e处理器Apple A12 及之后的 A 系列、M1 及之后的 M 系列芯片上时系统要求调试器必须针对该特定架构构建因为调试器需要与内核的**指针认证pointer authentication**机制协同工作。要完成这一步需要同时满足三个条件禁用 SIP进入恢复模式开机按住 CMDR打开实用工具菜单中的终端执行csrutil disable为 radare2 设置特定 CFLAGS强制按 arm64e 架构编译为内核设置自定义启动参数。启动参数与编译命令可参考原文档给出的脚本片段# 为内核设置 arm64e 预览 ABI 启动参数并重启 sudo nvram boot-args-arm64e_preview_abi sudo reboot# 以 arm64e 架构编译并安装 radare2 export CFLAGS-arch arm64e sys/install.sh这里的关键在于普通 arm64 构建无法与 arm64e 的指针认证栈正确交互只有按-arch arm64e构建的二进制才能被内核认可为合法的调试器。注意禁用 SIP 会显著降低系统安全性仅应在受控的开发/调试环境中执行。3.2 调试授权的系统级要求如果你希望通过 ssh 使用 radare2 调试器或者 SDK签名环境没有正确配置需要先开启 Developer Tools 的安全服务$ sudo DevToolsSecurity -enable此外macOS 默认不允许调试位于用户主目录之外的二进制。如果确实需要调试/System、/usr/bin等系统路径下的程序就必须禁用 SIP重启 Mac按住CMDR进入恢复模式打开实用工具菜单里的终端输入$ csrutil disable这一限制源自 macOS 的 TCC隐私保护与 SIP 机制主目录之外的可执行文件默认不受用户信任调试器无法对其下断点或读取内存。4. 代码签名让调试器无需 root 运行4.1 自动签名install.sh 做了什么doc/macos.md 说明前文提到的sys/install.sh会在系统钥匙串中安装一个新的代码签名证书并用它签署 radare2。进一步从构建脚本看sys/build.sh 在 Darwin 上会执行${MAKE} macos-sign macos-sign-libs CERTID${CERTID}即同时签署主程序和所有动态库详见下文 4.4。因此如果钥匙串中已存在有效证书走sys/install.sh通常就能一次性完成编译 签名 安装。4.2 手动创建代码签名证书如果你希望完全手动控制可以按以下步骤在 Keychain Access 中创建证书原文档整理基于 LLDB 的 code-signing 指南启动/Applications/Utilities/Keychain Access.app在窗口左上角的 Keychains 列表中选中login钥匙串依次选择菜单Keychain Access → Certificate Assistant → Create a Certificate...填写以下设置Nameorg.radare.radare2Identity TypeSelf Signed RootCertificate TypeCode Signing依次点击Create → Continue → Done点击 My Certificates双击新建的org.radare.radare2证书展开 Trust 折叠区将 Code Signing 信任下拉菜单设为Always Trust并按提示输入用户名/密码授权将名为org.radare.radare2的代码签名证书注意不是同名公钥/私钥从 login 钥匙串拖入左侧 System 钥匙串移动过程中多次授权并选择 Always trusted在 Keychain Access 界面中将 System 钥匙串里的org.radare.radare2拖到桌面得到~/Desktop/org.radare.radare2.cer切换到终端执行$ sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/org.radare.radare2.cer $ rm -f ~/Desktop/org.radare.radare2.cer退出 Keychain Access重启 Mac运行sys/install.sh或者按下文 4.4 手动签名。证书名称并非写死Makefile 中通过CERTID变量指定证书名默认值为org.radare.radare2见 binr/radare2/Makefile。如果你已有其他合法证书可以通过环境变量覆盖$ export CERTID你的证书名 $ sys/install.sh4.3 签名机制背后的 plist 与 entitlements签名并不只是盖章。radare2 在签名时会携带两类属性列表文件Info.plistbinr/radare2/Info.plist描述程序元信息包括CFBundleIdentifierorg.radare.radare2、CFBundleName、CFBundleVersion以及SecTaskAccessallowed/safe权限声明entitlements 文件binr/radare2/radare2_macos.xml声明调试器所需的授权其内容为keycom.apple.security.cs.debugger/key true/ keycom.apple.security.cs.allow-dyld-environment-variables/key true/其中com.apple.security.cs.debugger是 macOS 上调试器权限的关键 entitlement只有携带该授权、且签名受系统信任的二进制才能以非 root 身份附加并调试其他进程。allow-dyld-environment-variables则允许通过DYLD_*环境变量注入动态库加载行为调试注入场景需要。签名时 Makefile 通过-sectcreate __TEXT __info_plist Info.plist把 Info.plist 嵌入 Mach-O 的__TEXT段再以codesign -dvvv --deep -f -s ${CERTID} -i ${BUNDLE} --entitlements radare2_macos.xml radare2完成签署见 binr/radare2/Makefile。4.4 手动签署 radare2 与动态库首先签署 radare2 主程序$ make -C binr/radare2 macossign但这还不够——radare2 的代码被拆分为多个库libr*例如r_core、r_bin、r_debug、r_anal等完整依赖列表见 binr/radare2/Makefile调试器在运行时会动态加载这些 dylib因此每一个依赖库都必须单独签名$ make -C binr/radare2 macos-sign-libs该目标会遍历SIGN_LIBS由各库的libr_*.dylib拼接而成见 binr/radare2/Makefile逐个执行codesign -f -s ${CERTID} $LIB。另一条更省事的路径是构建静态版本后只签一个文件$ sys/static.sh $ make -C binr/radare2 macossignsys/static.sh在 Darwin 分支不会添加-static链接标志sys/static.sh但会以--with-libr、--without-gpl等配置生成聚合库并安装到r2-static/目录最终所有功能被打进单一的可执行文件从而将签名对象从1 个主程序 N 个 dylib简化为1 个二进制。4.5 验证签名与授权非特权用户使用系统自带工具验证签名是否成功、是否被系统信任$ codesign -dv binr/radare2/radare2-dv会输出签名的详细信息签名者、标识、授权等。随后把当前非特权用户加入 Developer Tools 组避免 Xcode 相关的授权弹窗$ sudo dscl . append /Groups/_developer GroupMembership username完成以上全部步骤后即可无需 root直接调试$ r2 -d mybin原文档特别提醒若你已有可用的签名证书可通过设置环境变量CERTID指定其名称从而跳过重新创建证书的步骤。5. 打包与分发生成 macOS .pkgradare2 的 macOS 分发包.pkg由脚本生成$ sys/osx-pkg.sh该脚本本身只是一个转发器真正的工作在 dist/macos/build.sh 中完成。从仓库结构看dist/macos/下包含pkg/radare2.unpkg/PackageInfo包元数据pkg/Resources/安装欢迎文案welcome.rtf、许可证COPYING、COPYING.LESSER与图标pkg/Distribution安装器分发描述。生成的 .pkg 可通过系统installer命令安装见 dist/macos/Makefile$ installer -pkg *.pkg -target /如果你使用 Homebrew仓库也提供了对应的打包配方 dist/brew/radare2.rb可作为以 brew 方式构建与分发的参考。6. 卸载 .pkg 安装的 radare2卸载从 r2 官网下载、或由sys/osx-pkg.sh生成的 .pkg 时核心思路是用pkgutil查询该包实际写入了哪些文件再逐一删除。原文档给出的命令如下以 root 执行$ pkgutil --only-files --files org.radare.radare2 | sed s/^/\// | tr \n \0 | xargs -o -n 1 -0 rm -i命令分解说明pkgutil --only-files --files org.radare.radare2列出该包注册的所有文件相对路径sed s/^/\//为每个相对路径补上根前缀/还原为绝对路径tr \n \0把换行分隔转成 NUL 分隔避免路径含空格时被拆分xargs -o -n 1 -0 rm -i逐个删除-i会逐条询问确认。仓库还提供了一个更彻底的卸载脚本 dist/macos/osx-pkg-uninstall.sh它会先删除包记录的全部文件再删除包记录的全部空目录最后执行pkgutil --forget org.radare.radare2注销包注册信息可视为上述命令的安全增强版。7. 常见问题速查现象原因解决方案r2 -d附加失败或无权限二进制未签名或证书不受信任完成第 4 节签名流程并确认证书信任设为 Always Trust提示缺少调试权限Developer Tools 未开启sudo DevToolsSecurity -enable无法调试主目录之外的二进制SIP 限制恢复模式下csrutil disable后重启arm64e 机器上调试异常未按 arm64e 构建PAC 无法协作设置CFLAGS-arch arm64e并写入-arm64e_preview_abi启动参数动态库未签名只签了主程序执行make -C binr/radare2 macos-sign-libs或改用静态构建已有自己的证书默认证书名不匹配export CERTID证书名后重新签名/安装8. 延伸阅读iOS 平台存在相似的签名需求请阅读 doc/ios.mdmacOS 专用构建参数Xcode 版本检测、SDK 版本指定见 mk/darwin.mk静态构建的完整流程与验证逻辑见 sys/static.sh签名目标的实现细节macossign、macos-sign-libs、iOS 签名目标见 binr/radare2/Makefile调试器架构与使用方式可参考 doc/debug.md、doc/debug-internals.md。至此从一键安装到手动签名、从 arm64e 特殊构建到 .pkg 打包卸载macOS 上的 radare2 调试链路已经完整打通。你现在应该能够独立完成签名 → 授权 → 免 root 调试的整套配置并理解每一步背后的系统机制与源码依据。【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考