
这篇文章是我在2018年底第35届混沌计算机大会上的
演讲的文本版本。
因此,我必须承认,尽管MS-DOS恶意软件一直在某种程度上让我着迷,但MS-DOS还是有点生气,但是首先我们必须问:“什么是DOS?”
- DOS是CP / M的一个版本,是另一个非常古老的操作系统。
- DOS系列涵盖了广泛的供应商,仅因为它是DOS并不意味着它将在8086 CPU或更高版本上运行。
- 其中一些DOS提供程序具有API兼容性,这意味着其中一些使用恶意软件!
表演视频:
该帖子是在EDISON Software的支持下编写的,EDISON Software 为虚拟移动运营商开发了一个应用程序,并从事Python站点的开发和维护 。

但实际上,我们对DOS时代的大多数记忆是那一刻的计算机外观的美感:

这是“米色计算”和Model M键盘的时代,取决于您是否喜欢嘈杂的键盘,它可能是著名的还是臭名昭著的。

我们中的某些人可能对使用DOS有一定的记忆,而某些人可能仍在使用DOS!

例如,有传言说《权力的游戏》的乔治·马丁(George R. Martin)曾在DOS中使用Wordstar来写书!

我们也不能错过QBASIC,因为许多人是他们第一次接触编程!

但是有时使用DOS的生活不是很好,有时使用DOS,类似的事情突然发生了。 在此示例中,在打印过程中会播放小旋律,因此在办公环境中这可能是非常尴尬的情况。

它们中的一些更“可爱”,在这种情况下,例如,由ascii符号绘制的救护车经过,然后您要打开的程序启动,在最坏的情况下,会带来一些不便。
多亏一群以VX Heavens名义运行的恶意软件档案管理员,我们才拥有一个历史悠久的DOS恶意软件档案,或者至少直到乌克兰警察突袭了该站点:
3月23日,星期五,警方根据某人的提示,对该服务器进行了刑事调查(乌克兰《刑法》第361-1条-出于销售或分发目的而制造恶意软件),并对其进行了扣押。 关于“将旨在为未经授权的计算机,自动系统和计算机网络黑客入侵而设计的免费访问的恶意软件放入”。
幸运的是,受欢迎的Torrent网站仍然拥有网站数据库的副本,这些副本可以为我们提供出色的数据集:
$ tar -tvf viruses-20070914.tar | wc -l 66714 $ ls -alh viruses-20070914.tar 6.6G viruses-20070914.tar
但是,要开始研究这些样本,我们需要首先了解这些样本的典型分发流程,因为这些程序在Internet之前的时代起作用了:

在系统上接收到受感染的文件并运行它之后,恶意程序将主动搜索或为您运行的程序安装系统调用拦截器。 他经常以一种微妙和无形的方式来执行此操作,以避免被发现。 微妙的重要性非常重要,因为要分发此恶意程序,您必须使用介质(软盘)将其转移到另一个系统,或将其下载到另一个分发点(例如BBS)。

在运行时,该恶意软件具有两个选项: 它可以保持隐藏状态并感染新文件,或显示有效负载。
一些有效载荷非常漂亮! 下面的示例使用异常功能,例如256色:

或与您的屏幕缓冲区一起播放的一个:


但是,在大多数情况下,该恶意软件将保持沉默,并尝试查找要感染的文件。 大多数文件的感染非常简单,例如,如果您将COM文件视为一长串机器代码,则:

然后,“您所要做的”就是在程序的开头插入JMP并将数据添加到程序的结尾。 它看起来像这样:

一些代码更聪明,并在二进制文件中找到“空白空间”并将其写入其中,这阻止了二进制文件的大小增加,这可能意味着防病毒软件可以使用红色标记。

但是,在前面,我也提到了拦截系统调用。 尽管事实是MS-DOS运行时非常简单并且几乎不受保护(您可以从COM文件轻松加载Linux)。 它仍然包含完整的API,因此应用程序不需要具有自己的文件系统实现。 以下是一些系统调用功能:

它们通过引起软件中断来工作,在该中断中,程序要求处理器移至系统内存的另一部分以处理某些内容:

但是,MS-DOS还提供了添加/修改这些调用(使用另一个调用)的功能,从而使您能够扩展系统,以便可以在运行时加载新的驱动程序。 但是,它也是添加恶意软件拦截的理想场所:

这是一个很好用的技巧,因为您可以拦截“打开文件”调用,然后用它来检测系统中的新可执行文件……并感染它们。
作为如何使用它们的快速示例,让我们看一个简单的Hello World程序:

如我们所见,有两个
int
类型的调用。 我们使用
21h
(h = hex)作为主要系统调用号码,并且我们可以基于
Ah
的值指定我们希望MS-DOS执行的操作

在这种情况下,程序将调用以打印行,然后以返回码0(未定义)退出。
如前所述。 当您调用int 21h时,中央处理器将在IVT表中查找要去的地方,在此处理程序中通常有一个段,例如路由各种主要调用的路由器,在Int 21h的情况下,它根据值ah定向到各种功能。 到达目的地后,实际的调用处理程序将处理该任务,然后他将运行iret返回主程序,通常会留下调用结果的寄存器:

所以 如果要查看程序启动的所有系统调用,可以在中断处理程序的开头设置一个断点,并检查ah是什么:

