弱位软盘保护:关于8位的另一个起源故事

2020-06-28 05:35:22

软盘复制保护方案多种多样,也很有趣。这是一个有趣的智力挑战:可以创造什么方案,让家用计算机可以可靠地读取给定的光盘,但不能轻松(或根本不能)以相同的格式写回数据?在谈到软盘复制保护代码时,我发现将代码分成两个独立的部分很有用:

加载器代码混淆了盘中比特和游戏代码的检查,使得检查难以修补。

这篇文章与前者有关:磁盘上的比特。我最喜欢的一些光盘方案包括所谓的螺纹盘保护方案和地下城大师为Atari ST使用的模糊比特方案,正如本文中非常详细地解释的那样。我也推荐这个Commodore 64光盘保护方案的很好的概述。为了慈善起见,海军准将64号有一个……。";古怪的光盘驱动器设置。

我最近在一张BBC微型光盘上遇到了一种光盘方案,它比我预期的要复杂得多:弱比特。弱位和类似的方案在16位时代很受欢迎,但现在我们有了8位时代的弱位和类似方案。

软盘驱动器和控制器可能比您想象的要简单。软盘驱动器的工作是获取盘表面上的模拟磁信息,并将其转换成一系列数字脉冲。软盘控制器的工作是获取一系列数字脉冲,识别时序,并生成数据字节串。软盘控制器通常还负责发现脉冲流中的特殊标记字节,以便可以识别不同的扇区。

蓝线中的每个峰值都是驱动头感测磁盘表面上的磁通反转。上峰和下峰被同等对待,并导致数字脉冲被发送到盘控制器,该数字脉冲是黄线。

请注意,OmniFlop、KryoFlux或GreseWeazle等工具可能偶尔会引用原始通量读取或转储,但要注意它们只能看到上面跟踪中的黄线,这是蓝线的有损视图。

看着黄线,你可能会注意到,山顶的节奏相当规则。事实上,每隔4微秒,就有一个时隙,要么有脉冲,要么没有脉冲。如果有脉冲,那就是1比特。没有脉搏,那是个0比特。就这么简单,就有一个比特流供光盘控制器解释并移交给主机。

不同的计算机使用不同的编码方案。我们将重点放在BBC Micro这篇文章上,那里的大多数光盘都使用FM编码,也就是说。单一密度。这是一个非常简单的编码,我们可以看到上面作用域轨迹中的0和1位就证明了这一点。在那个时代,MFM编码通常更为普遍。

盘控制器获取脉冲流并理解它。如上所述,在FM(有时称为DFM)编码中,每个脉冲或非脉冲表示1或0位。这些位是时钟位和实际数据位的混合。出于几个原因需要时钟位:作为要同步到的定时源,以及还为了防止盘驱动器认为它已经丢失了信号。必须至少每8秒有一次脉搏才能保证一切可靠。FM编码采用简单的路线:盘上每隔一个比特就是一个时钟比特,它们几乎在所有时间都是1。

现在我们知道了如何将数据位与时钟位分开,让我们快速了解一下光盘表面的数据字节序列可能是什么样子。8271数据表中介绍了一种简单的协议,用于描述磁盘上的扇区,称为IBM软盘。

FF 00 00 00 FE 00 00 00 01 F1 D3 FF 00 00 00 FB 01 02 03 04 05.。

绿色数据字节在扇区之间或在扇区报头和扇区数据之间填充。它们帮助控制器保持正确的同步,并在正确的点重新获得同步。在真实的光盘上,填充序列通常较长,但是为了清楚起见,上面缩短了填充序列;它们仍然足够。

扇区报头标识字节是FE,其后是4字节的扇区报头和2字节的CRC。该扇区声明它在磁道0、磁头0上,并且它是扇区0,大小为256字节。CRC是正确的。未删除数据的扇区数据标识字节是FB,预计随后是256字节的数据,然后是另一个2字节的CRC。典型的轨道可以包含10个这样的填充+扇区报头+填充+扇区数据序列。

敏锐的读者会问:哦!但是,如果FE或FB字节出现在实际扇区数据中,就像它们经常会出现一样,该怎么办呢?";

这是一个很好的问题,答案就在时钟位上。上述每个字节的时钟位均为0xFF(全部设置),但0xFE和0xFB除外,这两个字节的时钟位均为0xC7。即一些时钟位丢失!这使得能够准确地识别扇区报头和扇区数据标记。注意,选择这些特殊数据字节加上时钟字节的组合,使得仍然保持不变,即在盘表面上永远不会有连续的20位。

英国广播公司的微盘保护之旅是一个相当曲折的旅程。它似乎是基于一种经典的军备竞赛方法:软件出版商会发布一张新的光盘,上面有一些新的奇特之处,然后会推出一个新的光盘复制程序来理解这种奇特之处。然后重复几次迭代!

这一旅程也因机器生命周期中使用的两种截然不同的磁盘控制器芯片而变得复杂:英特尔8271和西部数据1770/1772。这两种芯片都有不同的功能和怪癖。在其中一个芯片上进行良好的复制保护对于在另一个芯片上复制来说可能是微不足道的。此外,一些较早的BBC微盘最终与基于1770的系统不兼容。

