尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenCorePkg 之 macserial 序列号格式深度解析:Apple Mac 序列号(SN)与逻辑板序列号(MLB)逆向编码完全指南

OpenCorePkg 之 macserial 序列号格式深度解析:Apple Mac 序列号(SN)与逻辑板序列号(MLB)逆向编码完全指南 OpenCorePkg 之 macserial 序列号格式深度解析Apple Mac 序列号SN与逻辑板序列号MLB逆向编码完全指南【免费下载链接】OpenCorePkgOpenCore bootloader项目地址: https://gitcode.com/gh_mirrors/op/OpenCorePkg导读本文以 OpenCorePkg 仓库中 Utilities/macserial/FORMAT.md 为主体系统讲解 Apple Mac 硬件序列号的逆向工程结构包括旧式 11 位与新式 12 位序列号SN的字段划分、Apple base 34 编码规则、生产地点/年份/周次/生产线/产品型号的逐一解码方法以及逻辑板序列号MLB13 位与 17 位格式、EEE 代码与校验和算法。读完本文你将能够使用 macserial 工具解码任意序列号、判断序列号与机型的匹配关系、验证 MLB 校验和并结合 Apple 官方支持门户核验硬件信息。本文所述全部编码规则均来自 OpenCorePkg 社区的逆向工程成果属于实验性结论可能存在个别不准确之处仅用于教育与入门目的。macserial 工具概述与基本用法macserial 是 OpenCorePkg 附带的一个命令行工具用于获取和解码 Mac 序列号Serial Number与主板标识符Board Identifier从而提供关于硬件生产的更多信息。其配套文档即本文主体位于 Utilities/macserial/FORMAT.md工具源码位于 Utilities/macserial/macserial.c。该工具需要支持 C99 的编译器构建在 macOS 上还链接了IOKit与CoreFoundation框架见 Utilities/macserial/Makefile。在 macOS 上预编译二进制适用于 macOS 10.4 及以上版本。常用命令查看当前 Mac 的序列号信息直接运行./macserial在 macOS 上会通过 IORegistry 读取IODeviceTree:/下的model、board-id、IOPlatformSerialNumber等键值见 macserial.c解码任意序列号./macserial -i SERIALNUMBER其中SERIALNUMBER为要检查的序列号其他常用参数源码中usage()函数完整列出见 macserial.c参数长参数功能-i serial--info解码序列号信息-g--generate为当前机型生成序列号-a--generate-all为所有机型生成序列号-d serial--deriv生成指定序列号的全部派生副本derivatives-l--list列出已知 Mac 机型及生产地点代码-lp--list-products列出已知产品代码-mlb serial--mlb基于序列号生成 MLB--verify mlb验证 MLB 校验和-s--sys获取系统信息-m model--model指定生成所用的机型名称或索引-n num--num指定生成对数默认 10-y year--year指定生成年份2000–2030-w week--week指定生成周次1–53-c loc--country指定生产地点代码2 或 3 字符-o copy--copy指定生产副本索引1–34-e line--line指定生产线编号0–3399-p ppp--platform指定平台代码3 或 4 字符上述参数的范围约束如年份 2000–2030、周次 1–53、行号 0–3399、副本 1–34均定义于 macserial.h 中的宏常量并在命令行解析阶段逐一校验见 macserial.c。为什么需要了解序列号结构购买二手 Apple 产品时序列号是首先要查验的信息Apple 官方支持站点 Apple Check Coverage 是最直接的核验渠道。但该站点并不会展示序列号中编码的全部细节而某些细节可能很重要——例如个别不良商家会把一个有效序列号替换成另一个肉眼很难察觉该序列号并不属于实际机型。理解序列号的编码结构正是识破这类问题的基础。此外对于旧式 11 位序列号RM生产地点代码直接标示“官方翻新机”Refurbished这在实际选购中极具参考价值。Apple base 34 编码基础序列号中的部分字段采用 base 34 编码。这是一种稍不寻常的字母数字编码使用0–9与A–Z共 34 个字符但排除了O与I避免与数字0和1混淆。在源码 modelinfo.h 中该编码表被实现为// Used for line/copy: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z static int32_t AppleTblBase34[] {10, 11, 12, 13, 14, 15, 16, 17, 0, 18, 19, 20, 21, 22, 0, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}; static const char *AppleBase34Blacklist IO; static const char *AppleBase34Reverse 0123456789ABCDEFGHJKLMNPQRSTUVWXYZ;完整字符对照表如下| 字符 | 值 | 字符 | 值 | | ---- | -- | ---- | -- | |0| 0 |H| 17 | |1| 1 |J| 18 | |2| 2 |K| 19 | |3| 3 |L| 20 | |4| 4 |M| 21 | |5| 5 |N| 22 | |6| 6 |P| 23 | |7| 7 |Q| 24 | |8| 8 |R| 25 | |9| 9 |S| 26 | |A| 10 |T| 27 | |B| 11 |U| 28 | |C| 12 |V| 29 | |D| 13 |W| 30 | |E| 14 |X| 31 | |F| 15 |Y| 32 | |G| 16 |Z| 33 |macserial 在解析时会对输入串中的每个字符校验字母表合法性源码中get_serial_info()明确检查字符必须是A–Z且不含O、I或属于0–9否则打印WARN: Invalid symbol并标记该序列号可能无效见 macserial.c。序列号SN总体格式Apple Mac 序列号一般存在两种相似的编码格式旧式 11 位格式与新式 12 位格式。类型地点年份周次生产线产品旧式11 位LLYWWSSSPPP新式12 位LLLYWSSSPPPP注意2021 年末以后的机型包含 10 字符格式的序列号该说明来自原文档属 Apple 后续调整macserial 源码中目前仍以 11/12 位为基准解析。macserial 在get_serial_info()中会首先校验序列号长度必须为 11 或 12 位否则直接报错见 macserial.c。解析时按如下顺序推进先读取末尾的机型代码并查表匹配机型 → 再解析开头的地点代码 → 随后解析年份与周次 → 最后解析生产线/副本三字符对应 macserial.c。地点Location地点字段编码生产地信息通常比“Made in China”这类标签更具描述性因为它可能揭示负责生产的具体公司与城市。例如新式 3 字符代码F5K表示USA (Flextronics)伟创力QT表示Taiwan (Quanta Computer)广达电脑。该列表并非标准化或公开发布但可以通过运行./macserial -l查看已知地点。源码 modelinfo.h 内置了地点代码表例如旧式地点代码2 字符CK爱尔兰 Cork、CY韩国、FC美国 Fountain, Colorado、XA/XB美国 ElkGrove/Sacramento、PT韩国、QT台湾 Quanta、RN墨西哥、RM翻新机、SG新加坡、W8中国上海、YM中国等新式地点代码3 字符C02/C07中国 Quanta、CK2爱尔兰 Cork、F5K美国 Flextronics、YM0中国 Hon Hai/Foxconn等。其中旧式序列号的一个重要地点是RM它表示该机型为官方翻新Refurbished产品。对于新式序列号是否翻新无法从序列号直接看出需要联系 Apple 支持确认。年份Year年份字段编码机型的实际制造年份。对于翻新机型无法确定该字段是否被替换为再制造年份。旧式序列号的年份始终是一个数字字符编码年份的个位数。例如8表示 2008 年1表示 2011 年。年份编码只使用0–9数字。旧式序列号从 2013 年起不再使用因此3表示 2003 年而非 2013 年字符年份32003420045200562006720078200892009020101201122012源码 macserial.c 印证了这一规则当字符为0–2时解码为2010 差值为3–9时解码为2000 差值。注释中特别说明该结论由 MacPro5,1 在 2011 与 2012 年的有效序列号证实。新式序列号的年份是一个字母数字字符不仅编码年份还编码该年的上半年/下半年。并非所有字符都允许使用。下表给出各支持年份对应的字符对——对中的第一个字符被认为编码该年上半年第二个字符编码下半年字符对年份C,D2010F,G2011H,J2012K,L2013M,N2014P,Q2015R,S2016T,V2017W,X2018Y,Z2019C,D2020F,G2021源码 modelinfo.h 中的年份转换表与此一致// Used for year: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z static int32_t AppleTblYear[] { 0, 0, 0, 0, 0, 1, 1, 2, 0, 2, 3, 3, 4, 4, 0, 5, 5, 6, 6, 7, 0, 7, 8, 8, 9, 9}; static const char *AppleYearBlacklist ABEIOU; static const char *AppleYearReverse CDFGHJKLMNPQRSTVWXYZ;注意年份编码存在歧义C/D同时对应 2010 与 2020。源码在解码时通过机型信息消歧——若机型首次生产的年份 ≥ 2017 且解码年份 7或解码年份为 0 且机型代码首字母 ≥H则加上 2020否则加上 2010见 macserial.c。AppleYearReverse反转表则用于生成见get_serial()中AppleYearReverse[(decodedYear - base) * 2 (week 27)]的逻辑macserial.c。周次Week周次字段编码机型的实际制造周。这个“周”与 ISO 8601 标准无关看起来是字面意义上的“从 1 月 1 日开始的 7 天序列”。由于每年为 365 或 366 天第 53 周极为罕见能遇到这样的序列号算是运气。旧式序列号的周次用普通十进制数字编码并带前导零01、02……53两位数字。新式序列号使用字母数字编码。已编码的年份半期也会参与计算下半年表示在基础周数上再加 26 周。字符对照如下字符上半年下半年112722283329443055316632773388349935C1036D1137F1238G1339H1440J1541K1642L1743M1844N1945P2046Q2147R2248T2349V2450W2551X2652Y–53源码中的周次表与“周次累加至年份”的加表分别定义于 modelinfo.h。在get_serial_info()中解码周次后还会加上AppleTblWeekAdd[year_char]下半年为 26得到最终周次若最终周次超出[1, 53]范围则判定无效macserial.c。解码成功后macserial 还会把周次换算为具体日期区间如(01.01.2011-07.01.2011)第 53 周则显示到当年 12 月 31 日macserial.c。生产线与副本Production line and copy生产线字段被认为与装配阶段的某个标识符相关。它以 base 34 编码但实际的推导过程未知只能相对成功地进行推测。当前这套经验模型据称效果良好将生产线表示为三个字母数字字符分别乘以1、34、68三个乘数后求和公式如下base34[S1] * 68 base34[S2] * 34 base34[S3] production line该公式实际上定义了一个压缩函数它能把0到3399共 3400 条生产线编码进去。将39304即 34³的空间压缩到 3400意味着同一条生产线存在多种编码即多个“副本”或“衍生编码”。例如生产线939可以有 14 个衍生形式0TM、1RM、2PM、3MM、4KM……一直到D1M。虽然公式看起来有些奇怪但实验发现前 N 个编码衍生物是有效的而从第一个无效衍生物开始后续都不会有效。因此对于一个由上述全部衍生形式构成的完整序列号列表可以假定如果0TM和2PM有效、3MM无效那么1RM也将有效而4KM到D1M都将无效。由此可以推测编码值随同一条生产线产出的每台机型递增即0TM是产出的第一台第一副本D1M是最后一台。更新在后期阶段发现了极少数“无效之后又出现有效”的例外情况。这些例外至少推翻了该模型的某些部分但目前尚无更好的理论替代。源码层面该逻辑体现在乘数数组int32_t mul[] {68, 34, 1};macserial.c——注意这与文档中的公式顺序一致首字符权重最大line_to_rmin()计算最小合法原始解码副本macserial.c其中SERIAL_LINE_REPR_MAX为 1155、SERIAL_LINE_MAX为 3399macserial.hget_serial()生成时按rmin、(line - rmin*68) / 34、(line - rmin*68) % 34反推三个字符macserial.c-d/--deriv模式遍历 34 个可能的副本并逐个输出macserial.c。产品型号Product model序列号最后 3 位旧式或 4 位新式字符编码该硬件的实际产品标识符。这可能是序列号中最有用的部分因为它可以直接从 Apple 专门的规格门户获取该硬件的详细描述。使用时需把下面 URI 中的PPPP替换为真实产品代码并访问http://support-sp.apple.com/sp/index?pagecpuspecccPPPP例如iMacPro1,1 的产品代码可能是HX87MacBookPro14,3 可能是HTD5。产品代码列表同样未标准化或公开发布但可以通过./macserial -lp与./macserial -l查看大部分产品并与 Mac 机型匹配。该值看起来是经典的 base 34 序列P1 * 39304 P2 * 1156 P3 * 34 P4即四位 base 34 的权重依次为 34³、34²、34¹、34⁰。代码段的分配按非递减方式以块chunk为单位进行通常每块与下一块之间的距离不超过 64约 90% 匹配符合此规律。macserial 在解析时会先提取末位机型代码与 modelinfo_autogen.h 中的AppleModelCode表匹配获得机型索引再通过AppleModelDesc表匹配得到具体型号名如 MacBookPro14,3未匹配时则回退为“Unknown, please report!”macserial.c。-lp/--list-products模式会直接输出AppleModelDesc中的全部“产品代码 - 型号名”对macserial.c。逻辑板序列号MLB逻辑板序列号MLB同样存在两种格式旧式 13 位与新式 17 位。与序列号不同这两种格式差异较大而且关于 MLB 的整体认知非常有限。类型地点年份周次项目中缀产品后缀旧式13 位LLYWWIIIIEEEC新式17 位LLLYWWIIIAAEEEECC虽然尚不明确是否有意为之但 17 位 MLB 可以通过osrecovery.apple.com进行基本校验仅当 MLB 有效时恢复服务器才会返回有效的恢复镜像。可以使用./macrecovery.py verify -m MLB -b BOARD-ID尝试验证你的 MLB 编号该脚本位于 Utilities/macrecovery/macrecovery.py。关于 MLB 与序列号SN的绑定强度目前已知与推测如下已知最低支持的 macOS 版本由EEEE标识最高支持的 macOS 版本由EEEE与board-id共同标识恢复服务器接受同一 MLB 对应的一批机型仅最新系统版本不同。推测EEEE对所有 MLB 而言是唯一编号EEEE在不同机型间共享因此不能用于识别机型。macserial 的--verify模式会报告 MLB 长度是否合法13 位 legacy / 17 位 modern并校验和验证macserial.c。在 macOS 上运行macserial时若检测到 NVRAM 中的4D1EDE05-...:MLB且校验和不通过同样会给出警告macserial.c。地点LocationMLB 的地点字段与序列号的地点字段等价但不一定匹配——因为逻辑板可能在不同于整机装配的地点生产。年份与周次Year and week13 位与 17 位 MLB 中的年份与周次与旧式序列号的年份与周次等价但数值会略低一些因为逻辑板制造早于整机产品完成。从源码看get_mlb()生成 MLB 时复用序列号解析出的info-year与info-week旧式直接按十进制取年个位与两位周次新式则通过srcyear[]/dstyear[]对照表及overrides[]DGJLNQSVXZ对应下半年 26 周换算macserial.c。周次为 0 时会被回卷为上一年第 53 周macserial.c。项目ItemMLB 的 Item 字段在 13 位与 17 位 MLB 中编码方式不同。它可能作为每周的生产项目编号并与序列号中的“生产线与副本”类似旧式 MLB这是 base 34 值的一种变体首个 Item 字符恒为0新式 MLB该值始终是一个数字。中缀Infix仅出现在新式 MLB 中的 base 34 值目前无任何已知信息可能实际属于 Item 的一部分。产品主板Product board与序列号中的“产品型号”类似该字段编码逻辑板型号编号。该代码在零件目录中常被称为EEE 代码在购买兼容的替换逻辑板时非常有用。对于新式 17 位 MLB该字段还用于在osrecovery.apple.com处进行识别以提供兼容的互联网恢复镜像与诊断工具。后缀与校验和Suffix and checksum后缀是含义不明的 base 34 值可能用于校验和验证。校验和算法是从诊断工具中逆向出来的对所有 17 位 MLB 均有效。目前不清楚 13 位 MLB 是否有校验和。17 位 MLB 校验和算法如下该函数在 macserial.c 中与文档完全一致static bool verify_mlb_checksum(const char *mlb, size_t len) { const char alphabet[] 0123456789ABCDEFGHJKLMNPQRSTUVWXYZ; size_t checksum 0; for (size_t i 0; i len; i) { for (size_t j 0; j sizeof (alphabet); j) { if (j sizeof (alphabet)) return false; if (mlb[i] alphabet[j]) { checksum (((i 1) (len 1)) * 2 1) * j; break; } } } return checksum % (sizeof(alphabet) - 1) 0; }算法要点字母表同样是排除I/O的 34 字符集奇数位与偶数位字符按“与长度奇偶性相同”获得权重 321或权重 11对每个字符的字母表下标加权求和最终和必须能被 33 整除sizeof(alphabet) - 1即 34 − 1。macserial 生成 MLB 时会在循环中反复生成直到通过该校验macserial.c。从源码看 macserial 的实现细节数据来源与自动生成macserial 的机型/产品/板卡数据存放于 Utilities/macserial/modelinfo_autogen.h包括ApplePlatformData机型名与基础序列号生成时作为默认值使用见 macserial.cAppleModelCode/AppleBoardCode各机型的序列号产品代码与主板board代码AppleModelYear/ApplePreferredModelYear各机型生产年份列表与优选年份生成时优先使用见 macserial.c。这些数据由 Utilities/macserial/cccdump.py 从 Apple 的 CCC配置/诊断工具二进制中提取生成——该脚本是一个 IDA 插件从_show与_ApplePlatformData等符号地址读取字符串并输出 C 结构体cccdump.py。这解释了文档中“列表未标准化或公开发布”的由来数据完全来自逆向提取。新式 MLB 的生成结构新式 17 位 MLB 的中间部分由三组代码块拼接而成这些代码块定义在 modelinfo.hstatic const char *MLBBlock1[] { 200, 600, 403, 404, 405, 303, 108, 207, 609, 501, 306, 102, 701, 301, 501, 101, 300, 130, 100, 270, 310, 902, 104, 401, 902, 500, 700, 802 }; static const char *MLBBlock2[] { GU, 4N, J9, QX, OP, CD, GU }; static const char *MLBBlock3[] { 1H, 1M, AD, 1F, A8, UE, JA, JC, 8C, CB, FB };get_mlb()在每次生成时从这些块中随机选取pseudo_random() % ARRAY_SIZE(...)拼出地点 年 周 Block1 Block2 板卡代码 Block3的结构macserial.c并循环至校验和通过。旧式 13 位 MLB 则按地点 年 两位周 0 ascii7 码 板卡代码 单字符后缀的结构生成macserial.c。解码输出示例对任意序列号执行./macserial -i SERIALNUMBER后输出包含对应 macserial.cCountry: C02 - China (Quanta Computer) Year: K - 2013 Week: 3 - 3 (15.01.2013-21.01.2013) Line: XYZ - 23456 (copy 3) Model: HTD5 - MacBookPro14,3 SystemModel: MacBookPro14,3 Valid: Possibly其中Valid字段综合了字母表合法性、年份/周次范围、机型生产年份匹配等多重检查结果Possibly表示“可能有效”而非绝对保证。实战场景与使用建议核验二手设备购入二手 Mac 前运行./macserial -i 序列号查看解码出的产品型号与设备实际型号对照可有效识别“换号”骗局若地点为RM旧式则说明是官方翻新机。确认机型生产年代通过年份字段结合周次字段换算出的具体日期区间可大致判断设备出厂时间辅助评估保修状态与剩余使用寿命。更换逻辑板从 MLB 中提取 EEE 代码-i输出的Model与SystemModel之外可直接从 MLB 的EEEE段读取在零件目录中检索兼容替换板。验证 MLB 有效性./macserial --verify MLB可离线校验 17 位 MLB 的校验和进一步可用./macrecovery.py verify -m MLB -b BOARD-ID脚本位于 Utilities/macrecovery/macrecovery.py向osrecovery.apple.com发起在线验证。生成派生副本./macserial -d 序列号输出同一条生产线的全部副本copy供研究生产线编码规律如验证“前 N 个副本有效”模型。附注与免责声明以上信息均通过实验逆向获得个别细节可能不准确。本文仅以教育与入门为目的发布不提供任何担保。若需在 OpenCore 环境中使用可在构建 OpenCorePkg 后于Utilities/macserial目录下运行make生成可执行文件详见 Utilities/macserial/Makefile 与 User/Makefile文档主页见 Utilities/macserial/README.mdmacserial 在 OpenCore 配置体系中用于生成 SystemSerialNumber/SystemUUID 等平台信息可参考 Docs/Configuration.tex 中的平台信息章节。【免费下载链接】OpenCorePkgOpenCore bootloader项目地址: https://gitcode.com/gh_mirrors/op/OpenCorePkg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表