我们这样做是因为中断处理程序在MS-DOS中始终位于固定位置(这比ASLR和内核ASLR时代早得多),而程序位置却不在。

启动后,我们可以看到这种模式所带来的挑战。 虽然我们可以在屏幕上看到他刚刚打印了有关Goat文件的通知(Goat是一个旨在感染的文件,就像一个牺牲山羊)。 我们还看到,该程序不仅可以打印一行。 它检查DOS版本(可能是为了检查兼容性),然后打开,读取和写入数据!

这很有趣! 但是我们想了解更多有关系统调用的红色突出显示内容的信息,因为它们必须具有文件名和数据之类的输入才能写入文件/输出到屏幕。
为此,我们需要在syscall期间查看其他寄存器:

使用“打印字符串”作为简单示例,我们可以看到用法如下:

什么是DS:DX? 为什么这里有两个寄存器,我们如何从中获取数据?
为此,我们需要更多地了解8086处理器。

8086处理器是16位CPU,但具有20位存储器寻址。 这意味着处理器只能存储表示64 KB的值,这在内存容量高达1 MB时会出现问题。
为了解决这个问题,我们需要了解分段寄存器:

8086处理器具有4个分段寄存器,我们需要注意以下几点:
- CS-代码段
- DS-数据段
- SS-堆栈段
- ES-另一个细分市场(以防您需要再解决其他情况)
还有许多其他通用寄存器,这些寄存器可以避免过多的内存使用,并使您可以将参数传递给其他功能。
分段通过更改RAM中的块来注册工作:

这使16位CPU可以查看RAM的所有20位,从而确保对于每个DS值,该块偏移16个字节。

在这种情况下,DS调用将用作16位窗口中关于行首位置的指针。 然后行打印机将进行扫描,直到找到$字符,然后停止。 这类似于使用空字节而不是$的其他系统。

随着ISA x86时代的到来,几乎没有什么改变,除了处理器位大小增加的事实,相同的寄存器也变得更宽。
因此,借助这些知识,我们可以创建“任务”列表来跟踪这些程序:

使用此设置,我们可以将多台大型计算机投入问题处理几个小时,然后收集结果!

我们得到...

没什么。
这真令人失望。
我们至少烧掉了仓鼠的力量,并且几乎没有得到激活!
(请问如何翻译)
如果我们看一些样本,我们会在这里看到一支吸烟枪。 一块体面的样品检查日期或时间。
如果我们查看这些调用的文档,我们将看到系统调用以程序的寄存器形式返回值:

这样我们就可以蛮力地对待他们! 我们需要做的是这样的:

但是这种方法存在一个问题。

测试示例的步骤大约需要15秒,因为它使用了完整的qemu仿真过程,并且可能需要15秒才能在虚拟机中完全运行该程序。 由于DOS不具有节能功能,因此这意味着DOS处于待机模式时,处于
繁忙周期中因此,我们可以通过查看在日期/时间请求之后执行什么代码来不同地看待这个问题。
由于跟踪器位于中断处理程序中,因此我们无法从框中知道程序的位置:

为此,我们需要查看CS和IP注册等待我们的堆栈!

一旦从堆栈中获取了这两个寄存器,就可以使用它们获取返回码,以便我们的清单如下所示:

完成此操作并重复测试数据集后,我们将看到返回代码的哪一部分看起来像!

这是一个示例。 在这里我们看到对DL和0x1e进行了比较。

如果查看文档,将发现DL是一个月中的某天,也就是说,我们可以按以下方式分析前三个操作代码:

我们可以手动查看所有这些内容,但是有许多示例会检查时间,大约是4700:

因此,我们需要做其他事情。 我们需要写点东西...我们需要写点东西...

世界上最糟糕的x86模拟器BenX86是专门为满足我们的需求而设计的模拟器,仅此而已:

但是他的速度有一些优势。


我们基于使用BenX86的蛮力发现的路径,添加了10,000个不同的执行测试。 因此,我将得出一些我最喜欢的,随时间变化的发现:

此模式在元旦激活,并在显示问候语后挂断系统。 如果您在新的一年里呆在办公室里可能会很好,或者如果您真的需要在元旦做某事,那可能会很不好。

这个例子使我非常惊讶。 它在1995年初被激活,并通知用户其感染了所有受感染的文件,然后删除了该病毒(在开始时删除了转换),然后什么也不做。 尽管出于某种原因它说您应该购买McAfee,但此消息显然并非过时。

坦白说,这确实使我感到困惑,在任何一年的11月8日,它将系统中的所有0变成“恨”的微小字形。 如果您知道为什么需要它,这真的让我感到困扰,让我知道...

当启动任何程序后,它显示一条消息,说她无法吃掉您的主驱动器时,这可能是我的噩梦。 出人意料的令人难以置信。

总之,我们有什么是DOS恶意软件的Navy Seal Copypasta版本。 我不确定该作者是否会喜欢Aladdin,但无论您做什么,都可以成为一个人。
如果您对本文中运行的代码感兴趣,我会
在github上发布我的工具包 ,没有任何保证。 如果要自己创建此代码,则需要进行工作以确保它可与您的MS-DOS安装一起使用(修复处理程序断点)
但是,如果您只是想看看在查看此项目时看到的内容,那么我已将Web界面存档在这里:
dosv.benjojo.co.uk待会见!