反向工程的战争故事

有时你没有源代码,需要对程序或黑盒进行反向工程。 任何有趣的战争故事?

这是我的一个:

几年前,我需要重写一个我没有源代码的设备驱动程序。 设备驱动程序运行在一个旧的CP / M微机上,并通过一个串口驱动一台专用的照排机。 几乎没有照排机的文件可以给我。

我终于在一台DOS PC上黑了一个串口监视器,模拟了照排机的反应。 我将DOS PC连接到CP / M机器,并在通过CP / M机器送入数据时开始logging来自设备驱动程序的数据。 这使我能够找出设备驱动程序使用的握手和编码,并为DOS机器重新创build相应的一个。

在这里阅读FCopy的C-64的故事:

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

C-64会把命令发送到驱动器,然后驱动器自行执行,读取文件等,然后将数据发送到C-64,通过一条主导的串行电缆。

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

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

我的一个朋友在BASIC写了一个反编译器。 所以我把所有的ROM内容都读出来了,这些内容是16KB的6502 CPU代码,并试图理解它的function。 驱动器上的操作系统是相当惊人的,先进的IMO – 它有一种任务pipe理,命令从通信单元发送到磁盘I / O任务处理程序。

我足够了解如何使用磁盘I / O命令来读取/写入磁盘的扇区。 实际上,读过苹果公司的DOS 3.3的书,其中详细解释了磁盘格式和algorithm的所有工作,对于理解这一切有很大的帮助。

(后来我了解到,我也可以在“商业”Commodore模型上find更多的4032/4016磁盘驱动器的预留信息,这些模型与1541的工作方式非常相似,但是作为而当时相当无关爱好程序员。)

最重要的是,我也学习了串口通信是如何工作的。 我意识到,串行通信,使用4线,两个数据,两个握手,编程非常低效,所有软件(虽然正确使用经典的串行握手)。

因此,我设法写了一个更快的通讯例程,在那里我使用数据和握手线来进行固定的时序分配。

现在我可以读取和写入扇区,并且比以前更快地传输数据。

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

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

已经有一段时间的程序员,处理数据丢失的时代(音乐磁带和软盘当时不是很可靠),我想:备份!

所以我写了一个备份程序,可以以前所未有的速度复制一张软盘:第一个版本只用了8分钟(是,分钟)拷贝了整个170KB的光盘,第二个版本在4.5分钟内就完成了。 而我之前的应用程序花了25分钟。 (请注意,苹果公司直接在苹果电脑上运行的光盘操作系统,具有快速的并行数据访问function,一分钟左右就完成了)。

所以FCopy的C-64诞生了。

它很快变得非常受欢迎。 不是我本来打算的备份程序,而是任何想为朋友复制游戏和其他软件的人的主要select。

事实certificate,我的代码简化了一些简单的跳过不可读的扇区,写了一个CRC错误的扇区来避开大部分当时使用的复制保护scheme,这使得复制大多数以前不可复制的光盘成为可能。

我试图卖我的应用程序,实际上卖了70次。 当它在杂志上刊登广告时,声称它会在不到5分钟的时间内复制一张光盘,客户会打来电话,而不相信,“知道得更清楚”,说不能做,但还是试试看。

不久之后,其他人开始对我的应用程序进行反向工程,并对其进行优化,使得通信速度更快,从而在1.5分钟内即可完成复制应用程序。 因为1541和C-64上的可用内存有限,所以你不得不在单个光驱中多次交换光盘,以复制所有内容的170 KB。

最后,FCopy及其优化后继者可能是C-64在80年代最stream行的软件。 尽pipe它没有为我带来经济上的回报,但它仍然让我感到骄傲,而且我学到了很多关于逆向工程,复制保护的无用以及明星的感受。 (实际上,加拿大一家C-64杂志的编辑吉姆·巴特菲尔德告诉读者我的故事,很快他就为我检查了大约1000加元 – 这本杂志从许多感激的用户那里收到了5美元的汇票,那是我当时的一大笔钱。)

我其实有另外一个故事:

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

