44

有时您没有源代码,需要对程序或黑盒进行逆向工程。有什么好玩的战争故事?

这是我的一个:

几年前,我需要重写一个我没有源代码的设备驱动程序。设备驱动运行在一台老式的CP/M微电脑上,通过串口驱动一台专用的照排机。我几乎没有关于照排机的文档。

我终于在一台模拟照排机响应的 DOS PC 上组装了一个串行端口监视器。当我通过 CP/M 机器输入数据时,我将 DOS PC 连接到 CP/M 机器并开始记录来自设备驱动程序的数据。这使我能够弄清楚设备驱动程序使用的握手和编码,并为 DOS 机器重新创建一个等效的。

4

12 回答 12

49

在此处阅读 C-64 的 FCopy 故事:

早在 80 年代,Commodore C-64 就有一个智能软盘驱动器 1541,即拥有自己的 CPU 和一切的外部单元。

C-64 将向驱动器发送命令,然后驱动器将自行执行它们,读取文件等,然后通过专用的串行电缆将数据发送到 C-64。

1541 的手册中提到,除了读取和写入文件的命令外,还可以读取和写入其内部存储空间。更令人兴奋的是,可以将 6502 代码下载到驱动器的内存中并在那里执行。

这让我着迷,我想玩它 - 在驱动器上执行代码。当然,没有关于可以在那里执行哪些代码以及可以使用哪些功能的文档。

我的一个朋友用 BASIC 编写了一个反汇编程序。所以我读出了它所有的 ROM 内容,即 16KB 的 6502 CPU 代码,并试图了解它的作用。驱动器上的操作系统非常了不起和先进的 IMO - 它有一种任务管理,命令从通信单元发送到磁盘 i/o 任务处理程序。

我学到了足够的知识来理解如何使用磁盘 i/o 命令来读/写磁盘的扇区。实际上,阅读了 Apple ][ 的 DOS 3.3 书籍,其中详细解释了其磁盘格式和算法的所有工作原理,对理解这一切有很大帮助。

(后来我了解到,我还可以在更多的 4032/4016 磁盘驱动器上找到用于“商业” Commodore 型号的预留信息,这些型号的工作原理与 1541 非常相似,但我无法将其作为当时相当断开的爱好程序员。)

最重要的是,我还了解了串行通信的工作原理。我意识到串行通信,使用 4 条线,两条用于数据,两条用于握手,编程效率非常低,全部在软件中(尽管使用经典的串行握手做得正确)。

因此,我设法编写了一个更快的通信程序,在其中我做了固定的时间假设,同时使用数据和握手线进行数据传输。

现在我能够读写扇区,并且传输数据的速度比以往任何时候都快。

当然,如果可以简单地将一些代码加载到驱动器中以加快通信速度,然后使用普通命令读取文件,这反过来会使用更快的通信,那就太好了。但是,这是不可能的,因为驱动器上的操作系统没有为此提供任何挂钩(请注意,所有操作系统都在 ROM 中,无法修改)。

因此,我想知道如何将我令人兴奋的发现变成有用的应用程序。

做了一段时间的程序员,一直在处理数据丢失的问题(当时磁带和软盘还不太现实),我想:备份!

所以我写了一个备份程序,它可以以前所未有的速度复制一张软盘:第一个版本只用了 8 分钟(是的,几分钟)就复制了整个 170 KB 的磁盘,第二个版本甚至用了大约 4.5 分钟。而我之前的应用程序花费了 25 分钟以上。(请注意,Apple ][,其磁盘操作系统直接在 Apple 上运行,具有快速并行数据访问功能,一分钟左右就完成了这一切)。

因此,C-64 的 FCopy 诞生了。

它很快变得非常流行。不是我想要的备份程序,而是任何想要为朋友复制游戏和其他软件的人的主要选择。

事实证明,我的代码中的简化,它会简单地跳过不可读的扇区,将具有错误 CRC 的扇区写入副本,确实绕过了当时使用的大多数复制保护方案,从而可以复制大多数以前无法复制的光盘。

我曾试图卖掉我的应用程序,实际上卖了 70 次。当它在杂志上刊登广告,声称它可以在不到 5 分钟的时间内复制一张光盘时,客户会打电话而不相信它,“更清楚”它无法完成,但还是试一试。

不久之后,其他人开始对我的应用程序进行逆向工程并对其进行优化,使通信速度更快,导致复制的应用程序甚至在 1.5 分钟内就完成了。更快几乎是不可能的,因为由于 1541 和 C-64 上可用的内存量有限,您必须在单个磁盘驱动器中多次交换磁盘才能复制其全部 170 KB 的内容。

最后,FCopy 及其优化的后续产品可能是 80 年代 C-64 上最受欢迎的软件。即使它没有为我带来经济上的回报,它仍然让我感到自豪,我学到了很多关于逆向工程、复制保护的徒劳以及明星的感觉。(实际上,加拿大一家 C-64 杂志的编辑 Jim Butterfield 向读者讲述了我的故事,很快他就收到了一张约 1000 加元的支票给我——这是该杂志从许多发送 5 美元支票的感激用户那里收集的,这在当时对我来说是一大笔钱。)

于 2008-12-17T12:32:49.323 回答
44

其实我还有一个故事:

在我的 FCopy “成功”故事过去几年,有人问我是否可以破解老虎机的软件。

这是在德国,几乎每个酒吧都有一两个这样的:你会投入一些相当于美国四分之一的钱,然后它会旋转三个轮子,如果你运气好的话,你会然后可以选择在下一场比赛中将您的胜利“加倍或不加倍”,或者获得当前的胜利。该游戏的目标是尝试将您的胜利翻倍,直到您进入“系列”模式,在这种模式下,任何成功的胜利,无论多么小,都会让您获得大笔报酬(大约是您每次花费的 10 倍)游戏)。

