病毒真的可以将自己的代码注入到进程中,从而永久保留在您的计算机上吗?实际删除它的唯一方法是重新安装您的操作系统。我的问题是如何在不损坏文件或进程的情况下做到这一点?
病毒真的可以将其代码注入其他进程吗?
您可以使用 DLL Injection 将代码注入其他进程而不影响任何其他数据
(当然取决于方法)。
其他方法包括重命名和移动合法文件,并用受感染的版本、启动条目等替换它们,但这些方法很容易手动删除。
我能想到的在不亲自使用操作系统补丁或其他数据修改的情况下永久感染的唯一方法是使用启动条目来加载 rootkit 驱动程序,例如 Migbot 或 FU,其中还包括隐藏文件和注册表项的功能挂钩,使其无法手动删除。
然而,这种类型的 rootkit 通常使用内核补丁来修改磁盘上的二进制 OS 数据(需要重新安装才能完全清除),从而破坏了不修改数据的整个目的。
唯一的选择是远离内核并使用正常进程来运行恶意软件并使用 Windows 消息挂钩或类似的东西来应用挂钩而不修改数据。
但是这种方法有一个缺点……与内核 OS 补丁相比,Userland 挂钩非常容易检测。
因此,可能会有不修改数据的恶意软件,但它很容易被任何半感知防病毒/菜鸟软件检测和删除,这意味着野生恶意软件中没有多少(如果有的话!)会使用非-修改方法,因为从隐身的角度来看,补丁等要好得多(有时甚至比非修改挂钩更容易!)。
你问的是两个不同的问题。
病毒真的可以将其代码注入其他进程吗?
答案是:是的,他们可以。您可以使用DLL Injection将代码注入其他进程。这并不能确保每次计算机启动时都会加载病毒,或者病毒将不可检测/不可分离。这只是意味着病毒将从另一个进程(可能是PE)的地址空间运行。
病毒将其代码注入其他进程这一事实是否确保它们将“附加到操作系统”直到重新安装?
不,除非他们有一些rootkit功能。有几种方法可以让 rootkit 将自己附加到您的系统上。您可以在一篇关于TDL4的文章中了解其中一种方法,该文章将自身写入MBR以启动自身,从而确保恶意代码将在操作系统启动之前运行。
如果病毒是已知的,大多数 AV 应该识别它的行为并清理你的机器。对于新的病毒/rootkit 变种,使用常规工具删除恶意代码可能非常复杂。Rootkits 从 ring-0(内核模式)作为驱动程序运行,您必须找到并禁用它(从未感染的操作系统执行此操作!)。
我认为首先了解在操作系统上运行进程意味着什么是值得的。
大多数操作系统使用一种称为需求分页的东西。在 Linux 中,这是对PROT_READ | PROT_WRITE | MMAP_PRIVATE
系统mmap()
调用的影响。具体来说,进程并没有完全复制到内存中——代码段是,而其余的则映射到文件系统。如果这些页面中的任何一个在内存中被修改,它们首先被复制到内存中。这也称为“写时复制”。mmap()
这意味着对正在运行的进程的任何修改都不会通过(或 Windows 等价物)自动写回磁盘。
最终结果是您应该想象实际上有两件事:磁盘上的程序副本(以下称为磁盘映像)和内存中进程的副本,驻留在其虚拟内存沙箱中(以下称为“地址空间”)。
进程的地址空间不仅会损害程序本身 - 它还包括共享库 (DLL),并且在许多情况下,一半的虚拟地址空间包括您无法访问的操作系统内容(请参阅 2GB 拆分与 4GB/4GB 模式. 有没有想过为什么 Windows 上的进程限制为 2GB?这就是为什么)。堆栈和“堆”等程序数据也存在于虚拟地址空间中 - 这两者都包含程序数据。
所以现在我们有了一些背景知识,这里有两种方法可以改变流程:
运行时修改
这实际上比您想象的要少 - 通常,您的目标是利用糟糕的编码并使用输入法将特制的输入片段放入进程地址空间,通常称为“shell代码”,其目标是提供远程攻击者终端提示符(因此是“shell”)。这不是您可以采取的唯一行动——您可以做任何事情,从下载远程文件到修改注册表设置。如果您没有向远程框发出管理员提示,那么您的目标很可能是提供比输入缓冲区更大的有效负载并执行该有效负载(通过利用浏览器插件来驱动下载以这种方式运行)。
这种技术有多种变体,但所有变体都涉及改变执行流程,以使一些意想不到的事情发生,通常对攻击者有利。作为写时复制设置的结果,可执行文件的原始磁盘映像保持不变,但您可能会使刚刚利用的进程崩溃,或者产生一些故障。产生无声的利用是困难的,但并非不可能。
为什么每个人都在提到 DLL 注入?
好吧,事实证明,有些程序是在开发过程中使用安全性编写的,我们不能给它们提供任何垃圾输入并让它们执行它。所以需要其他技术。DLL 注入,或者LD_PRELOAD
用 Linux 来说,是在所有其他对象之前将共享对象加载到每个或仅一个进程的地址空间的过程。这为您提供了目标进程的虚拟内存中的代码,然后可以“挂钩”(重定向)程序的某些部分。这方面的教程很容易 找到。然后,您就可以利用该过程达到自己的目的。但是,大多数时候您都需要磁盘上的 DLL。
事实证明,对于那些在 metasploit 开发meterpreter 的好人来说,这还不够,meterpreter 是一种能够将 DLL 下载到内存中然后将其注入系统的 shellcode。
修改磁盘映像
您可能会使用上述技术或其变体进入系统,并且您可能会在某处交付有效负载并确保它被执行。但是,您可以做的其他事情是在系统上安装的已知程序上实际编写一个新的磁盘映像,并使用您选择的有效负载进行修改。要成功地做到这一点,您需要仔细地对原始代码进行逆向工程并插入您的漏洞利用。存在三个潜在问题:
- 如果你犯了一个错误,程序很可能会崩溃。
- 如果您以高度可变的组件为目标,则会遇到移动目标问题。您的修改是否适用于所有情况和所有场景?
- 一些程序经过专门设计,可以抵抗对它们进行逆向工程或修补的尝试。这是游戏行业中相当普遍的做法,以防止磁盘复制。您可能不会认为您正在使用以这种方式编写的任何内容,在这种情况下,我邀请您阅读 vanilla skype第 1部分和第 2 部分的努力。事实证明,Skype 的作者不希望它进行反向工程。这种保护级别使得成功修改可执行文件变得更加困难。
内核补丁 - 它是什么?
修补是一个有点奇怪的词。应用于内核,它通常意味着修改内核线程地址空间内的数据结构,以隐藏某些东西,或实现其他目的,例如监控。
但是,内核本身也有磁盘映像,因此可以通过这种方式修补内核组件,包括驱动程序。同样,修改磁盘映像很困难,但并非不可能。
关于持久性和重新安装要求
持久性需要在某些时候写入磁盘。如果计算机重新启动,您将需要将恶意软件存储在某个地方。进程(或内核)地址空间中的利用代码将丢失,就像所有 RAM 都在重新启动之间一样,因此如果您希望持续重新启动,您需要某种方式来重新加载您的代码。这包括 rootkit,它们也需要确保它们被重新加载。
即使关键部件被修改,您在技术上也不需要重新安装操作系统——您需要做的就是用干净的版本(即从您的 Windows 安装光盘中)替换这些关键部件。关于恶意软件的任何内容都不需要您重新安装。这完全取决于您必须取消多少以及您删除所有错误代码的可能性有多大。因此,重新安装更安全。这就是我会做的,也是我会建议其他人做的。
告诉我有什么防御措施?!
是的。Authenticode旨在防止对任何旧程序的修改未被检测到。内核补丁保护(维基百科)(常见问题解答)保护内核数据结构不被驱动程序修改。W^X,ASLR,Stack Canaries,Non Executable Stack等保护正在运行的程序免受明显修改。这些都不是完美的,但如果使用得当,它们会使开发变得更加困难。
是的,这是真的。是的,病毒会感染您的计算机,因此在您重新安装操作系统之前它会一直处于感染状态。
例如,病毒可以自行安装在启动文件夹中,因此每次启动计算机时它都会自动重新启动。它还可以修改存储在磁盘上的可执行文件,以用受感染的版本替换它们,这样每次启动程序时,它就会被已经感染的病毒启动。
您没有说明为什么您认为病毒不会修改文件系统上的任何内容,也不会修改进程。有些病毒肯定会做其中的一种或两种。