这是在德国,几乎每个酒吧都有一个或两个这样的酒吧:你会在美国的一个季度里投入一些钱,然后再旋转三个轮子,如果你有一些模式的幸运,可以select在下一场比赛中“双倍或者完全没有”赢得胜利。 这个剧本的目的是试图让你的胜利增加一倍,直到你进入“系列”模式,在这个模式下,无论多么小的胜利,都会给你一大笔奖金(大约是你花费的10倍游戏)。

困难是知道什么时候加倍,什么时候不加。 对于“外人”来说,这当然是完全随机的。 但事实certificate,这些德国制造的机器在他们的ROM中使用了简单的伪随机表格。 现在,如果你看了机器玩几轮,你可以找出这个“随机表指针”在哪里,并预测其下一步行动。 这样一来,一个球员就会知道什么时候加倍,什么时候通过,最终导致他的“大赢”系列赛。

现在,当这个人走近我时,这已经是一件很平常的事了。 有一个地下场景可以访问这些机器中的ROM,查找表格,并创build用于计算机(例如C-64)的软件,用于预测机器的下一步移动。

然后又出现了一种新型的机器,它采用了另外一种algorithm:不是使用预先计算好的表格,而是做了其他的事情,没有一个驻军的怪物可以弄清楚。 所以我被接近了,自从我的FCopy成名以来就被称为天才。

所以我拿到了ROM。 16KB,像往常一样。 没有关于它做了什么以及它是如何工作的信息。 我是自己的。 即使代码看起来并不熟悉(我只知道当时只知道6502和8080)。 经过一番深入的研究,我发现它是一个6809(我发现它是最好的8位CPU,与680×0的CPUdevise相比,它比x86系列的指令混乱得多)。

那时候,我已经有了一台68000的电脑(我曾经为“Gepard Computer”公司工作过,他们是用自己的开发者操作系统等等来build造和销售这样一台机器的),然后进入了Modula-2编程。 所以我为6809写了一个反汇编程序,通过查找子程序,跳转等帮助我进行逆向工程。慢慢地,我了解了老虎机程序的stream程控制。 最终我发现了一些看起来像mathalgorithm的代码,我觉得这可能是随机生成的代码。

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

现在我可以很快find可以调用这个randomgen的代码,并学习哪些“事件”导致randomgen迭代,这意味着我知道如何在游戏过程中预测下一个迭代和它们的值。

剩下的就是弄清randomgen的当前位置。 我从来没有像代数这样的抽象东西好。 不过,我认识一个学过math并且也是程序员的人。 当我打电话给他的时候,他很快就知道如何解决这个问题,并且很了解如何确定随机数的种子价值。 我什么都不懂。 那么,我明白了一件事情:完成这个代码需要花费很多时间,而C-64或其他8位计算机如果不是几天就需要几个小时。

因此,如果他能给我写一个68000的汇编程序,我决定给他提供1000个DM(这对我来说是一笔很大的钱)。没有耗费他很长时间,我有我可以在我的68000上testing的代码电脑。 通常需要5到8分钟,这是可以接受的。 所以我几乎在那里。

它仍然需要一台便携式的68000电脑运到老虎机站的酒吧。 我的Gepard电脑显然不是便携式的。 幸运的是,我在德国认识的其他人在一个小电路板上生产了全部68000台电脑。 对于I / O,它只有串行通信(RS-232)和并行端口(Centronics是那些日子的标准)。 我可以把一些9V电池连接起来使之工作。 然后我买了一台夏普的掌上电脑,里面有一个橡皮键盘和一个32字符的单线显示器。 使用电池,这是我的terminal。 它有一个RS-232连接器,我连接到68000板。 夏普也有一些非易失性存储器,这使我可以在夏普上存储68000个随机破解软件,并将其按需转移到68000计算机上,然后计算出种子的价值。 最后,我用一个小的Centronics打印机打印在狭窄的热敏纸上(这是收银机用来打印收据的大小)。 因此,一旦68000有结果,它会在老虎机上发送一连串的结果给夏普,他们把这些结果打印在纸上。

