Rootkit——内存真的被伪造过么

McAfee首席反病毒专家Rachit Mathur研究过一种被
认为是 TDL3 rootkit 变种的rootkit,这个rootkit就是用来隐藏臭名昭Google Redirect 病毒的程序。
但是这个rootkit的行为有些怪异。Mathur在接受ZDNet的采访时解释说:一些反rootkit工具无法通过hooks直接识别出这个rootkit,另外,它还不允许外部debug工具(Windbg等)进行中断调试,这一点很让人郁闷。Mathur还补充说:反rootkit工具之
所以没有发现可疑的hooks,是因为这些工具所检测的内存本身就是伪造的。很明显,rootkit开发人员使用这种技术的目的就是为了防止被反病毒工具发现并被系统管理者注意到。伪造内存成为可能?听到这个结论,我的第一反应是,“内存是怎么被伪造出来的呢?”Mathur拥有计算机科学硕士学位,专攻逆向工程,程序转换以及恶意软件变种研究。Mathur在McAfee Labs的博客上也有一篇专门针对这个rootkit技术的文章:Memory Forging Attempt by a Rookit. 我尝试着阅读了一下,但是指针,寄存器设置以及debug工具等弄的我有些头大。于是在采访中,我请求McAfee公关部的Joris Evers先生和H3O Communications的Ian Bain先生帮我联系了Mathur先生。下面就是我对Mathur先生的采访内容。记者: 我承认,我还是没明白内存是如何伪造出来的。您能不能比较浅显的解释一下这个技术。Mathur: 我可以先介绍一些背景知识。 Rootkits 一般会修改当前操作系统在内存中的某个特定区域,从而劫持操作系统的控制功能。这么做会迫使操作系统对扫描软件(反病毒软件或反rootkit软件)反馈错误的结果。比如rootkit会隐藏文件,注册表项目,进程等,防止检测软件扫描这些内容。所以,一般来说rootkit都会修改内存。而反rootkit工具则是通过检测内存区域,发现此类可疑修改,并通知用户。我们今天所说的这个rootkit也
同样修改内存的存储单元(安装hook)阻止检测软件的磁盘访问动作。我们假设这个存储单元的位置是X,而这个X是大多数rootkit都会使用的位置,我们所说的这个rootkit也
毫无例外的使用了这个位置。
那么对于反rootkit软件来说,由于大部分rootkit都会修改X位置的内容,因此反rootkit软件就会检查X位置所存储的内容,看其是否被修改过。记者: 抱歉我打断一下,这个rootkit就是在这里做文章的吗?Mathur : 恩,我们今天说的这个rootkit,会将原先X位置的内容搬到Y位置存储起来。当反rootkit软件扫描X位置时,它会将Y位置的内容提供给检测软件。这样检测软件就不会发现X位置有任何异常了。记者: 您刚才提到了 X位置和 Y位置。我想到一个问题:既然检测软件会扫描X位置,为什么rootkit还要将自身信息放在X位置呢?Mathur: 恶意软件之所以必须修改 X位置的数据,是因为操作系统使用X位置来调用处理磁盘访问的特定代码。这样,在磁盘访问过程中,恶意软件就可以决定是否允许程序读取磁盘上某个文件或向其中植入恶意代码。这就是
所谓的调度表hook或IRP hook。记者: 您是说,恶意软件或rootkit有足够的智能,能够分辨哪些程序试图访问X位置?这是怎么实现的呢?Mathur: 恶意软件一定需要判断读取请求来自何处。只有当恶意软件确定操作系统需要读取X位置的代码来进行磁盘访问时,恶意软件才会放心的把恶意代码传送给操作系统。而其它程序,包括反病毒软件需要读取X位置的内容时,恶意软件会将Y位置的原始内容反馈给程序。当发生 X位置的读取请求时,由于CPU硬件中断设置,会触发一个例外事件。而由于恶意软件同时修改了操作系统变量KiDebugRoutine, 恶意代码会在该例外触发时被启动,取得控制权。这时恶意软件已经能获知指令试图读取的内存地址了。恶意软件会将此地址与预先设置的地址列表进行比对,看是否允许继续读取该内存地址的内容。指令中需要读取的地址可以分成两类,一类是地址中包含操作系统数据,另一类是地址包含了恶意代码。如果指令读取的地址与地址列表上的相符,那么恶意代码不会提供伪造内存。相关的代码可以从博客中的图片“KiDebugRoutine Handler: Snippet 3″中看到。接下来的代码是对比一个特定的地址。如果相匹配,那么该异常被设定为不需要伪造内存,读取命令会继续执行,读取“真实”的内存内容:cmp eax, dword_41D810 ; compare EIP with pre-defined locations that are allowed to read correct memoryjz loc_403BC5 ; set as handled and return记者: 这个rootkit有名字吗?Mathur: McAfee 将其定为 TDSS.e!rootkit.记者: 我很好奇,您到底是如何认定这个rootkit伪造了内存呢?Mathur: 最初在分析恶意软件样本时,常用的扫描工具都没有报告出可疑的rootkit活动。但是随着深入研究和debug分析,我们确定其中确实有一个hook,并且它就位于那些扫描工具最常扫描的地址段内。但是这些扫描工具确实什么也没发现。这非常奇怪,所以引起了我的注意。索性这个rootkit设计的并不完美,随着研究的深入,我还是发现了它的蛛丝马迹。我发现通过两种不同方式检查该地址段,所获得的反馈内容是不同的。这是个意料之外的线索。因为我们知道自己在找什么,所以很快我们就发现到硬件中断(DR0 寄存器)设置到X位置,而恶意软件试图保护自身。剩下的工作就是通过标准的逆向工程来还原出rootkit的工作细节。记者: 发现这个rootkit的机制后,行业会有什么动作吗?另外,既然这个rootkit已经流传出去了,会不会有更多的恶意软件开发者利用它或者将其进一步改进?Mathur: 这个问题问得好。目前该技术确实已经被一些恶意软件利用了,而我们也必然会看到反rootkit工具会增加对这种技术的检测功能,比如在访问内存特定区域前,监视硬件中断的活动,或者检查KiDebugRoutine hook等。另外,由于使用这个技术需要设置硬件中断点,因此它可能不会广泛的被各种恶意软件利用。因为一旦知道了它的工作原理,想要检测或避免被这种技术感染的方法并不难。但是,为反rootkit工具增加针对这种技术的检测功能需要一段时间。因此,在未来一小段时间内,我们可能会发现有部分恶意软件利用了这种技术,而且有可能会出现这种技术的变种。
估计最开始是那些设计精巧的恶意软件首先采用该技术,
然后是设计较好的恶意软件采用该技术。虽然这都是预想,但是还是比较靠谱的。记者: 作为普通用户,我们该如何防范采用这种技术的恶意软件呢?Mathur: 从用户的角度说,一般的防范措施,比如浏览安全的网站,保持软件和系统及时更新等,会有一定的帮助。当然,所安装的安全软件需要进行更新,才可能支持对这种新技术的检测和防范。因此用户需要随时关注新版安全软件的推出,并及时更新病毒库。记者: 在您的博客中,您提到这个技术已经存在一段时间了,就是之前一直没有被利用。是不是还有某些新技术也是处于这种状态呢?Mathur:这种技术以前就被人
提起过,但是一直没有恶意软件使用该技术的报告出现,直到这次。不幸的是,我还没有注意到有类似的技术被雪藏。我们认为恶意软件制作者们会继续改进技术,实现更好的隐藏机制。这也是我们将要在今年的Virus Bulletin Conference 上讨论的话题之一。总结病毒和反病毒的斗争一直在持续,未来也是一样。我们感谢像Mathur这样的专家能够认真的研究和分析新的病毒技术,为我们的反病毒斗争带来希望。

