有时您没有源代码,需要对程序或黑盒进行反向工程.有趣的战争故事吗?
这是我的一个:
几年前我需要重写一个我没有源代码的设备驱动程序.设备驱动程序在旧的CP/M微型计算机上运行,并通过串行端口驱动专用的照排机.几乎没有照相排版机的文件可供我使用.
我最终在DOS PC上将一个串口监视器混合在一起,模仿了照相排版机器的响应.我将DOS PC连接到CP/M机器,并在我通过CP/M机器输入数据时开始记录来自设备驱动程序的数据.这使我能够找出设备驱动程序使用的握手和编码,并为DOS机器重新创建一个等效的.
在这里阅读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磁盘驱动器上找到更多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杂志的编辑吉姆巴特菲尔德告诉读者我的故事,不久他就收到了我的约1000加元的支票 - 该杂志从许多感激用户那里收到了5美元的杂志.那对我来说当时是一大笔钱.)
我其实有另一个故事:
在我的FCopy"成功"故事发生几年后,有人询问我是否可以破解老虎机的软件.
这是在德国,那里几乎每家酒吧都有一两个:你在一个美国的四分之一处投入一些钱,然后它会旋转三个轮子,如果你运气好一些模式,你就会可以选择在下一场比赛中"加倍或不加"你的胜利,或获得当前的胜利.这场比赛的目标是尝试将你的胜利加倍几次,直到你进入"系列"模式,任何接下来的胜利,无论多么小,都会给你一笔大笔支出(大约是你的支出的10倍)游戏).
困难在于知道何时加倍,何时不加倍.对于"局外人"来说,这当然是完全随机的.但事实证明,那些德国制造的机器在他们的ROM中使用简单的伪随机表.现在,如果您观看机器播放几轮,您可以找出这个"随机表指针"的位置并预测其下一步行动.这样,玩家就会知道何时加倍,何时通过,最终导致他进入"大赢系列".
现在,当这个人接近我时,这已经很常见了.有一个地下场景可以访问这些机器中的ROM,查找表格并为C-64等计算机创建软件,用于预测机器的下一步动作.
然后出现了一种新型机器,它使用了一种不同的算法:它没有使用预计算表,而是做了别的事情,没有一个常驻的破解者可以解决这个问题.所以我接近了,因为我的FCopy成名而被称为一种天才.
所以我得到了ROM.像往常一样16KB.没有关于它做了什么以及它如何工作的信息.我独自一人.即使代码看起来也不熟悉(我当时只知道6502和8080).经过一番挖掘和询问,我发现它是一个6809(我发现它是最好的8位CPU存在,它与680x0 CPU设计类比,它比x86系列的指令混乱更加线性).
到那个时候,我已经拥有一台68000计算机(我为公司"Gepard计算机"工作,它建立并销售这样一台机器,拥有自己的开发人员操作系统和所有)并且正在编程Modula-2.所以我为6809编写了一个反汇编程序,通过查找子程序,跳转等帮助我进行逆向工程.我慢慢了解了老虎机程序的流量控制.最终我发现了一些看起来像数学算法的代码,我突然意识到这可能是随机生成代码.
由于我从未接受过计算机科学的正规教育,到目前为止我还不知道使用mul,add和mod的典型randomgen是如何工作的.但我记得看过Modula-2书中提到的东西然后意识到它是什么.
现在我可以快速找到调用此randomgen的代码,并了解哪些"事件"导致randomgen迭代,这意味着我知道如何在游戏中预测下一次迭代及其值.
剩下的就是弄清楚随机因素的当前位置.我从未对代数等抽象事物表现出色.我知道有人学过数学,但也是程序员.当我打电话给他时,他很快就知道如何解决这个问题,并且对于确定randomgen的种子值有多么简单是个问题.我什么都不明白.好吧,我理解一件事:实现这一目标的代码需要花费很多时间,并且C-64或任何其他8位计算机如果不是几天就需要几个小时.
因此,我决定向他提供1000马克(这对我来说当时很多钱),如果他能在68000写我一个汇编程序.没有花很长时间我有我可以在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.但前几次他们只改变了randomgen的数字.我们只需要掌握新的ROM,我花了几分钟时间找到新的数字并将它们应用到我的软件中.
所以这种情况持续了一段时间,在此期间,我和朋友们浏览了德国几个城镇的酒吧,寻找那些我们只能破解的机器.
然而,最终,机器制造商学会了如何"修复"它:在此之前,随机因素仅在某些可预测的时间推进,例如在游戏期间类似4次,并且每次玩家按下"双或无"时再次按钮.
但随后他们终于改变了它,以便随机调查随机因素,这意味着我们不再能够按下按钮准确预测下一个种子值.
那是它的结束.仍然,努力编写一个反汇编程序只是为了这个单一的破解,找到16KB的8位CPU代码中的关键例程,找出未知的算法,投入相当多的钱来支付别人开发代码我不明白找到便携式高速计算机的项目涉及"盲"68000 CPU,夏普作为终端和打印机方便输出,然后实际上自己清空机器,这是我做过的最令人兴奋的事情之一用我的编程技巧.
回到90年代初,我忘记了我的Compuserve密码.我在CIS.INI中有加密版本,所以我编写了一个小程序来进行明文攻击和分析,试图对加密算法进行逆向工程.24小时后,我弄清楚它是如何工作的以及我的密码是什么.
之后不久,我进行了清理并将程序作为免费软件发布,以便Compuserve客户可以恢复丢失的密码.公司的支持人员经常会将这些人介绍给我的计划.
它最终进入了几个公告板(还记得吗?)和互联网论坛,并被收录在一本关于Compuserve的德国书中.它仍然漂浮在某处.事实上,谷歌直接带我去了.
好吧,这不是逆向工程(相当),而是一个简单的硬件黑客,它源于纯粹的挫败感.我是90年代初期西南贝尔手机服务区域的IT经理.我的IT部门资金严重不足,所以我们把钱花在聪明人而不是设备上.
我们在主要城市之间设有WAN,专门用于客户服务,具有关键的IP链接.我们的公司老板坚持要求我们安装一个网络监控系统,以便在线路出现故障时通知我们(没有资金用于冗余,但花费大量资金来处理故障.叹气.)
强烈推荐的解决方案在SPARC工作站上运行,起价为30,000美元加上SPARC站的费用(当时约为20,000美元),这是我预算的很大一部分.我看不到它 - 这是浪费$$.所以我决定有点黑客行为.
我带了一台计划销毁的老电脑并放了一份ProComm(还记得ProComm吗?)并让它沿着路线ping每个所需的节点(这是ProComm的后续版本之一,脚本化了FTP以及串行线路, KERMIT等)当无法到达节点时,编码中的一点逻辑就会触发寻呼机消息.我已经用它来为我们的技术人员拼凑一个寻呼机系统,所以我重新使用了寻呼机代码.该脚本连续运行,每分钟在每个关键链接上发送一次ping,并在未返回ping时分支到寻呼机代码.
我们在每个关键位置复制此系统,成本低于500美元,并在链接断开时发出非常快速的通知.下一期 - 我们的第一个故障排除方法之一就是对我们的路由器和/或终端服务器进行电源循环.我有一些拨号X10控制器和一些X10开/关设备电源开关.您必须知道要使用的正确电话号码和正确的音调,但我们为每位技术人员打印了一张作弊卡,并将其与寻呼机保持在一起.即时快速响应!然后,我的一位技术人员编写了我们所有人必须在每个站点重置特定设备作为快速拨号的电话.One-tech解决了这个问题!
现在,"告诉你如此"揭幕.
我和我们在达拉斯的公司网络经理坐在一起吃饭,他坚持购买基于Sun的网络管理产品.我得到一个页面,其中一个链接已关闭,然后是第二页.由于寻呼机消息来自两个不同的服务器,我确切地知道涉及哪个路由器(这是一个设置,我知道无论如何,因为与我会面的技术人员在用餐期间排队等候"路由器",所以我们可以炫耀.)我向经理展示寻呼机消息并询问他将如何解决这个问题.他怀疑地看着我,因为他还没有成功地被他的Solaris NMS系统分页,该系统应该跟踪关键链接."好吧,我想你最好打电话给技术人员,让他们重置路由器,看看是否能修复它." 我转向跟我们一起吃午餐的技术人员,请他处理.他抽出手机(这次是在桌子上方)并按下他编程的快速拨号盘来重置有问题的路由器.电话拨打了X10交换机,告诉它关闭路由器电源,暂停5秒钟,告诉它启动路由器,然后断开连接.我们的ProComm脚本向我们发送了页面,告诉我们在此例程的三分钟内链接已恢复.:-)
公司网络经理给我留下了深刻的印象.他问我新系统的成本是多少.当我告诉他不到1千美元时,他就是中风.他刚刚为我所说明的任务订购了一套大的Sun Solaris网络管理解决方案.我认为他花了大约15万美元.我告诉他魔术是如何完成的,并以午餐价格向他提供了ProComm脚本.TANSTAAFL.他告诉我他会给我买午饭让我闭嘴.
清理掉我旧的磁盘抽屉等,我找到了代码的副本 - "Pingasaurus Rex"就是我给它的名字.那是在过去的好时光中的黑客行为.
有一次,当玩Daggerfall II时,我买不起Daedric Dai-Katana,所以我对这个游戏进行了十六进制编辑.
虽然很严肃,但多年前我设法使用SoftICE删除了我父亲AutoCAD安装上的加密狗检查.这是在互联网发展之前.他是一名工程师,所以他有一份合法的副本.他刚刚忘记了加密狗的工作,他需要做一些事情,我认为这将是一个有趣的挑战.之后我非常自豪.
对我来说最痛苦的是这个产品,我们想在Excel电子表格中包含一个图像(几年前在开放标准之前).因此,如果存在文档的内部格式,我必须得到并"理解".我最终在有和没有图像的文件之间进行了一些Hex比较,以弄清楚如何把它放在那里,再加上一些小端数学....
我曾经研究过一种工具,可以在登录网络时从PC收集库存信息.我们的想法是跟踪贵公司的所有PC.
我们有一个新的要求来支持Banyan VINES网络系统,现在很久就被遗忘了,但在它出现时非常酷.我无法弄清楚如何从Banyan的适配器获取以太网MAC地址,因为没有记录的API来执行此操作.
在网上挖掘,我找到了一个其他榕树书呆子发布的程序,执行了这个确切的操作.(我认为它会将MAC地址存储在环境变量中,因此您可以在脚本中使用它).我试着写信给作者,以了解他的计划是如何运作的,但他要么不想告诉我,要么想要一些荒谬的金钱来获取信息(我不记得了).
所以我简单地启动了一个反汇编程序并将他的实用程序拆开了.事实证明他正在对服务器进行一次简单的调用,这是Banyan API中未记录的功能代码.我很容易弄清楚调用的细节,它基本上是通过RPC向服务器询问这个工作站的地址,MAC是Banyan网络地址的一部分.
然后,我只是通过电子邮件向Banyan的工程师发送电子邮件,并告诉他们我需要做什么."嘿,似乎RPC功能号码528(或其他)返回我需要的东西.这可以安全地呼叫吗?"
榕树工程师非常酷,他们证实我发现的功能是正确的,并且不太可能消失.我写了自己的新代码来调用它,然后我就开始运行了.
多年以后,我使用了基本相同的技术来对未记录的压缩方案进行逆向工 我找到了一个鲜为人知的支持工具,该工具由(现已解散)公司提供,可以解压缩这些文件,并对其进行逆向工程.事实证明,这是一种非常简单的Lempel-Ziv变体,适用于其文件格式的块结构.在Wireshark源代码中为后代记录该工作的结果,只搜索我的名字.
大约10年前,我在当地一家书店的便宜货箱里拿起UFO/XCOM珍藏版,主要是出于怀旧情绪.当我回到家时,我有点兴奋,它已经被移植到Windows(DOS版本没有在win2k下运行)......然后很失望它的图形乱码.
我正要耸耸肩膀(讨价还价和所有),但后来我的朋友说"你以前没错过......以前的软件吗?"这导致了一个晚上喝了很多可乐和逆向工程和我的朋友一起出去玩.最后,我写了一个修正了音高与宽度问题的bugfix加载器,最终可以在没有启动旧硬件的情况下播放两个第一个XCOM游戏(DOSBOX还没有,我的机器功能不够强大全面虚拟化).
装载机获得了一些人气,甚至在STEAM重新发布游戏一段时间后发布 - 我认为他们现在已经转向dosbox了.