所以,要清空其中一台老虎机,你需要和两个人一起工作:开始游戏,记下结果,一个人拥有最less的种子计算所需的游戏数量,其中一个会去停车场在外面打开夏普,input结果,就会有68000电脑咔嗒作响8分钟,而出来的是即将到来的游戏列表。 然后你需要的只是这张小纸片,把它拿回给你的好友,他们把机器占用,把过去的结果与打印输出结合起来,不到2分钟后你就惊讶地赢得了100年的历史系列。 然后,你会玩这100场比赛,实际上是清空机器(如果机器在100场比赛之前是空的,你有权等待补充,甚至有可能第二天回来,而机器是停止,直到你回来)。

这不是拉斯维加斯,所以你只用一台机器就可以得到大约400台DM,但这是快速而可靠的金钱,而且令人兴奋。 一些酒吧老板怀疑我们是在作弊,但是由于当时的法律,我们没有任何反对我们的行为,即使有些人叫了警察,警察也赞成我们)。

当然,制造公司很快就有这个风,试图抵制,closures这些特定的机器,直到新的ROMs安装。 但是最初几次他们只改变了随机数。 我们只需要抓住新的ROM,花了我几分钟的时间来find新的数字,并将它们实现到我的软件中。

于是,这个过程持续了一段时间,在这期间,我和朋友浏览了德国几个城镇的酒吧,find那些只有我们可以破解的机器。

但最终,机器制造者学会了如何“修正”它:在此之前,randomgen只在某些可预测的时间进展,例如在游戏过程中是4次,而在玩家按下“双倍或无”button。

但是最终他们改变了它,这样randomgen就会不断被轮询,这意味着我们不能再准确地按下button来准确地预测下一个种子值了。

这是结束了。 尽pipe如此,为了这个单一的破解而写了一个反汇编的工作,在16KB的8位CPU代码中find了关键的例程,找出了未知的algorithm,投入了大量的金钱来支付别人去开发代码,我不明白find一个便携式高速计算机的项目,这个计算机涉及到“夏普”作为terminal的“盲”68000CPU和方便输出的打印机,然后实际上自己清空机器,这是我曾经做过的最激动人心的事情之一与我的编程技巧。

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

不久之后,我做了清理工作,并将该程序作为免费软件发布,以便Compuserve客户可以恢复丢失的密码。 公司的支持人员经常会把这些人介绍给我的程序。

它终于find了几个公告板(记住它们?)和互联网论坛的方式,并被包括在德国一本关于Compuserve的书中。 它仍然在那里浮动。 事实上,谷歌让我直接向它。

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

我们在主要城市之间build立了一个专门用于客户服务的广域网,并提供关键的IP链接。 我们的老总们坚持要我们安装一个networking监控系统,在线路故障时通知我们(没有余钱,但花钱处理故障,感叹)。

强烈推荐的解决scheme在SPARC工作站上运行,起价为30,000美元,加上SPARC站的成本(当时约为20,000美元),这是我预算的一大部分。 我看不到它 – 这是浪费$$。 所以我决定了一点点黑客行为。

我把一台旧电脑安排好销毁,然后把ProComm的一个拷贝(记得ProComm?),并且沿着这条路线对每一个需要的节点进行ping(这是ProComm的后期版本之一,可以编写FTP以及串行线路, KERMIT等)。编码中的一个小逻辑在节点无法到达时触发寻呼消息。 我已经用它来拼凑我们的技术的寻呼系统,所以我重新使用了寻呼机的代码。 脚本连续运行,每分钟发送一次关键链接,并在没有返回ping时分入寻呼机代码。

我们在每个关键位置复制了这个系统,花费less于500美元,并且在链路断开时有非常快的通知。 下一个问题 – 我们的第一个问题解决方法之一是为我们的路由器和/或terminal服务器供电。 我有一些拨号X10控制器和一些X10开/关设备电源开关。 你必须知道使用正确的电话号码和正确的音调,但是我们为每个技术人员打印了一张作弊卡,并将其保存在寻呼机中。 即时快速响应! 我的一个技术人员对手机进行了编程,我们都必须将每个站点的特定设备重置为快速拨号。 One-tech解决了这个问题!