时间: 2024-10-06 20:06:22

Rootkit——内存真的被伪造过么的相关文章

内存不能为read的解决办法

近日不少网友都遇到了该内存不能为"read"的错误提示.希望以下文章能对大家有所帮助. 运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭. "0x????????"指令引用的"0x????????"内存.该内存不能为"read". "0x????????"指令引用的"0x????????"内存,该内存不能为"written". 以上的情况相信大家都应该见

内存报错如何解决

  先来说说你的故障和解决的方法,然后我们在分析下类似问题为什么会发生? 故障现象:从桌面或开始菜单中打开任何一个程序, 出现错误提示:"0x........"指令引用的"0x00000000"内存,该内存不能为"read".省略号代表可变值.而从"运行"中打开程序没问题. 处理方法:运行regedit进入注册表, 在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersio

资料:引起内存不能“read”的原因及“written”的解决方案_应用技巧

使用Windows操作系统的人有时会遇到这样的错误信息:"0X????????指令引用的0x00000000内存,该内存不能written",然后应用程序被关闭.如果去请教一些"高手",得到的回答往往是"Windows就是这样不稳定"之类的义愤和不屑.其实,这个错误并不一定是Windows不稳定造成的.本文就来简单分析这种错误的常见原因.  一.应用程序没有检查内存分配失败  程序需要一块内存用以保存数据时,就需要调用操作系统提供的"功

