news 2026/9/18 20:59:05

Proxmark3(Iceman 分支)iOS 编译与安装指南:依赖、工具链补丁、固件与串口打通全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Proxmark3(Iceman 分支)iOS 编译与安装指南:依赖、工具链补丁、固件与串口打通全流程

Proxmark3(Iceman 分支)iOS 编译与安装指南:依赖、工具链补丁、固件与串口打通全流程

【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3

本指南面向希望在 iPhone/iPad(越狱环境)上直接编译 Iceman 分支 Proxmark3 客户端并连接硬件的开发者,完整覆盖 iOS 下依赖安装(Bingner / Procursus 两种 bootstrap)、缺失 SDK 与补丁的处理、交叉编译产物迁移、make install工作区绕过技巧,以及通过 usbselfserial 在 iOS 上建立 Proxmark3 串口通信的完整流程。读完本文,你将掌握在 iOS 上从零搭建 Proxmark3 编译环境、产出客户端可执行文件并让pm3自动识别设备的整套实战方案。

来源文档:iOS-Installation-Instructions.md。本文以该文档为骨架,并结合仓库内 pm3 启动脚本、Makefile、bootrom/Makefile、common_arm/usb/usb_cdc_desc.c 等源码进行深化说明。

背景与核心难点

Proxmark3 是一个软硬件紧耦合的 RFID 研究平台,Iceman 分支将固件(bootrom、fullimage、recovery)与 PC 端客户端(client/proxmark3)放在同一个仓库统一构建。常规 Linux/macOS 编译流程见 0_Compilation-Instructions.md,其核心命令是:

make clean && make -j

但在 iOS 上构建会遇到三个根本性障碍:

  1. iOS 没有完整的 GNU 工具链:仓库固件构建依赖arm-none-eabi-gccarm-none-eabi-objcopy(交叉编译器与二进制工具),iOS 的 Cydia/Procursus 软件源中并没有这两个包;
  2. iOS 系统 SDK 缺头文件与框架:编译客户端需要stdlib.h、OpenSSL 头、以及 macOS 的 OpenCL/OpenGL 框架;
  3. iOS 不支持 USB-CDC ACM 串口:即使编译成功,系统也不提供/dev/tty.*式的虚拟串口节点,需要第三方内核驱动(usbselfserial)来桥接。

下文按原文档顺序逐项展开。

安装所需依赖

原文明确提醒:若使用 unc0ver 或 checkra1n 越狱,请走 “On Bingner bootstrap” 一节;否则走 “On Procursus bootstrap” 一节。同时原文也给出警告——在 Procursus bootstrap 或 rootless(无根)越狱上编译尚未被实际验证("compilation has not yet been attempted... Attempt at your own peril"),这一点至今仍是先决条件,请自行评估风险。

On Bingner bootstrap

Bingner 系越狱(unc0ver / checkra1n 默认环境)默认没有安装sudo,因此需要以root身份执行安装命令,默认 root 密码为alpine

apt install git make clang odcctools gawk sudo pkg-config python3.7 libpython3.7-dev

逐项说明各依赖的用途:

包名用途
git克隆 Iceman 仓库、拉取最新提交
make驱动整个 Makefile 构建体系(见 Makefile,其中TARGETS := bootrom armsrc recovery client ...
clangiOS 本地 C 编译器,用于编译客户端
odcctools移植到 iOS 的 binutils/otool 等工具(链接、归档所需)
gawkPOSIX awk 的 GNU 实现,pm3脚本的设备枚举依赖awk文本处理
sudo后续sudo make install所需
pkg-config编译客户端时定位依赖库
python3.7/libpython3.7-dev客户端构建需要 Python 3 开发头(仓库中tools/mkversion.sh等构建脚本也依赖 Python)

此外,如果是从 git 而非发布包构建,还需要 SWIG——它用于为 Lua 生成客户端绑定(client/experimental_libclient/experimental_client_with_swig)。原文给出的获取方式是The-SamminAter 的软件源(该源同时提供下述 usbselfserial 的编译产物)。

On Procursus bootstrap

Procursus 系(如 Odyssey、Taurine 等新式越狱)目前只能靠自己摸索:

  • 大多数包名与 Bingner 类似,可以直接用apt install git make clang ...尝试;
  • Procursus 打包组件的方式与 bingner 不同(例如工具链拆分、头文件位置差异),某些依赖可能装不上或路径不对;
  • 如果使用的是rootless 越狱且要从 git 构建,很可能需要自己移植 SWIG

换句话说,原文档对 Procursus 的态度是"自担风险"(on your own),本小节没有任何可照抄的命令,只建议:先按 Bingner 的命令清单逐包检查,再根据报错自行调整。

Patched SDK 与附加补丁

iOS 的 SDK 本身不完整,无法直接编译客户端,需要按以下 4 步手工补齐(原文以 iOS 13.7 SDK 实测,其他版本理论上可用):

  1. 克隆 theos 的 SDK 仓库,把目标版本 SDK(原文测试于 13.7)通过符号链接或移动的方式放到系统 SDK 路径:
    git clone <theos/sdks 仓库> ln -s <下载的 iPhoneOS 版本 SDK> /usr/share/SDKs/iPhoneOS.sdk
  2. 删除stdlib.h中第 188 行的__IOS_PROHIBITED
    # 编辑 iPhoneOS.sdk/usr/include/stdlib.h,删除第 188 行 # __IOS_PROHIBITED 会把 posix_memalign 等函数标记为 iOS 禁止调用

    该宏会让客户端代码中合法的内存分配调用在 iOS 目标下直接编译失败,是 iOS 编译最常见的坑之一。

  3. 克隆 theos 的 headers 仓库,把其中的headers/openssl目录复制进 SDK:
    git clone <theos/headers 仓库> cp -r headers/openssl iPhoneOS.sdk/usr/include/

    仓库客户端(client/src下的 EMV、mifare 等模块)依赖 OpenSSL 的 EVP/HMAC 接口,iOS SDK 本身不带 OpenSSL 头。

  4. 下载最新的 macOS SDK(原文测试于 11.3),把其中两个框架复制进 iOS SDK:
    # 从 phracker/MacOSX-SDKs 下载 macOS SDK cp -r MacOSX.sdk/System/Library/Frameworks/OpenCL.framework iPhoneOS.sdk/System/Library/Frameworks/ cp -r MacOSX.sdk/System/Library/Frameworks/OpenGL.framework iPhoneOS.sdk/System/Library/Frameworks/

    这两个框架服务于tools/hitag2crack/crack5opencl(基于 OpenCL 的 hitag2 暴力破解工具)。

编译 OpenCL 工具时的预期告警

原文特别指出,编译hitag2crack/crack5opencl时下面这条ld告警是预期行为,可以忽略:

ld: warning: building for iOS, but linking in .tbd file (/usr/share/SDKs/iPhoneOS.sdk/System/Library/Frameworks//OpenCL.framework/OpenCL.tbd) built for macOS

原因是 OpenCL.tbd 这个链接描述文件本身是为 macOS 构建的,借用到 iOS SDK 后 ld 会发出警告,但链接仍能成功。

克隆 Iceman 仓库

依赖与 SDK 就绪后,克隆仓库:

git clone https://github.com/RfidResearchGroup/proxmark3.git cd proxmark3

本文所分析的仓库即该 Iceman 分支的当前快照。若想保持最新,可参考 0_Compilation-Instructions.md 中"Get the latest commits"一节的git pull流程。

编译并使用项目

依赖齐备后,大部分编译步骤可以沿用仓库通用编译文档 0_Compilation-Instructions.md(原文原话:now you're ready to (mostly) follow the compilation instructions),但有三处 iOS 特有问题需要单独处理,下面分节说明。

bootrom、fullimage 与 recovery 必须跨平台预构建

Proxmark3 固件由三部分组成:

  • bootrom:引导加载程序,负责 USB 启动与刷写入口;
  • fullimage(armsrc):主固件镜像,实现全部射频功能(HF/LF 协议栈在 armsrc 目录);
  • recovery:恢复模式固件,用于变砖救援。

由于 iOS 上没有arm-none-eabi-gcc(也没有arm-none-eabi-objcopy),这三部分无法在 iOS 上构建,必须在一台桌面系统(Linux/macOS)上先构建好,再把以下产物复制到 iOS 端:

需要复制的文件/目录说明
armsrc/fpga_version_info.carmsrc 构建时生成的 FPGA 版本信息源文件
armsrc/obj/armsrc 的编译产物目录(fullimage.elf 等)
bootrom/version_pm3.cbootrom 构建时生成的版本文件(由 bootrom/Makefile 通过version_pm3.c: default_version_pm3.c .FORCE规则每次编译强制重新生成)
bootrom/obj/bootrom 的编译产物目录(bootrom.elf 等)
recovery/整个恢复固件目录

这些产物在仓库根 Makefile 中对应TARGETS := bootrom armsrc recovery client mfc_card_only ...中的固件目标。缺少它们时,客户端其余部分仍能编译成功,但make allmake install会失败——这正是下一步要做工作区绕过的原因。

make install:用占位脚本骗过构建系统

由于固件目标依赖交叉工具链,而 iOS 上无法安装,原文给出一个巧妙的 workaround:在/usr/local/bin/下创建两个只打印参数、不真正干活的脚本,冒充交叉工具链,让make all/make install流程顺利跑完:

/usr/local/bin/arm-none-eabi-gcc

#!/bin/bash #This exists just to trick proxmark3 into making the fullimage, bootrom, and recovery #Don't worry about it cc --version echo "Arguments: $@"

/usr/local/bin/arm-none-eabi-objcopy:内容完全相同。

#!/bin/bash cc --version echo "Arguments: $@"

创建后需赋予执行权限(chmod +x /usr/local/bin/arm-none-eabi-gcc /usr/local/bin/arm-none-eabi-objcopy)。由于固件 ELF 已经在桌面端交叉编译好并复制进armsrc/obj/bootrom/obj/recovery/,iOS 端的 Makefile 只是"看到"工具存在即认为构建成功,因此这两个占位脚本能让make allmake install顺利通过。原文原话:With those in place,make allandmake installwill run flawlessly.

说明:这两条命令位于仓库之外的系统路径(/usr/local/bin/),属于文档指示的安装/配置动作,与仓库内容无关。

usbselfserial:打通 iOS 上的 USB 串口

iOS 内核不支持 USB-CDC ACM 类设备(这正是 Proxmark3 在 USB 上呈现的接口类,见 common_arm/usb/usb_cdc_desc.c 中设备描述符Device Class: Communication Device ClassSubclass: ACM),因此需要第三方内核扩展usbselfserial。其编译好的二进制可从The-SamminAter 的软件源获取(与上文 SWIG 同一源)。

设备插入后,用如下命令把 Proxmark3 虚拟串口导出到指定路径:

usbselfserial -v 0x9ac4 -p 0x4b8f --driver cdcacm -o /tmp/tty.usbmodemiceman1

参数说明:

参数含义
-v 0x9ac4USB Vendor ID。仓库源码 common_arm/usb/usb_cdc_desc.c 中写得很清楚:0x9ac4 = J. Westhues(Proxmark3 作者)
-p 0x4b8fUSB Product ID,同一文件注释为0x4b8f = Proxmark-3 RFID Instrument
--driver cdcacm使用 CDC-ACM 驱动类
-o /tmp/tty.usbmodemiceman1输出(模拟)串口设备路径

这两组 VID:PID 在仓库中多处印证:driver/77-pm3-usb-device-blacklist-dialout.rulesdriver/77-pm3-usb-device-blacklist-uucp.rules中均有ATTRS{idVendor}=="9ac4", ATTRS{idProduct}=="4b8f"的匹配规则;pm3 脚本在 Windows 分支也使用VID_9AC4&PID_4B8F匹配设备。对于 PM3 Easy 之外的设备,请按实际 VID/PID 调整参数(PM3 Easy 是当前 Iceman 固件默认描述符的目标硬件之一)。

若 proxmark3 客户端无法与设备通信,原文给出两个排障手段:

  1. 尝试把端口作为参数显式传给客户端(例如client/proxmark3 /tmp/tty.usbmodemiceman1);
  2. 运行sudo killall usbmuxd——usbmuxd是 iOS 的 USB 复用守护进程,可能抢占了对 USB 设备的访问。

修改 pm3 脚本自动选择端口

最后,为了让仓库自带的 pm3 启动脚本在 iOS 上自动选择串口,原文建议在脚本的get_pm3_list_macOS函数中硬编码端口。该函数在仓库 pm3 中的原始实现如下(通过ioreg遍历IOUSBHostDevice,筛选 USB 厂商名为proxmark.org的设备,取其IODialinDevice串口):

function get_pm3_list_macOS { N=$1 PM3LIST=() for DEV in $(ioreg -r -c "IOUSBHostDevice" -l | awk -F '"' ' $2=="USB Vendor Name"{b=($4=="proxmark.org")} b==1 && $2=="IODialinDevice"{print $4}'); do PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi done }

iOS 设备上不存在ioreg,因此需要按原文给出的方式改造——把PM3LIST直接初始化为 usbselfserial 导出的串口路径:

function get_pm3_list_macOS { N=$1 #PM3LIST=() PM3LIST=(/tmp/tty.usbmodemiceman1) #<-- our addition for DEV in $(ioreg -r -c "IOUSBHostDevice" -l | awk -F '"' ' $2=="USB Vendor Name"{b=($4=="proxmark.org")} b==1 && $2=="IODialinDevice"{print $4}'); do PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi done }

这样pm3脚本启动时(脚本尾部$GETPM3LIST 9CMD "${PM3LIST[$((N-1))]}" "$@"的调用链)会优先使用/tmp/tty.usbmodemiceman1,从而免去每次手动指定端口。此后即可像桌面端一样通过./pm3进入交互式客户端,或直接调用client/proxmark3 /tmp/tty.usbmodemiceman1

完整流程速查

  1. 以 root(默认密码alpine)安装 Bingner 系依赖,或按 Procursus 方式自行适配(自担风险);
  2. 按 4 步补丁法补齐 iPhoneOS SDK:符号链接 SDK、删除stdlib.h第 188 行__IOS_PROHIBITED、复制 OpenSSL 头、复制 macOS 的 OpenCL/OpenGL 框架;
  3. 在桌面系统构建固件,将armsrc/fpga_version_info.carmsrc/obj/bootrom/version_pm3.cbootrom/obj/recovery/复制到 iOS 端;
  4. /usr/local/bin/放置arm-none-eabi-gccarm-none-eabi-objcopy占位脚本,使make all/make install通过;
  5. 安装 usbselfserial,用-v 0x9ac4 -p 0x4b8f --driver cdcacm导出/tmp/tty.usbmodemiceman1,必要时sudo killall usbmuxd
  6. 按上文改造 pm3 的get_pm3_list_macOS,之后即可自动连接设备使用。

局限性与注意事项

  • Procursus / rootless 越狱上编译尚未被社区验证,这是原文档明确标注的前提,请勿盲目照搬 Bingner 命令;
  • 固件与客户端版本必须匹配:仓库编译文档 0_Compilation-Instructions.md 强调"client and firmware should always be in sync",刷写时若出现版本不匹配告警需使用--force参数强制刷写(pm3-flash-all --force);
  • hitag2crack/crack5opencl编译时的 OpenCL.tbd告警属预期现象,不影响结果;
  • 本指南只解决"在 iOS 上编译并连接客户端"的问题,固件刷写(pm3-flash-all)仍需在桌面环境完成;
  • 文章中涉及的第三方软件源与外部工具(The-SamminAter 源、usbselfserial、theos 的 sdks/headers、phracker/MacOSX-SDKs)均为原文档指向的外部资源,请自行评估其可信度与时效性。

【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 20:13:41

如何把闲置电视盒刷成 Armbian 服务器:完整刷机与避坑指南

如何把闲置电视盒刷成 Armbian 服务器&#xff1a;完整刷机与避坑指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk35…

作者头像 李华
网站建设 2026/9/18 21:17:35

从 .doc 到筛查接口:0-3岁婴幼儿发展标准结构化落地

简介&#xff1a;这份《0—3岁婴幼儿发展标准》文档面向家长、早教从业者及婴幼儿照护相关人员&#xff0c;用于按月龄对照观察宝宝在大运动、精细动作、认知、语言、社交与自理等方面的发育表现&#xff0c;帮助判断成长节点并留存阶段记录。内容以月龄为线索&#xff0c;从1个…

作者头像 李华
网站建设 2026/9/17 20:12:18

基于STM32声学激波自动报靶系统:时间戳捕获与TDOA解算实践

简介&#xff1a;这是一份本科毕业设计论文&#xff0c;主题为基于单片机控制的自动报靶系统设计&#xff0c;面向电子信息、自动化、嵌入式等相关专业学生&#xff0c;可作为课程设计、毕业设计或射击训练智能化项目参考。论文围绕自动报靶系统的完整设计方案展开&#xff0c;…

作者头像 李华
网站建设 2026/9/17 20:11:57

Hermes 跑本地 Agent 任务:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 20:10:56

NocoBase RunJS 国际化翻译指南:精通 ctx.t() 的多语言文案方案

NocoBase RunJS 国际化翻译指南&#xff1a;精通 ctx.t() 的多语言文案方案 【免费下载链接】nocobase NocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production…

作者头像 李华
网站建设 2026/9/17 20:10:17

基于树莓派与Python的黄瓜病斑识别系统设计与部署

简介&#xff1a;基于树莓派和Python的黄瓜病斑识别系统设计文档&#xff0c;面向农业信息化、嵌入式视觉方向的开发者与相关专业学生&#xff0c;系统讲解利用树莓派3B、摄像头及Python完成黄瓜叶片图像采集、预处理、OTSU分割、灰度化与中值滤波去噪&#xff0c;并依据病斑面…

作者头像 李华