现在这个“被告知的”揭幕。

我正在和达拉斯的企业networking经理共进午餐,他们坚持购买基于Sun的networkingpipe理产品。 我得到一个页面,我们的链接之一,然后第二页。 由于寻呼机信息来自两台不同的服务器,所以我确切地知道哪个路由器参与(这是一个设置,无论如何我都知道,因为与我会面的技术人员正在排队等候在路由器上“吃饭”我们可以炫耀)。我向pipe理员显示寻呼消息,询问他将如何解决这个问题。 他怀疑地看着我,因为他的Solaris NMS系统还没有被成功地分页,这个系统本来是要跟踪关键链接的。 “好吧,我想你最好打电话给技术人员,让他们重新设置路由器,看看是否能解决这个问题。” 我转向那个正在和我们一起吃饭的技术人员,请他来处理这个问题。 他拿出他的手机(这次是在桌子上面),按下他编程的快速拨号键来重置路由器。 电话拨通了X10交换机,告诉它断电路由器,暂停五秒钟,告诉它开启路由器,并断开连接。 我们的ProComm脚本向我们发送了页面,告诉我们链接在这个例程的三分钟内被备份。 🙂

公司networking经理印象非常深刻。 他问我新系统的成本是多less。 当我告诉他不到一万美元时,他中风了。 他刚刚订购了一套Sun Solarisnetworkingpipe理解决scheme,仅用于我所说明的任务。 我觉得他花了15万美元。 我告诉他这个魔法是如何完成的,并为他提供了午餐价格的ProComm脚本。 TANSTAAFL。 他告诉我,他会给我买午餐,让我闭嘴。

清理掉我以前的磁盘抽屉等,我find了一个代码 – “Pingasaurus Rex”是我给的名字。 那是在过去的好时光。

有一次,在玩Daggerfall II的时候,我买不起Daedric Dai-Katana,所以我十六岁编辑游戏。

尽pipe如此,我设法使用SoftICE在多年前删除了我的爸爸的encryption狗检查。 这是互联网之前的大事。 他是一名工程师,所以他有一个合法的副本。 他刚刚忘记encryption狗,他需要做一些事情,我认为这将是一个有趣的挑战。 之后我很自豪。

对我来说最痛苦的是这个产品,我们希望在Excel电子表格中包含一个图像(在开放标准之前几年)。 所以,如果文档的内部格式也存在,我必须得到和“理解”。 我最终做了一些hex比较文件有和没有图像找出如何把它放在那里,加上一些小端math工作….

我曾经开发过一种工具,可以在PC上loginnetworking时收集库存信息。 这个想法是跟踪你公司所有的个人电脑。

我们有一个新的要求来支持Banyan VINESnetworking系统,现在这个networking系统已经被遗忘了,但是在它出来的时候非常酷。 我不知道如何从Banyan的适配器获取以太网MAC地址,因为没有logging的API来执行此操作。

在网上挖掘,我发现一个其他Banyan书呆子发布的程序,执行这个确切的行动。 (我认为它会将MAC地址存储在一个环境variables中,以便在脚本中使用它)。 我试着写信给作者,看看他的程序是如何工作的,但是他要么不想告诉我,要么为这些信息想要一些可笑的钱(我不记得)。

所以我只是开了一个反汇编程序,把他的工具分开。 事实certificate,他正在对服务器进行一个简单的调用,这是Banyan API中未公开的函数代码。 我很容易地弄清楚了这个调用的细节,基本上是通过RPC向服务器请求这个工作站地址,MAC是Banyannetworking地址的一部分。

然后,我只是发邮件给Banyan的工程师,告诉他们我需要做什么。 “嘿,看来RPC函数528(或其他)返回了我所需要的,可以安全地调用吗?

榕树的工程师非常酷,他们证实我find的function是正确的,不太可能消失。 我写了自己的新代码来打电话给我,我正在运行。

