Dmitry Brant · 2026-02-02

破解40年前的硬件加密狗:一次软件考古之旅

摘要

作者协助一家仍在使用Windows 98和DOS软件的会计事务所迁移系统时,遇到了需要并口加密狗才能运行的RPG编译器。通过反汇编分析,他发现加密狗验证例程仅返回一个固定的16位数值,最终通过暴力破解256种可能性找到正确值0x7606,用4字节补丁彻底绕过了这一看似复杂实则简单的硬件保护机制。

内容框架与概述

文章以一次真实的技术援助为背景展开。一家会计事务所至今仍在Windows 98上运行基于IBM RPG语言编写的DOS会计软件,而该软件依赖一个连接并口的硬件加密狗才能运行。作者首先制作了系统镜像,在模拟器中尝试运行,却因缺少加密狗而受阻。

作者使用Reko反编译工具分析可执行文件,在代码段0800中发现了与并口通信的in/out指令。分析表明该例程是独立函数,通过读写并口数据寄存器与加密狗交互,最终将结果存入BX寄存器。关键发现是:该例程无任何输入参数,意味着返回值是完全固定的常量。

通过代码分析确定BH必为0x76,作者编写脚本对BL的256种可能值进行暴力测试,很快找到正确值为6,即完整魔数为0x7606。最终补丁仅需4字节:将BX设为固定值后立即返回。更妙的是,编译器会将相同的保护代码复制到它生成的程序中,因此修补后的编译器产出的程序也自动被破解。

核心概念及解读

RPG语言:IBM开发的比COBOL还古老的编程语言,最初用于大型机报表生成,后移植到DOS平台。

并口加密狗:80-90年代常见的硬件防拷贝方案,通过并行端口与软件进行挑战-响应验证。

BIOS数据区:位于内存低地址的系统信息区域,程序通过读取此区域获取并口地址等硬件配置。

暴力破解:当可能性有限时的有效策略,本例中8位寄存器仅有256种组合,可快速穷举。

代码段隔离:早期软件将保护代码放在独立段中,可能是原始的混淆手段,却反而便于定位和分析。


原文信息

字段内容
原文Defeating a 40-year-old copy protection dongle
作者Dmitry Brant
发表日期2026-02-02

此摘要卡片由 AI 自动生成