710 likes | 887 Views
计算机病毒分析. 彭国军 2003.3.29. 将要介绍的几种病毒类型. DOS 病毒 引导区病毒 文件型病毒 混合型病毒 Windows 病毒 VBS 脚本病毒 宏病毒 网页病毒 Win32 PE 病毒. 引导区病毒. 什么是主引导记录? 硬盘的主引导记录在硬盘的 0 磁头 0 柱面 1 扇区。主引导记录由三部分组成: 主引导程序; 四个分区表; 主引导记录有效标志字。. DOS 引导区病毒. 引导区病毒 所谓引导区病毒是指一类专门感染软盘引导扇区和硬盘主引导扇区的计算机病毒程序。
E N D
计算机病毒分析 彭国军 2003.3.29
将要介绍的几种病毒类型 • DOS病毒 • 引导区病毒 • 文件型病毒 • 混合型病毒 • Windows病毒 • VBS脚本病毒 • 宏病毒 • 网页病毒 • Win32 PE病毒
引导区病毒 • 什么是主引导记录? • 硬盘的主引导记录在硬盘的0磁头0柱面1扇区。主引导记录由三部分组成: • 主引导程序; • 四个分区表; • 主引导记录有效标志字。
DOS引导区病毒 • 引导区病毒 • 所谓引导区病毒是指一类专门感染软盘引导扇区和硬盘主引导扇区的计算机病毒程序。 • 如果被感染的磁盘被作为系统启动盘使用,则在启动系统时,病毒程序即被自动装入内存,从而使现行系统感染上病毒。 • 在系统带毒的情况下,如果进行了磁盘I/O操作,则病毒程序就会主动地进行传染,从而使其它的磁盘感染上病毒。
DOS的正常启动过程 • 加电开机后进入系统的检测程序并执行该程序对系统的基本设备进行检测; • 检测正常后从系统盘0面0道1扇区即逻辑0扇区读入Boot引导程序到内存的0000: 7C00处; • 转入Boot执行之; • Boot判断是否为系统盘, 如果不是系统盘则提示: non-system disk or disk error Replace and strike any key when ready 否则, 读入IBM BIO.COM和IBM DOS.COM两个隐含文件;
DOS的正常启动过程 • 执行IBM BIO.COM和IBM DOS.COM两个隐含文件, 将COMMAND.COM装入内存; • 系统正常运行, DOS启动成功。 • 引导区病毒实际上就是先保存软盘的引导记录或者硬盘的主引导记录,然后用病毒程序替换原来的引导记录,这样,当系统引导时,便先执行病毒程序,然后将控制权转交给正常的引导程序。
带毒盘引导的启动过程 • 将Boot区中病毒代码首先读入内存的0000: 7C00处; • 病毒将自身全部代码读入内存的某一安全地区、常驻内存, 监视系统的运行; • 修改INT 13H中断服务处理程序的入口地址, 使之指向病毒控制模块并执行之。因为任何一种病毒要感染软盘或者硬盘,都离不开对磁盘的读写操作, 修改INT13H中断服务程序的入口地址是一项少不了的操作; • 病毒程序全部被读入内存后才读入正常的Boot内容到内存的0000: 7C00处, 进行正常的启动过程; • 病毒程序伺机等待随时准备感染新的系统盘或非系统盘。
感染过程 • 是否在读写软盘? • 是,则将目标盘的引导扇区读入内存, 对该盘进行判别是否传染了病毒; • 当满足传染条件时, 则将病毒的全部或者一部分写入Boot区, 把正常的磁盘的引导区程序写入磁盘特写位置; • 返回正常的INT 13H中断服务处理程序, 完成了对目标盘的传染。
引导型病毒的主要特点 • 引导型病毒是在安装操作系统之前进入内存,寄生对象又相对固定,因此该类型病毒基本上不得不采用减少操作系统所掌管的内存容量方法来驻留内存高端。而正常的系统引导过程一般是不减少系统内存的。 • 引导型病毒需要把病毒传染给软盘,一般是通过修改INT 13H的中断向量,而新INT 13H中断向量段址必定指向内存高端的病毒程序。 • 引导型病毒感染硬盘时,必定驻留硬盘的主引导扇区或引导扇区,并且只驻留一次,因此引导型病毒一般都是在软盘启动过程中把病毒传染给硬盘的。
文件型病毒 • 什么是文件型病毒? • 所有通过操作系统的文件系统进行感染的病毒都称作文件病毒 。 • 我们将会介绍的两种病毒 • COM文件型病毒 • EXE文件型病毒
COM文件型病毒 • COM文件被载入内存后的格式
COM文件型病毒 • 病毒要感染COM文件一般采用两种方法: • 加在文件尾部
COM文件型病毒 • 加在文件头部
EXE文件型病毒 • MZ文件头格式 • 偏移 大 小 描述 • 00 2bytes .EXE文件类型标记:4d5ah • 02 2bytes文件的最后一个扇区的字节数 • 04 2bytes文件的总扇区数 文件大小=(总扇区数-1)*512+最后一页字节数 • 06 2bytes重定位项的个数 • 08 2bytes exe文件头的大小 (16bytes*thisvalue) • 0a 2bytes最小分配数(16bytes*thisvalue) • 0c 2bytes最大分配数(16bytes*thisvalue) • 0e 2bytes堆栈初始段址(SS) • 10 2bytes堆栈初始指针(SP) • 12 2bytes补码校验和 • 14 2bytes初始代码段指针(IP) • 16 2bytes初始代码段段址(CS) • 18 2bytes定位表的偏移地址 • 1a 2bytes覆盖号Theoverlaynumbermakebylink
EXE文件型病毒的感染 • 头寄生
EXE文件型病毒的感染 • 尾寄生
EXE文件型病毒的感染 • 插入寄生
EXE文件型病毒的感染 • 伴随型
EXE文件型病毒的感染 • 病毒感染的方式还有很多,譬如DIRII属于一种链接型的病毒,还有无入口点的病毒,没有任何美感的覆盖型病毒等。 • 病毒如何感染,一直是病毒研究的话题,这并不存在非常固定的模式。病毒作者完全可以任意发挥自己的想象。
混合型病毒 • 什么是混合型病毒? • 所谓混合型病毒,就是指既可以感染引导区又可以感染文件的病毒。 • 但是这种病毒绝对不是引导区病毒和文件型病毒的简单相加。 • 文件型病毒大多采用INT 21H,但是引导型病毒是在引导阶段进行感染驻留,这时DOS系统还没有启动,因此混合型病毒此时无法采用21号中断。如何解决这个问题?
VBS脚本病毒如何感染 • VBS脚本病毒是直接通过自我复制来感染文件的病毒中的绝大部分代码都可以直接附加在其他同类程序的中间. • 新欢乐时光病毒可以将自己的代码附加在.htm文件的尾部,并在顶部加入一条调用病毒代码的语句. • 爱虫病毒则是直接生成一个文件的副本,将病毒代码拷入其中,并以原文件名作为病毒文件名的前缀,vbs作为后缀。
VBS脚本病毒如何感染 • 文件感染的部分关键代码 set fso=createobject(“scripting.filesystemobject”) ‘创建一个文件系统对象 set self=fso.opentextfile(wscript.scriptfullname,1) ‘读打开当前文件(即病毒本身) vbscopy=self.readall ' 读取病毒全部代码到字符串变量vbscopy …… set ap=fso.opentextfile(目标文件.path,2,true) ' 写打开目标文件,准备写入病毒代码 ap.write vbscopy '将病毒代码覆盖目标文件 ap.close set cop=fso.getfile(目标文件.path) '得到目标文件路径 cop.copy(目标文件.path & ".vbs") '创建另外一个病毒文件(以.vbs为后缀) 目标文件.delete(true) '删除目标文件
VBS脚本病毒如何搜索文件 ‘该函数主要用来寻找满足条件的文件,并生成对应文件的一个病毒副本 sub scan(folder_) 'scan函数定义, on error resume next '如果出现错误,直接跳过,防止弹出错误窗口 set folder_=fso.getfolder(folder_) set files=folder_.files ' 当前目录的所有文件集合 for each file in files ext=fso.GetExtensionName(file) '获取文件后缀 ext=lcase(ext) '后缀名转换成小写字母 if ext=“mp5” then ‘如果后缀名是mp5,则进行感染。 Wscript.echo (file) end if next set subfolders=folder_.subfolders for each subfolder in subfolders ‘搜索其他目录;递归调用scan( ) scan(subfolder) next end sub
VBS脚本病毒如何获得控制权 1)修改注册表项 • windows在启动的时候,会自动加载HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run项下的各键值所执向的程序。脚本病毒可以在此项下加入一个键值指向病毒程序,这样就可以保证每次机器启动的时候拿到控制权。vbs修改贮册表的方法比较简单,直接调用下面语句即可。 wsh.RegWrite(strName, anyValue [,strType]) 2)通过映射文件执行方式 • 譬如,新欢乐时光将dll的执行方式修改为wscript.exe。甚至可以将exe文件的映射指向病毒代码。
VBS脚本病毒如何获得控制权 3)欺骗用户,让用户自己执行 这种方式其实和用户的心理有关。譬如,病毒在发送附件时,采用双后缀的文件名,由于默认情况下,后缀并不显示,举个例子,文件名为beauty.jpg.vbs的vbs程序显示为beauty.jpg,这时用户往往会把它当成一张图片去点击。同样,对于用户自己磁盘中的文件,病毒在感染它们的时候,将原有文件的文件名作为前缀,vbs作为后缀产生一个病毒文件,并删除原来文件,这样,用户就有可能将这个vbs文件看作自己原来的文件运行。 4)desktop.ini和folder.htt互相配合 这两个文件可以用来配置活动桌面,也可以用来自定义文件夹。如果用户的目录中含有这两个文件,当用户进入该目录时,就会触发folder.htt中的病毒代码。这是新欢乐时光病毒采用的一种比较有效的获取控制权的方法。
VBS脚本病毒的网上传播 1)通过Email附件传播 设置Outlook对象= 脚本引擎.创建对象("Outlook.Application") 设置MAPI对象= Outlook对象.获取名字空间("MAPI") For i=1 to MAPI对象.地址表.地址表的条目数//两个for语句用来遍历整个地址簿 设置地址对象= MAPI对象.地址表(i) For j=1 To地址对象.地址栏目.地址栏目数 设置邮件对象= Outlook对象.创建项目(0) 设置地址入口=地址对象.地址栏目(j) 邮件对象.收件人=地址入口.邮件地址 邮件对象.主题= “你好!” 邮件对象.附件标题= “好看的东东,请打开” 邮件对象.附件.增加(“test.jpg.vbs“) 邮件对象.发送 邮件对象.发送后删除=真 Next Next
VBS脚本病毒的网上传播 2)通过局域网共享传播 在局域网中,用户之间为了方便文件交流,通常会设置共享目录,并且通常具有可写权限。病毒可以利用共享目录,进行病毒传播扩散。 3)通过感染htm、asp、jsp、php等网页文件传播 如今,WWW服务已经变得非常普遍,病毒通过感染htm等文件,势必会导致所有访问过该网页的用户机器感染病毒。
VBS脚本病毒的网上传播 4)通过IRC聊天通道传播 随着即时聊天系统的普及和基于浏览的浏览逐渐成为交流的主要方式,这种方式病毒采用的机会相对比较小,譬如叛逃者病毒就采用了这种传播方式。 5)通过P2P共享工具进行传播 病毒也可以通过现在广泛流行的KaZaA等点对点共享软件进行传播。病毒将病毒文件拷贝到KaZaA的默认共享目录中,这样,当其他用户访问这台机器时,就有可能下载该病毒文件并执行。这种传播方法可能会随着KaZaA这种点对点共享工具的流行而发生作用。
VBS脚本病毒的弱点 1)绝大部分VBS脚本病毒运行的时候需要用到一个对象:FileSystemObject。 2)VBScript代码是通过Windows Script Host来解释执行的。 3)VBS脚本病毒的运行需要其关联程序Wscript.exe的支持。 4)通过网页传播的病毒需要ActiveX的支持。 5)通过Email传播的病毒需要OE的自动发送邮件功能支持,但是绝大部分病毒都是以Email为主要传播方式的。
如何防范vbs脚本病毒 1)禁用文件系统对象FileSystemObject 方法:用regsvr32 scrrun.dll /u这条命令就可以禁止文件系统对象。其中regsvr32是Windows\System下的可执行文件。或者直接查找scrrun.dll文件删除或者改名。 还有一种方法就是在注册表中HKEY_CLASSES_ROOT\CLSID\下找到一个主键{0D43FE01-F093-11CF-8940-00A0C9054228}的项,咔嚓即可。 2)卸载Windows Scripting Host 在Windows 98中(NT 4.0以上同理),打开[控制面板]→[添加/删除程序]→[Windows安装程序]→[附件],取消“Windows Scripting Host”一项。 和上面的方法一样,在注册表中HKEY_CLASSES_ROOT\CLSID\下找到一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}的项。 3)删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射 点击[我的电脑]→[查看]→[文件夹选项]→[文件类型],然后删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射。
如何防范vbs脚本病毒 4)在Windows目录中,找到WScript.exe,更改名称或者删除,如果你觉得以后有机会用到的话,最好更改名称好了,当然以后也可以重新装上。 5)要彻底防治VBS网络蠕虫病毒,还需设置一下你的浏览器。我们首先打开浏览器,单击菜单栏里“Internet 选项”安全选项卡里的[自定义级别]按钮。把“ActiveX控件及插件”的一切设为禁用,这样就不怕了。呵呵,譬如新欢乐时光的那个ActiveX组件如果不能运行,网络传播这项功能就玩完了。 6)禁止OE的自动收发邮件功能
如何防范vbs脚本病毒 7)由于蠕虫病毒大多利用文件扩展名作文章,所以要防范它就不要隐藏系统中已知文件类型的扩展名。Windows默认的是“隐藏已知文件类型的扩展名称”,将其修改为显示所有文件类型的扩展名称。 8)将系统的网络连接的安全级别设置至少为“中等”,它可以在一定程度上预防某些有害的Java程序或者某些ActiveX组件对计算机的侵害。 9)最后一项:杀毒软件确实很必要,尽管有些杀毒软件挺让广大用户失望,不过。
宏病毒 • 什么是宏病毒? • 宏病毒是使用宏语言编写的程序,可以在一些数据处理系统中运行(主要是微软的办公软件系统,字处理、电子数据表和其他Office程序中),存在于字处理文档、数据表格、数据库、演示文档等数据文件中,利用宏语言的功能将自己复制并且繁殖到其他数据文档里。
宏病毒 • 宏病毒在某种系统中能否存在,首先需要这种系统具有足够强大的宏语言,这种宏语言至少要有下面几个功能: • 一段宏程序可以附着在一个文档文件后面。 • 宏程序可以从一个文件拷贝到另外一个文件。 • 存在这样一种机制,宏程序可以不需要用户的干预自动执行。
病毒如何拿到控制权 • 利用如下自动执行宏,将病毒代码写在如下宏中,由于这些宏会自动执行,因此获取控制权。
宏病毒如何传染 • 绝大多数病毒采用如下语句 ActiveDocument.VBProject.VBComponents("guojpeng").Export"c:\guojpeng.sys" //将文档中的病毒代码导出到c:\guojpeng.sys NormalTemplate.VBProject.VBComponents.Import "c:\guojpeng.sys" //将病毒代码从文件导入导通用模板 • 也可能采用如下方式: ActiveDocument.VBProject.VBComponents.Item(1).Export "c:\guojpeng.sys" NormalTemplate.VBProject.VBComponents(1).CodeModule.AddFromFile "c:\guojpeng.sys"
宏病毒的自我隐藏 • On Error Resume Next //如果发生错误,不弹出出错窗口,继续执行下面语句 • Application.DisplayAlerts = wdAlertsNone //不弹出警告窗口 • Application.EnableCancelKey = wdCancelDisabled //不允许通过ESC键结束正在运行的宏 • Application.DisplayStatusBar = False //不显示状态栏,以免显示宏的运行状态Options.VirusProtection = False • //关闭病毒保护功能,运行前如果包含宏,不提示 • Options.SaveNormalPrompt = False //如果公用模块被修改,不给用户提示窗口而直接保存 • Application.ScreenUpdating = False //不让刷新屏幕,以免病毒运行引起速度变慢
网页病毒 • 我们这里所指的网页病毒是指在html文件中用于非法修改用户机器配置的html文件。有别于一般通过网页传染的病毒。 • 这种病毒严格意义上讲不属于病毒,它们只是网页恶意代码,这些代码主要用来修改用户的注册表。
网页病毒中常见的代码 <APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXCompone nt></APPLET><SCRIPT>function runcmd() {a=document.applets[0];a.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');a.createInstance();wsh=a.GetObject();wsh.Run('cmd.exe');//改为"wsh.Run('cmd.exe',false,1);"则程序在后台隐藏运行}setTimeout('runcmd()',10);</SCRIPT>
网页病毒主要症状 • 在用户IE浏览器的标题栏打广告 • 修改IE的默认网址,并且不可以修改 • 锁定用户的注册表编辑程序 • 禁止使用“运行”选项 • 有时候也可能对硬盘进行格式化,在用户机器上创建一些文件
Win32 PE病毒 • 什么是PE病毒? • PE病毒是指所有感染Windows下PE文件格式文件的病毒。 • PE病毒大多数采用Win32汇编编写。 • PE病毒对于一个热衷于病毒技术的人来说,是必须掌握的。 • 只有在PE病毒中,我们才能真正感受到高超的病毒技术。
编写Win32病毒的几个关键 • Api函数的获取 • 不能直接引用动态链接库 • 需要自己寻找api函数的地址,然后直接调用该地址 • 一点背景:在PE Loader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,肯定在Kernel中! 因此我们可以得到这个地址,然后向低地址缩减验证一直到找到模块的起始地址,验证条件为PE头不能大于4096bytes,PE header的ImageBase值应该和当前指针相等. • 病毒没有.data段,变量和数据全部放在.code段
编写Win32病毒的几个关键 • 偏移地址的重定位 Call delta delta: pop ebp sub ebp,offset delta 那么变量var1的真正偏移地址为:var1+ebp • 对PE文件格式的了解
编写Win32病毒的几个关键 • 病毒如何感染其他文件 • 在文件中添加一个新节 • 该新节中添加病毒代码和病毒执行后的返回Host程序的代吗 • 修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的节,以便程序运行后先执行病毒代码。 PE病毒感染其他文件的方法还有很多,譬如PE病毒还可以将自己分散插入到每个节的空隙中等等,这里不在一一叙述。
PE header Pe header 由三部分组成 • 字串 “PE\0\0”(Signature) • 映像文件头(FileHeader) • 可选映像头(OptionalHeader)
字串 “PE\0\0” • Signature一dword类型,值为50h, 45h, 00h, 00h(PE\0\0)。本域为PE标记,我们可以此识别给定文件是否为有效PE文件。 • 这个字串在文件中的位置(e_lfanew),可以在DOS程序头中找到它的指针,它占用四个字节,位于文件开始偏移3CH字节中。
映像文件头 • 该结构域包含了关于PE文件物理分布的信息,比如节数目、文件执行机器等。 • 它实际上是结构IMAGE_FILE_HEADER的简称。
映像文件头结构 IMAGE_FILE_HEADER STRUCT Machine WORD ? NumberOfSections WORD ? TimeDateStamp dd ? PointerToSymbolTable dd ? NumberOfSymbols dd ? SizeOfOptionalHeader WORD ? Characteristics WORD ? IMAGE_FILE_HEADER ENDS