困难在于知道什么时候加倍,什么时候不加倍。当然,对于“局外人”来说,这完全是随机的。但事实证明,这些德国制造的机器在其 ROM 中使用简单的伪随机表。现在,如果你观察机器玩了几轮,你就可以弄清楚这个“随机表指针”在哪里,并预测它的下一步动作。这样,球员就会知道何时加倍以及何时传球,最终将他带入“大赢系列”。

现在,当这个人接近我时,这已经是一件很平常的事情了。有一个地下场景可以访问这些机器中的 ROM,找到表格并为 C-64 等计算机创建软件,用于预测机器的下一步动作。

然而,随后出现了一种新型机器,它使用了不同的算法:它没有使用预先计算好的表格,而是做了其他事情,没有一个常驻破解者可以弄清楚这一点。所以我被找上了,自从我的 FCopy 成名以来,我就被认为是一种天才。

所以我得到了ROM。16KB,像往常一样。没有关于它做了什么以及它是如何工作的信息。我独自一人。甚至代码看起来也不熟悉(那时我只知道 6502 和 8080)。经过一番挖掘和询问,我发现它是一个 6809(我发现它是现有的最好的 8 位 CPU,它与 680x0 CPU 设计类似,比 x86 系列的指令混乱更线性)。

到那时,我已经有一台 68000 计算机(我曾在“Gepard Computer”公司工作,该公司制造并销售了这样一台机器,拥有自己的开发人员操作系统等等)并且正在编程 Modula-2。所以我为 6809 编写了一个反汇编程序,它通过查找子程序、跳转等帮助我进行逆向工程。慢慢地,我对老虎机程序的流程控制有了一个概念。最终我发现了一些看起来像数学算法的代码,我突然意识到这可能是随机生成的代码。

由于我从未接受过计算机科学方面的正规教育,直到那时我都不知道使用 mul、add 和 mod 的典型随机数是如何工作的。但我记得我在 Modula-2 的书中看到过一些东西,然后才意识到它是什么。