内存不能为"read"的完美解决方案_应用技巧

相信不少兄弟都遇到过该内存不能为"read"的错误提示(例如在SP2下运行以前的传奇霸主外挂).希望以下文章能对大家有所帮助.  运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭.  "0x????????"指令引用的"0x????????"内存.该内存不能为"read".   "0x????????"指令引用的"0x????????"内存,该内存不能为"writ

cookie、session、sessionid 与jsessionid

cookie.session.sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解.   我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案: 凭借柜台职员的记忆,由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速这个顾客当前的存款以及存取的次数,每次存取的金额是多少.-----------这种方式表示协议本身支持状态.      使用存折的方式,然后柜台职员就把每个顾客的存款/取款的信息

应用程序发生异常 未知的软件异常解决方法

一:先说说硬件: 一般来说,电脑硬件是很不容易坏的.内存出现问题的可能性并不大(除非你的内存真的是杂牌的一塌徒地),主要方面是:1.内存条坏了(二手内存 情况居多).2.使用了有质量问题的内存,3.内存插在主板上的金手指部分灰尘太多.4.使用不同品牌不同容量的内存,从而出现不兼容的情况.5.超频带 来的散热问题.你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度. 二.如果都没有,那就从软件方面排除故障了. 先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在

笔记本双内存插槽有啥好处?

  在挑选笔记本电脑的过程中,我们往往都关注于笔记本的外观.处理器.显卡,聪明一点的会关注这款笔记本电脑是否搭载了SSD固态硬盘.但无论是新手还是老手都忽视了内存这一重要因素. 笔记本的内存真的很重要? 那么内存的作用究竟是什么? 在电脑运行的过程中所有程序都是存储在内存中的,比如输入一段文字.玩游戏.或做图片设计,都要在内存中进行.就好比在一个书房里,书架和书柜相当于电脑的硬盘,存放了很多书籍,而办公桌就相当于内存,用来实时读取,所以内存的性能会直接影响电脑的运行速度. 内存容量加大有什么好处

Windows右键菜单失灵怎么办

  出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了. 一:硬件: 一般来说,电脑硬件是很不容易坏的.内存出现问题的可能性并不大(除非你的内存真的是杂牌的一塌徒地),主要方面是: 1.内存条坏了(二手内存情况居多) 2.使用了有质量问题的内存 3.内存插在主板上的金手指部分灰尘太多 4.使用不同品牌不同容量的内存,从而出现不兼容的情况 5.超频带来的散热问题.你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度. 二.如果都没有,那就从

子进程及时知道父进程已经退出的最简单方案

  [精彩] 子进程及时知道父进程已经退出的最简单方案? http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14 [发表评论] [查看原文] [C/C++讨论区][关闭] 要父进程知道子进程退出,这太容易了,但是要子进程知道父进程退出,可有点麻烦.       父进程如果退出,子进程如何知道呢,最笨的方法,父子进程之间建立socket连接,然后建立心跳,没隔1秒测试一把,当然太笨了,通过管道,可以吗?如何做?有更加简单的方法吗?