多年以后,我基本上采用了相同的技术,对文档格式不明的压缩scheme进行逆向工程。 我发现了一个鲜为人知的支持工具(现在已经停产),它将解压缩这些文件,并将其逆向工程化。 事实certificate,这是一个非常简单的Lempel-Ziv变体,在其文件格式的块结构中应用。 这项工作的结果被logging在Wireshark源代码的后世,只是search我的名字。

大约十年前,我在当地一家书店的便宜货柜里拿起了UFO / XCOMcollections版,大部分是怀旧的。 当我回到家时,我有点兴奋,已经移植到Windows(DOS版本没有在win2k下运行)…然后失望,它有乱码的graphics。

我正要耸耸肩膀(讨价还价和所有的),但是那时我的朋友说:“你以前没有…蠢货…软件吗?”,这导致了一个晚上喝了很多可乐和逆向工程同时和我的朋友出去玩。 最后,我写了一个修正了间距和宽度问题的bug修复加载器,最终可以在不启动旧硬件的情况下播放两个第一个XCOM游戏(DOSBOX还没有发布,而且我的机器还不够强大全面虚拟化)。

装载机获得了一定的stream行度,甚至在STEAM重新发布游戏的时候发布了一段时间 – 但我认为他们现在已经转向了dosbox。

我为支持Wacom平板电脑的Atari ST写了一个驱动程序。 一些Wacom的信息可以在他们的网站上find,但是我仍然需要自己解决很多问题。

然后,一旦我写了一个库来访问wacom表(以及一个testing应用程序来显示结果),我发现没有任何API(GEM窗口系统)实际上将鼠标光标放置在某处。 我最终不得不在一些叫做VDI的东西上挂一些中断(比如在Windows下的GDI),并且非常小心,不要让电脑在那里死机。 我从加速版VDI(NVDI)的开发者那里得到了一些帮助(以build议的forms),而且一切都是用PurePascal编写的。 我偶尔也会有人问我如何在GEM中移动鼠标光标等

我不得不逆向工程一个video处理应用程序,我只有部分源代码。 我花了几个星期甚至几个星期的时间来完成控制stream程,因为它一直使用CORBA来调用自己,或者在应用程序的某些部分被CORBA调用,而我无法访问它。

纯粹的白痴。

我最近编写了一个应用程序,使用Curl从Domino Webmail服务器下载整个内容。 这是因为运行服务器的分包商要求为每个归档请求提供几百块钱。

在我发布应用程序之后大约一个星期,他们改变了他们的networking邮件版本,但设法使用一大堆正则expression式和XML

当我在高中的时候,他们每个星期都会有特别的时间(如果我记得正确的话,我会有3小时的时间),在那里我们必须和老师一起去教室,来帮助解决他们的问题。 当然没有,每个人都希望在电脑室里呆在电脑里玩耍。

要select一个房间,你必须在那里有一个应用程序,将监测有多less学生会去某个房间,所以你必须准时保留你的插槽,否则没有太多的select去哪里。

那个时候我总是喜欢在那里玩电脑,而且我已经获得了pipe理员访问权限,只有这个应用程序对我没有太大的帮助。 所以我用我的pipe理员权限来制作应用程序的副本并将其带回家进行检查。 现在我不记得所有的细节,但我发现这个应用程序使用一些访问数据库文件位于隐藏的networking共享。 然后拿了这个数据库文件的副本后,我发现数据库上有一个密码。 使用一些Linux访问数据库工具,我可以很容易地解决这个问题,之后很容易导入这个数据库在我自己的MySQL服务器。 然后,通过一个简单的networking界面,我可以find每个学生的细节,以改变他们的插槽,并促使我每次都坐在我select的房间里。

下一步是编写我自己的应用程序,使我可以从列表中select一个学生,并且无需查找仅在几个小时内实现的密码即可更改任何内容。

虽然这个话题不像其他一些人那么令人印象深刻,但是我仍然记得当时为一个高中生做了很多乐趣。

不是个人的故事,但仍然是一个优秀的阅读: 默多克的卫星电视黑客告诉所有人,从法律风暴的眼睛 。