现在我可以快速找到调用这个 randomgen 的代码,并了解哪些“事件”导致了 randomgen 迭代,这意味着我知道如何在游戏中预测下一次迭代及其值。

剩下的就是找出randomgen的当前位置。我从来不擅长代数等抽象事物。不过,我认识一个学习数学并且也是程序员的人。当我打电话给他时,他很快就知道如何解决这个问题,并且对确定随机数的种子值有多简单提出了很多质疑。我什么都不明白。好吧,我明白一件事:完成此操作的代码将花费大量时间,而 C-64 或任何其他 8 位计算机将需要数小时甚至数天才能完成。

因此,如果他能在 68000 中为我编写汇编程序,我决定给他 1000 DM(当时这对我来说是很多钱)。没用多久,我就有了可以在 68000 上测试的代码计算机。通常需要 5 到 8 分钟,这是可以接受的。所以我几乎到了。

它仍然需要一台便携式 68000 电脑才能被带到老虎机所在的酒吧。我的 Gepard 电脑显然不是便携式的。幸运的是,我在德国认识的其他人在一块小电路板上生产了整整 68000 台计算机。对于 I/O,它只有串行通信 (RS-232) 和一个并行端口(Centronics 是当时的标准)。我可以将一些 9V 块电池连接到它以使其工作。然后我买了一台夏普袖珍电脑,它有一个橡胶键盘和一个单行 32 字符显示屏。依靠电池运行,这是我的终端。它有一个 RS-232 连接器,我连接到 68000 板。夏普也有某种非易失性存储器,这让我可以将 68000 随机破解软件存储在夏普上,按需传输到 68000 计算机,然后计算种子值。最后,我有一台小型 Centronics 打印机,它打印在狭窄的热敏纸上(这是收银机用来打印收据的大小)。因此,一旦 68000 得到结果,它就会将老虎机上即将进行的游戏的一排结果发送给夏普,夏普将它们打印在纸上。

所以,要清空其中一台老虎机,你需要和两个人一起工作:你开始玩,写下它的结果,一个你有种子计算所需的最少游戏数量,一个你会去停着的车在外面,打开夏普,输入结果,68000电脑会响8分钟,然后出来一张打印的即将运行的游戏列表。然后你只需要这张小纸,把它带回给你的伙伴,他一直在忙着机器,将过去的结果与打印输出对齐,不到 2 分钟后,你就“惊讶”地赢得了历史上的 100 分系列。然后你会玩这 100 场比赛,实际上是清空机器(如果在 100 场比赛之前机器是空的,你有权等待它重新填充,甚至可能在第二天回来,

这不是拉斯维加斯,所以你只能从一台机器上得到大约 400 马克,但这是快速而可靠的钱,而且令人兴奋。一些酒吧老板怀疑我们作弊,但由于当时的法律,我们并没有反对我们,甚至当有些人报警时,警察也支持我们)。

当然,老虎机制造公司很快就知道了这一点,并试图抵消,关闭那些特定的机器,直到安装新的 ROM。但前几次他们只改变了随机数的数字。我们只需要拿到新的 ROM,我花了几分钟才找到新的数字并将它们应用到我的软件中。

所以这持续了一段时间,在此期间,我和朋友们浏览了德国几个城镇的酒吧,寻找那些只有我们才能破解的机器。

不过最终,机器制造商学会了如何“修复”它:在此之前,randomgen 仅在某些可预测的时间被推进,例如在游戏过程中大约 4 次,并且每次玩家按下“double or nothing”时再一次按钮。

但后来他们最终改变了它,以便不断地轮询 randomgen,这意味着我们不再能够准确地预测下一个种子值,以便按下按钮。

