-
-
[翻译]MacOS平台一个古老的恶意软件INIT29的分析
-
发表于: 2020-5-14 11:15 8375
-
在上一篇文章中,我介绍了我设置的“经典” Mac OS仿真器。 我设置模拟器的目的之一是能够查看和分析感染旧版Mac OS的病毒。 我认为研究旧病毒很有趣的原因有二。 首先,它很好地概述了68k汇编。 其次,这提供了一个研究恶意软件历史的有趣角度。 我决定研究的第一个病毒称为INIT 29。
下面是Disinfectant 3.7.1的帮助文件对此病毒的简短描述:
INIT 29病毒于1988年底首次出现。我们对其起源了解不多。 第二个较小的变异出现在1994年3月。两种类型之间没有显着差异。 原始型称为“ INIT 29 A”。 该变型称为“ INIT 29 B”。
INIT 29具有极强的感染性。 它迅速传播。 与Scores和nVIR不同,系统不必运行应用程序即可被感染,而且INIT 29可以感染几乎所有文件,包括应用程序,系统文件和文档文件。 文档文件可以被感染,但没有传染性。 该病毒只能通过系统文件和应用程序文件传播。
使用ResEdit可以轻松识别感染了INIT 29病毒的应用程序。 如下图:
病毒的第一个指示是恰好712个字节的CODE
资源。 第二个指示可以在跳转表中看到。 每个可执行文件都有一个包含跳转表的ID为0的CODE
资源。 如果是小型应用程序,则表中可能只有一两个条目。 通常,当编译器构建应用程序时,它将顺序创建CODE
资源,并且类似地,跳转表也将以线性方式进行布局。 跳转表中的第一个条目指向可执行文件的主要入口点。 然而对于上面的跳转表,跳转表中的第一个条目实际上指向ID为3的CODE
资源。基于资源名称,你可以看到ID 1的名称为“ Main”,且包含最多的代码,这应该是应用程序的入口点,但是INIT 29病毒已修改了跳转表入口以指向自身。
下图显示了一部分病毒代码。 您可以看到它如何将原始跳转表条目保存到ID为1的CODE
资源中。
运行受感染的应用程序时,它将调用UseResFile
并传递refNum
值为零。 这将检索系统资源文件。 然后,它将在INIT
资源部分中创建一个ID为29的新条目。这也是病毒名称的来源。 病毒会将其所有712字节自身复制到此INIT
资源中。 然后,当系统下次启动时,将执行此代码。
使用ResEdit也很容易识别受感染的系统文件。 我们可以在模拟器中运行受感染的应用程序,然后在病毒启动前后使用ResEdit比较系统文件。
左侧是病毒启动前的应用程序,右侧是病毒启动后。 你可以看到,在运行了受感染的应用程序之后,现在有了ID为29,大小为712字节的新 INIT
资源。 如果我们反汇编病毒代码,则可以看到以下内容:
INIT
代码很短,它调用传入$A997的GetTrapAddress
来获取当前OpenResFile
函数的地址。 它将检查是否已打补丁,如果尚未打补丁,则会保存指向原始函数的指针。 然后,它在系统堆上分配712个字节,并在那里复制其自身。 最后,它调用SetTrapAddress
将其自身安装为新的OpenResFile
函数。
OpenResFile
是重要的系统API, Finder每次打开文件或运行可执行文件时,都要调用OpenResFile
查找有关该文件的信息。由于使用频率很高,所以病毒利用它也非常容易感染其他文件。劫持的OpenResFile
版本首先调用该函数的原始操作系统版本。这将加载资源文件并将其设置为当前资源。然后,病毒会查看该文件是否有任何CODE
资源。如果该文件没有任何CODE
资源,则该病毒会创建ID为29的INIT
资源,并将其712字节复制到其中。这样会导致文档文件包含病毒代码,但无法感染其他任何文件。如果打开的资源确实具有CODE
资源,则病毒会尝试查找要使用的空闲ID。它将使用最低的空闲ID来创建新的资源条目,并将其712字节复制到其中。之后,它将打开ID为0的CODE
资源,并修补跳转表以指向刚创建的新资源。这导致应用程序在下次尝试感染系统文件时开始运行病毒代码。
通过INIT 29病毒尝试感染打开的每个资源文件,可以很容易地看出为什么Disinfectant帮助文件称该病毒为“极具传染性”。 在大多数情况下,该病毒是无害的,只会感染文件。 但是,由于它确实劫持了应用程序的启动,因此有可能在启动程序时注意到速度变慢。特别有趣的是,这个病毒仅用712字节的代码就能完成这么多的工作。