早期的Micro Power游戏,如Ghouls,在许多磁道上使用非标准数量的扇区,例如每个512字节的5个扇区,而不是每个256字节的10个扇区。如果您有一个复制程序,该程序首先检查扇区标题,然后根据扇区标题决定扇区标题的数量和大小,则很容易复制。人们很容易嘲笑这种简单的保护,但它很可能在推出时做了它需要做的事情:使用内置的DFS(磁盘文件系统)命令*COPY或*BACKUP防止随意复制光盘(这两个命令都需要格式良好的DFS光盘,这意味着每个磁道10个扇区)。

高级软件经典之作Citadel使用删除了数据。盘上的每个扇区可以由紧接在扇区数据字节之前的一个字节标记标记为正常或删除。这也是一个简单的保护,只要复印机知道已删除数据的概念,它就可以处理。有趣的是,Superior确实发行了一些拥有更高级保护的游戏--最著名的是传说中的流亡。然而,有一些关于保护不能正确加载的故事,所以从那时起,只使用简单的已删除数据保护就可以看到更好的光盘。大概是:一次被咬,两次害羞。

BBC Micro上最具标志性的游戏很可能是“精英”(Elite)。它使用的技巧之一是在光盘中间有一个未格式化的曲目。未格式化的轨道没有任何可识别的扇区标题。这可能是第一个让光盘复制程序汗流浃背的保护措施。特别是在8271软盘控制器上,没有取消格式化命令,只有格式化命令。不过,这一问题最终以有利于光盘复制程序的方式得到了决定性的解决,并采用了一个聪明的技巧:如果将一首曲目格式化为一个巨大的4096字节扇区,您将立即获胜。发生的情况是,单个扇区标题在磁道的开始处写入,但随后4096字节的扇区数据在磁道末端(3125字节长)回绕,并丢弃唯一的扇区标题!因此,磁道并不是真正未格式化的,但所需要的就是光盘控制器看不到任何扇区标题--任务完成了。

另一个相当普遍的保护是扇区头部中不匹配的物理/逻辑轨道ID。这也被Elite使用,它也使用异常大的逻辑扇区ID。如果你知道你在寻找合适的情况,这是很容易复制的。通常,如果光盘控制器(特别是8271)看到轨道不匹配,它会感到不安,但您可以通过使用特殊命令将其内部轨道寄存器设置为匹配来伪造控制器。

后来,在BBC Micro的生活中,一些光盘软件出版商升级了他们的游戏。在扇区之间隐藏额外的数据字节变得很常见。通过重写随后的扇区,复制这些字节的简单化尝试将失败。除非在1770的写入磁道协议中保留了隐藏字节,否则基于1770的磁盘复印机可以轻松地处理这种情况。用基于8271或1770的复印机都可以很好地复制这些情况,但我还没有找到一台能够做出适当努力的复印机。需要做一些事情,如直接控制盘控制器芯片,并以精确的定时发出命令,以及以类似的精确定时中止控制器中的命令。

光盘保护作者喜欢的另一种消遣方式是一种创造性的方法,可以减少复制,而不一定改进基本的保护机制:攻击复制程序本身。复制程序需要一堆逻辑来计算出它们遇到的是什么扇区设置。这不是一个容易的逻辑,所以打破它是卓有成效的。以下是流亡打破矢量2的几个镜头(在仿真下,但真实硬件的行为是相同的:):

考虑到上面为游戏描述的版权保护军备竞赛,令人惊讶的是,发现一家规模较小的教育软件公司拥有领先数光年的光盘保护格式。舍斯顿软件公司有一个很棒的软件目录,我的孩子们今天仍然很喜欢,我们现在最喜欢的是太空任务Mada。

许多Sherston软件光盘使用弱位保护。我们应该简要地定义术语,因为它们不是一致使用的;最合理和最广泛同意的术语似乎是:

薄弱环节。由盘表面上的弱信号或不存在的磁信号引起的片状比特。您可能还会看到术语无通量区(NFA),它与不存在的信号相同。与弱信号相反,弱比特几乎总是不存在的信号。弱位的易碎性实际上来自驱动器电子设备:当没有明显的磁通变化时,驱动器只是放大得更厉害,直到它开始看到噪音中的鬼魂并发出信号。

模糊位。由强而清晰的信号引起的片状比特,但是其中读脉冲的定时处于边缘。边界定时意味着盘控制器芯片不能确定脉冲应该是1比特还是0比特。它将改变主意,从读书变成读书。

弱位的使用是先进的,因为它是您进行第一原理分析时产生的磁盘保护之一:

弱位提供可靠的";读取结果:您可以可靠地依赖它们以不同于读到读的方式回读!

弱位不能由标准盘控制器写入。盘控制器尽其所能写下确定性读回的位。那是他们的工作!有无写入弱信号标志,有无写入时序冲突标志。?

我写信给“太空任务马达”的作者西蒙·霍斯勒。原来他还和他隔壁的电子极客一起设计了脆弱的比特保护装置!用西蒙的话说:

软锁(我们这样称呼它)实际上是我的系统,所以我记得…。这是因为我住在一个电子极客的隔壁!😊,所以打破并行磁盘电缆的写数据线。在这条生产线上加一点电子产品。(谢谢你,迈克)大多数时候,这个电子设备什么也不做-让数据正常通过。如果你打开它(我想我是通过串口完成的)并写入单个扇区-它会计算通过的位数,比如说256-然后停止下一个256位通过";

我碰巧有一张带有弱位保护的原版Sherston光盘,“动画字母表”(Animated Alphabet)。下面是将驱动器连接到示波器后,磁盘的弱位补丁是什么样子:

西蒙的小工具在创建一批弱比特方面的效果可以清楚地看到。这真的是当时的天才,是早期在没有特殊硬件的情况下创造从根本上不可复制的光盘表面的摇摆之一。不仅如此,它在基于8271和1770的系统上的工作方式也是一样的,因为它是驱动电子设备产生准随机性的诱因。这使得设置更简单、更可靠,只需一条代码路径。它也非常兼容所有无数不同的DFS(光盘归档系统)变体,因为检查复制保护的代码不需要花哨的DFS调用。它只需要读取一个扇区--非常标准!--几次,看看返回的字节是否变化。

我不知道第一个基于薄片比特的光盘保护是什么时候发布的。可能有人可以举出20世纪70年代的例子!但值得比较一下我们确实知道的一些例子的日期。

确定第一个使用弱位保护的Sherston软件的日期是很困难的。我有一张Yog先生和奶嘴的图像,1984年,带着脆弱的比特保护。甚至还有一个短元音的图像,(C)1983,带有弱位保护。然而,我们也看到相同的Sherston图书发布了多个不同的光盘版本和不同的版权保护系统。我们可以使用巫师的复仇游戏的图像来建立弱位保护的初始最新界限,该图像碰巧使用了弱位保护,并且在其One-Past-the-End轨道上还包括商用复印机指纹,如此十六进制编辑器视图中所示:

这种性质的指纹包含日期和时间:87 01 05,或者在这种情况下是1987年1月5日。

因此,舍斯顿薄弱的钻头似乎比地下城大师模糊钻头至少早一年投产。虽然这些光盘保护不完全相同,但它们具有非常相似的属性和功能。

更有趣的是,地下城大师的模糊比特是1986年提交的一项专利的主题。这可能是其他聪明人想出以前技术的案例之一。这种事经常发生。

没有一项复古研究是完整的,除非试图将当时认为可能的东西推向前台。因此,有可能创建纯软件解决方案来将弱位写入盘吗?问同样问题的另一种方式是:是否有可能创造出一台正确复制弱位的光盘复印机?

事实证明答案是肯定的!或者更具体地说,答案是双重肯定。使用两种不同的技巧,可以使用8271盘控制器创建实际的弱位,而使用1770盘控制器创建非确定性读取(导致与弱位相同的读取效果)。

8271是一款编程略显陌生的芯片。其中一件事是可以读写的特殊寄存器的概念。一个这样的特殊寄存器是";驱动器控制输出端口";:

这些特殊的寄存器在数据表中没有特别好地涵盖,也许是因为它们不应该是使用时所必需的。也就是说,大多数8271驱动程序实现写入此寄存器以启动驱动器(通过设置加载头位和适当的驱动器选择位),以便控制8271驱动器未就绪时读/写命令失败的倾向。

诀窍在于使用该寄存器来设置写使能位以及加载头和选择位。这只能在任何其他命令之外完成,因为写入特殊寄存器本身就是一个命令,选择它将中止任何其他正在进行的命令。当在命令之外激活写启用时,盘驱动器的写头将被通电,但不会在写数据管脚上将数据脉冲传输到盘驱动器。结果是写磁头扫过盘表面的磁通转变。这会产生弱位/a无磁通区。通过一点仔细的定时,可以给写磁头通电和断电,并且磁道上的任何点都需要,以在需要的地方创建弱位。

1770的诀窍是不同的。通过创造性地对1770进行编程,或许可以直接创建弱位--但如果是这样的话,我还没有找到它。相反,我们将重点放在BBC Micro的1770控制寄存器上。这是控制外部1770引脚所必需的1770外部寄存器。例如,与8271不同,1770通过外部引脚选择磁盘驱动器0与驱动器1,而不是作为传递给控制器命令的参数。驱动器控制寄存器在本文档的底部有很好的说明。

由于该寄存器位于1770外部,因此我们可以在命令执行过程中对其进行干扰。我们使用的具体技巧是启动单个密度写命令,然后翻转到双倍密度,输入一定数量的字节。双密度(MFM)定时与单密度定时完全不同,因此作为单密度读回所得到的图案会严重混淆盘控制器,以至于返回不确定的读结果。这不是光盘上的弱位,但就复制保护检查而言,效果是相同的:读取扇区两次,然后检查结果会有所不同!这些比特最终肯定会变得薄片状的。

它起作用了吗?是。这是一段我使用正在进行的disbeast实用程序的视频。我们通过使用命令在光盘上的正确位置直接精确地创建薄片比特来修复Sherston弱比特的故障副本。