就这样结束了。尽管如此,还是为了这个单一的破解而努力编写反汇编程序,在 16KB 的 8 位 CPU 代码中找到关键例程,找出未知的算法,投入大量资金付钱给别人开发我不明白的代码,找到一台便携式高速计算机的项目,包括以夏普作为终端的“盲”68000 CPU 和方便输出的打印机,然后自己实际清空机器,这是我做过的最令人兴奋的事情之一用我的编程技巧。

于 2008-12-17T13:20:39.710 回答
11

早在 90 年代初,我就忘记了 Compuserve 密码。我在CIS.INI中有加密版本,所以我写了一个小程序来进行明文攻击和分析,试图对加密算法进行逆向工程。24 小时后,我弄清楚了它是如何工作的以及我的密码是什么。

此后不久,我进行了清理并将程序作为免费软件发布,以便 Compuserve 客户可以恢复丢失的密码。公司的支持人员会经常将这些人推荐给我的计划。

它最终出现在了一些公告板(还记得吗?)和互联网论坛上,并被收录在一本关于 Compuserve 的德国书籍中。它仍然漂浮在外面的某个地方。事实上,谷歌直接把我带到了它。

于 2008-10-17T11:42:10.013 回答
10

有一次,在玩 Daggerfall II 时,我买不起 Daedric Dai-Katana,所以我对存档游戏进行了十六进制编辑。

不过说真的,我设法在多年前使用 SoftICE 删除了我父亲 AutoCAD 安装中的加密狗检查。这是在互联网大之前。他是一名工程师,所以他有一个合法的副本。他刚刚忘记了工作中的加密狗,他需要做一些事情,我认为这将是一个有趣的挑战。后来我很自豪。

于 2008-10-10T21:28:28.117 回答
10

好吧,这不是逆向工程(相当),而是纯粹出于挫败感而产生的简单硬件破解。90 年代初,我是西南贝尔手机服务地区的一名 IT 经理。我的 IT 部门资金严重不足,所以我们把钱花在聪明人身上,而不是设备上。

我们在主要城市之间有一个 WAN,专门用于客户服务,具有关键的 IP 链接。我们的公司老板坚持要我们安装一个网络监控系统,以便在线路出现故障时通知我们(没有钱用于冗余,但要花钱处理故障。唉。)

强烈推荐的解决方案在 SPARC 工作站上运行,起价为 3 万美元加上一个 SPARC 工作站的成本(当时约为 2 万美元),这在我的预算中占了很大一部分。我看不到它-这是浪费$$。所以我决定进行一些黑客攻击。

我拿了一台计划销毁的旧 PC 并放了一份 ProComm 的副本(还记得 ProComm 吗?),让它 ping 路线上的每个所需节点(这是 ProComm 的较新版本之一,它编写了 FTP 和串行线路的脚本, KERMIT 等)当无法到达节点时,编码中的一个小逻辑会触发寻呼机消息。我已经用它为我们的技术人员拼凑了一个寻呼机系统,所以我重用了寻呼机代码。该脚本连续运行,每分钟在每个关键链接上发送一次 ping,并在未返回 ping 时分支到寻呼机代码。

我们以不到 500 美元的成本在每个关键位置复制了这个系统,并且在链接出现故障时能够非常快速地发出通知。下一个问题 - 我们的第一个故障排除方法之一是重启我们的路由器和/或终端服务器。我有一些拨号 X10 控制器和一些 X10 开/关设备电源开关。您必须知道要使用的正确电话号码和要推送的正确音调,但我们为每位技术人员打印了一张作弊卡,他们将其保存在寻呼机中。即时快速响应!然后,我的一位技术人员将我们都必须在每个站点重置特定设备的电话编程为快速拨号。一项技术解决问题!

现在“告诉你”揭幕。

