破解一个有着 40 年历史的复制保护加密狗

破解一个有着 40 年历史的复制保护加密狗

Hacker News 摘要

原标题:Defeating a 40-year-old copy protection dongle

作者 Dmitry Brant 在文中介绍了他如何破解一个有着 40 年历史的硬件复制保护加密狗。这个故事始于他帮助朋友的会计事务所迁移一套极其陈旧的遗留软件。

背景故事

这套会计软件已经使用了 40 年,是使用 RPG 语言编写的。这种语言甚至比 COBOL 还要古老,最初用于 IBM 的中型计算机,如 System/3 和 AS/400。后来 RPG 被移植到了 MS-DOS 系统。该事务所至今仍在一台安装了 Windows 98 的个人电脑上运行这套程序。为了启动软件,电脑的并口必须插上一个特殊的硬件加密狗。

由于年代久远,加密狗上的标签已经磨损,只能辨认出 Software Security Inc 的公司标志以及 RUNTIME 字样。作者首先对电脑硬盘进行了镜像处理,并尝试在模拟器中运行,但如果没有硬件加密狗,所有的会计工具都无法工作。

发现线索

作者在硬盘镜像中发现了由 Software West Inc 开发的 RPG II 编译器,以及完整的会计软件源代码。经过测试,他意识到编译器本身(如 RPGC.EXESEU.EXE)需要加密狗才能运行,而且编译器会自动将复制保护逻辑注入到它生成的任何可执行文件中。

当在没有加密狗的情况下启动源代码编辑器 SEU.EXE 时,程序会在几秒钟后提示错误并退出。这表明程序正在尝试通过并口进行通信。

技术分析

作者使用了反汇编工具 Reko 来分析 16 位实模式下的可执行文件。在代码的 0800 段中,他发现了 inout 指令,这是程序通过输入输出端口与并口通信的明确信号。

经过分析,这段保护程序具有以下特征:

• 它是一个独立的过程,通过 CALL 指令调用,并以 RETF 指令返回。

• 它首先读取 BIOS 数据区以检测第一个并口 LPT1 的地址。

• 它执行一个循环,向并口的数据寄存器写入数值,然后读取状态寄存器,并将响应累加到 BHBL 寄存器中。

• 整个过程不接受任何输入参数,这意味着无论通信过程多么复杂,最终返回到 BX 寄存器(由 BHBL 组成)的结果必须是一个固定常数。

实施破解

既然结果是恒定的,作者决定直接修改程序代码,让该过程直接返回正确的魔术数字。

1. 初步尝试:他将程序的前几个字节改为 BB 34 12(将 BX 设为 1234h)和 CB(返回指令)。程序不再卡顿几秒钟,而是立即报错,证明路径正确。

2. 锁定范围:进一步观察汇编逻辑发现,过程结束时 BH 的值只能是 76h

3. 暴力破解:由于 BL 只有 8 位,总共只有 256 种可能的组合。作者编写了一个脚本,利用 DOSBox 自动尝试每一个数值。

4. 最终成功:暴力破解很快找到了正确答案。当 BL06h 时,软件成功运行。

最终的破解补丁仅需 4 个字节:BB 06 76 CB。这会将 BX 寄存器设为 7606h 并立即返回。

总结与后续

作者发现该编译器套件中的所有程序都使用了完全相同的保护逻辑。更方便的是,一旦编译器被修补,它生成的任何新程序也会自动带有这个破解后的逻辑。

虽然这种基于硬件加密狗返回固定数值的保护机制在现代看来非常简单,甚至只需要 4 个字节的补丁就能瓦解,但在当时确实起到了一定的保护作用。作者计划在清理掉个人隐私信息后,将这个 RPG II 编译器作为计算历史的文物公开发布。


原文:https://dmitrybrant.com/2026/02/01/defeating-a-40-year-old-copy-protection-dongle

评论:https://news.ycombinator.com/item?id=46849567

Report Page