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 上构建会遇到三个根本性障碍:
- iOS 没有完整的 GNU 工具链:仓库固件构建依赖
arm-none-eabi-gcc与arm-none-eabi-objcopy(交叉编译器与二进制工具),iOS 的 Cydia/Procursus 软件源中并没有这两个包; - iOS 系统 SDK 缺头文件与框架:编译客户端需要
stdlib.h、OpenSSL 头、以及 macOS 的 OpenCL/OpenGL 框架; - 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 ...) |
clang | iOS 本地 C 编译器,用于编译客户端 |
odcctools | 移植到 iOS 的 binutils/otool 等工具(链接、归档所需) |
gawk | POSIX 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_lib、client/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 实测,其他版本理论上可用):
- 克隆 theos 的 SDK 仓库,把目标版本 SDK(原文测试于 13.7)通过符号链接或移动的方式放到系统 SDK 路径:
git clone <theos/sdks 仓库> ln -s <下载的 iPhoneOS 版本 SDK> /usr/share/SDKs/iPhoneOS.sdk - 删除
stdlib.h中第 188 行的__IOS_PROHIBITED宏:# 编辑 iPhoneOS.sdk/usr/include/stdlib.h,删除第 188 行 # __IOS_PROHIBITED 会把 posix_memalign 等函数标记为 iOS 禁止调用该宏会让客户端代码中合法的内存分配调用在 iOS 目标下直接编译失败,是 iOS 编译最常见的坑之一。
- 克隆 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 头。 - 下载最新的 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.c | armsrc 构建时生成的 FPGA 版本信息源文件 |
armsrc/obj/ | armsrc 的编译产物目录(fullimage.elf 等) |
bootrom/version_pm3.c | bootrom 构建时生成的版本文件(由 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 all和make 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 all与make 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 Class、Subclass: ACM),因此需要第三方内核扩展usbselfserial。其编译好的二进制可从The-SamminAter 的软件源获取(与上文 SWIG 同一源)。
设备插入后,用如下命令把 Proxmark3 虚拟串口导出到指定路径:
usbselfserial -v 0x9ac4 -p 0x4b8f --driver cdcacm -o /tmp/tty.usbmodemiceman1参数说明:
| 参数 | 含义 |
|---|---|
-v 0x9ac4 | USB Vendor ID。仓库源码 common_arm/usb/usb_cdc_desc.c 中写得很清楚:0x9ac4 = J. Westhues(Proxmark3 作者) |
-p 0x4b8f | USB Product ID,同一文件注释为0x4b8f = Proxmark-3 RFID Instrument |
--driver cdcacm | 使用 CDC-ACM 驱动类 |
-o /tmp/tty.usbmodemiceman1 | 输出(模拟)串口设备路径 |
这两组 VID:PID 在仓库中多处印证:driver/77-pm3-usb-device-blacklist-dialout.rules、driver/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 客户端无法与设备通信,原文给出两个排障手段:
- 尝试把端口作为参数显式传给客户端(例如
client/proxmark3 /tmp/tty.usbmodemiceman1); - 运行
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 9→CMD "${PM3LIST[$((N-1))]}" "$@"的调用链)会优先使用/tmp/tty.usbmodemiceman1,从而免去每次手动指定端口。此后即可像桌面端一样通过./pm3进入交互式客户端,或直接调用client/proxmark3 /tmp/tty.usbmodemiceman1。
完整流程速查
- 以 root(默认密码
alpine)安装 Bingner 系依赖,或按 Procursus 方式自行适配(自担风险); - 按 4 步补丁法补齐 iPhoneOS SDK:符号链接 SDK、删除
stdlib.h第 188 行__IOS_PROHIBITED、复制 OpenSSL 头、复制 macOS 的 OpenCL/OpenGL 框架; - 在桌面系统构建固件,将
armsrc/fpga_version_info.c、armsrc/obj/、bootrom/version_pm3.c、bootrom/obj/、recovery/复制到 iOS 端; - 在
/usr/local/bin/放置arm-none-eabi-gcc与arm-none-eabi-objcopy占位脚本,使make all/make install通过; - 安装 usbselfserial,用
-v 0x9ac4 -p 0x4b8f --driver cdcacm导出/tmp/tty.usbmodemiceman1,必要时sudo killall usbmuxd; - 按上文改造 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),仅供参考