我正与我们在达拉斯的公司网络经理共进午餐,他坚持要购买基于 Sun 的网络管理产品。我得到一个页面,其中一个链接已关闭,然后是第二个页面。由于寻呼机消息来自两个不同的服务器,我确切地知道涉及哪个路由器(这是一个设置,无论如何我都知道,因为与我会面的技术人员在用餐期间排队等待“关闭路由器”所以我们可以炫耀。)我向经理展示寻呼机消息,并询问他将采取什么措施来解决这个问题。他怀疑地看着我,因为他的 Solaris NMS 系统尚未成功寻呼他,该系统应该跟踪关键链接。“好吧,我想你最好打电话给技术人员,让他们重置路由器,看看是否能解决问题。” 我转向与我们共进午餐的技术人员,请他处理。他拿出手机(这次是在桌子上方),按下他为重置相关路由器而设置的快速拨号。手机拨通X10开关,让其关闭路由器电源,暂停五秒,让其开启路由器电源,然后断开连接。我们的 ProComm 脚本向我们发送了页面,告诉我们链接已在此例程的三分钟内备份。:-) 我们的 ProComm 脚本向我们发送了页面,告诉我们链接已在此例程的三分钟内备份。:-) 我们的 ProComm 脚本向我们发送了页面,告诉我们链接已在此例程的三分钟内备份。:-)

公司网络经理印象深刻。他问我新系统的成本是多少。当我告诉他不到 1000 美元时,他中风了。他刚刚订购了一套 BIG 的 Sun Solaris 网络管理解决方案,只是为了完成我所说明的任务。我想他花了大约 15 万美元。我告诉他魔法是如何做到的,并以午餐的价格为他提供了 ProComm 脚本。坦斯塔夫。他告诉我他会请我吃午饭让我闭嘴。

清理我旧的磁盘抽屉等,我找到了代码的副本——“Pingasaurus Rex”是我给它起的名字。在过去的好日子里,那是黑客行为。

于 2011-07-17T01:20:53.777 回答
7

对我来说最痛苦的是这个产品,我们想在 Excel 电子表格中包含一个图像(几年前开放标准)。因此,如果文档的内部格式也存在这种情况,我必须得到并“理解”。我最终在有和没有图像的文件之间进行了一些十六进制比较,以弄清楚如何把它放在那里,再加上一些小端数学......

于 2008-10-10T21:19:25.017 回答
7

我曾经开发过一种工具,可以在登录网络时从 PC 收集库存信息。这个想法是跟踪公司中的所有 PC。

我们有一个新的需求来支持 Banyan VINES 网络系统,它现在早已被遗忘,但在它问世时非常酷。我不知道如何从 Banyan 的适配器获取以太网 MAC 地址,因为没有记录的 API 可以做到这一点。

在网上四处搜索,我发现了一个其他 Banyan 书呆子发布的程序,它执行了这个确切的操作。(我认为它会将 MAC 地址存储在环境变量中,以便您可以在脚本中使用它)。我试图写信给作者以了解他的程序是如何工作的,但他要么不想告诉我,要么想要一些荒谬的钱来获取信息(我不记得了)。

所以我只是启动了一个反汇编程序并将他的实用程序拆开。原来他正在对服务器进行一次简单的调用,这是 Banyan API 中未记录的函数代码。我很容易地计算出调用的细节,它基本上是通过 RPC 向服务器询问这个工作站地址,而 MAC 是 Banyan 网络地址的一部分。

然后我简单地给 Banyan 的工程师发了电子邮件,告诉他们我需要做什么。“嘿,似乎 RPC 函数编号 528(或其他)返回了我需要的内容。这样调用安全吗?”

Banyan 的工程师很酷,他们验证了我找到的功能是正确的,并且不太可能消失。我编写了自己的新代码来调用它,然后我就开始运行了。

多年后,我使用了基本相同的技术,在另外记录的文件格式上对未记录的压缩方案进行了逆向工程。我找到了一个鲜为人知的支持工具,由(现已不复存在的)公司提供,它可以解压缩这些文件,并对其进行逆向工程。事实证明,这是一个非常简单的 Lempel-Ziv 变体,应用于其文件格式的块结构中。那项工作的成果记录在Wireshark 源代码中供后人参考,只要搜索我的名字。

于 2008-10-10T21:20:24.513 回答
6

大约 10 年前,我在当地一家书店的便宜货箱里买了 UFO/XCOM 典藏版,主要是出于怀旧之情。当我回到家时,我对它被移植到 Windows 感到有点兴奋(DOS 版本不能在 win2k 下运行)......然后又对它出现乱码感到失望。

我正要耸耸肩(讨价还价的垃圾箱和所有),但后来我的朋友说“你以前没有……修复过……软件吗?”这导致一夜喝了很多可乐和逆向工程和我的朋友出去玩的时候。最后,我编写了一个修复了间距与宽度问题的错误修复加载程序,终于可以在不启动旧硬件的情况下玩前两个 XCOM 游戏(DOSBOX 还没有出现,而且我的机器还不够强大全面的虚拟化)。

加载程序获得了一定的欢迎,甚至在一段时间内随着游戏的 STEAM 重新发布 - 我认为他们现在已经切换到 dosbox,不过。

于 2011-07-17T14:12:07.743 回答
4

我为支持 Wacom 平板电脑的 Atari ST 编写了一个驱动程序。Wacom 的一些信息可以在他们的网站上找到,但我仍然需要自己弄清楚很多。

然后,一旦我编写了一个库来访问 wacom 表(和一个测试应用程序来显示结果),我突然意识到操作系统(GEM 窗口系统)没有 API 可以将鼠标光标实际放置在某个地方。我最终不得不在称为 VDI 的东西(如 Windows 中的 GDI)中挂钩一些中断,并且非常小心不要让里面的计算机崩溃。我从 VDI 加速版本 (NVDI) 的开发人员那里得到了一些帮助(以建议的形式),一切都是用 PurePascal 编写的。我仍然偶尔有人问我如何在 GEM 中移动鼠标光标等。

于 2008-11-11T08:24:56.817 回答
2

When I was in highschool they introduced special hours each week (there were 3 hours if i recall correctly) in which we had to pick a classroom with a teacher there to help with any questions on their subject. No of course everybody always wanted to spend their time in the computer room to play around on the computers there.

To choose the room where you would have to be there was an application that would monitor how many students would go to a certain room, and so you had to reserve your slot on time or otherwise there was not much choice where to go.

At that time I always liked to play around on the computers there and I had obtained administrator access already, only for this application that would not help me so much. So I used my administrator access to make a copy of the application and take it home to examine. Now I don't remember all the details but I discoverd this application used some access database file located on a hidden network share. Then after taking a copy of this database file I found there was a password on the database. Using some linux access database tools I could easily work around that and after that it was easy to import this database in my own mysql server. Then though a simple web interface I could find details for every student in the school to change their slots and promote myself to sit in my room of choice every time.

The next step was to write my own application that would allow me to just select a student from the list and change anything without having to look up their password which was implemented in only a few hours.

While not such a very impressive story as some others in this thread, I still remember it was a lot of fun to do for a highschool child back then.

于 2011-07-17T13:00:25.323 回答
2

我不得不对一个视频处理应用程序进行逆向工程,而我只有部分源代码。我花了数周甚至数周的时间才算出控制流,因为它一直使用 CORBA 来调用自己,或者在我无法访问的应用程序的某些部分从 CORBA 调用。

纯粹的白痴。

于 2008-10-10T21:23:22.543 回答
2

我最近编写了一个应用程序,它使用 Curl 从 Domino Webmail 服务器下载全部内容。这是因为运行服务器的分包商要求为每个归档请求支付几百美元。

在我为部门发布应用程序大约一周后,他们更改了他们的 webmail 版本,但设法使用大量的正则表达式和 XML 使其再次工作

于 2008-10-10T21:44:12.003 回答