震惊!隭怣sdos.5.0的真相竟是这样!——记一次“杀毒”
这是一个晴朗的早晨
鸽哨声伴着起床号音
但是这世界并不安宁
和平年代也有激荡的风云
...
一个晴朗的早晨,我拿出U盘,惊讶地发现我的U盘竟然变成了奇怪的样子!
我不慌不忙地百度了一下隭怣sdos.5.0。。。震惊!我竟然中毒了???
我好歹也是曾经在卡饭被人吊起来打的人,我还能中毒???
![](https://img.haomeiwen.com/i6388505/37525ee7fa36bf72.jpeg)
别慌,格式化一下。
??????????????????
然后打开一看盘里还是这三个文件
难道这真的是传说中格式化也杀不掉的无敌蠕虫???
别慌,我冷静分析了一下,这个问题要从底层来分析。于是我下载了一个WinHex
,以二进制视图打开了我的U盘:
![](https://img.haomeiwen.com/i6388505/8540824827f93968.png)
恩,看不太懂,我稍微百度了一下,了解了一下FAT32文件系统的结构:
FAT32文件系统的结构是这样的:
DBR (Dos Boot Record,提供引导记录和方便文件系统识别) + Reserved + FAT1(File Allocation Table,文件分配表,用于记载文件所在的具体位置) + FAT2 + Data Area(数据区)
这里为了方便大家理解我从CSDN上盗了一点图:
![](https://img.haomeiwen.com/i6388505/bcf9034750c7d2fb.png)
恩,大概就是这么一个结构了。
具体来说的话DBR这一部分是文件系统的身份证明,文件系统驱动通过DBR来识别文件系统类型,同时,DBR内还包含了一系列文件系统驱动加载文件系统时需要的数据,如:Bytes per sector(每扇区包含的字节数,扇区是硬盘的最小储存空间单位)、Sectors per FAT(每文件分配表包含的扇区数)等等。
说完了DBR,接着来说一下FAT(文件分配表):
FAT32中有两张FAT,内容完全一样,FAT2作为FAT1的备份使用(毕竟如果FAT丢了文件就丢了,有备份很重要)。
FAT32中将几个扇区(Sector)作为一个簇来使用,簇是数据区的最小存储单位。
FAT表会时刻维护数据区中每个簇的状态,每个簇的地址在FAT表用32个bit来表示(这也是FAT32这个名字的来源,是32位的文件系统),对于没有使用的簇,用0来标识。
值得一提的是,FAT32是一个链式的文件系统,一个文件常常需要被拆散在多个簇中保存,FAT表的作用就是保存下一块数据所在的簇,就像是数据结构课中教过的链表中每个指向下一个node的指针。
好的,说了这么多,想必大家都对FAT32有了一定的认识了吧!那么这个和我中毒有什么关系呢???
![](https://img.haomeiwen.com/i6388505/52da242d78c3fe26.jpeg)
莫慌!遇事要沉着冷静!经过上面对FAT32结构的大概了解,我们现在可以推出下面这些公式:
FAT1所在位置为0+DBR+Reserved
FAT2所在位置为0+FAT1+FAT1
Data Area所在位置为0+FAT2+FAT1
我们使用WinHex自带的FAT32 Template可以很轻松地从FAT32的DBR中读出我们需要的信息:
![](https://img.haomeiwen.com/i6388505/058620cdf6e66755.png)
由此我们可以计算出我们需要的偏移量:
(Base Offset : 0x0):
FAT1:Bytes per sector*Reserved sectors = 0x126800
(Base Offset : 0x126800):
FAT2:Bytes per sector*Sectors per FAT = 0x76CC00
(Base Offset : 0x893400):
Data Area:Bytes per sector*Sectors per FAT = 0x76CC00
恩,我照着这个偏移量开始一个个检查,先看了一下两个FAT,都挺正常的:
![](https://img.haomeiwen.com/i6388505/aca5af1e23f6b8b4.png)
然后我看到了数据区:
![](https://img.haomeiwen.com/i6388505/c2bcea2687d40f86.png)
![](https://img.haomeiwen.com/i6388505/470c1674b8d3284a.jpeg)
这N**的不是DBR吗??????????????????????????
再仔细一看,隭怣sdos.5.0的十六进制形式好像还真的是
EB 58 90 4D 53 44...
![](https://img.haomeiwen.com/i6388505/069a38c719b0d83e.jpg)
都。。都对上了
解决的话就很简单了,只要格式化的时候更改一下Sectors per cluster(每簇扇区数)就可以让数据区最小单位增大,让操作系统认为这些数据无效,或者也可以更改Sectors per FAT等数据,增加偏移量,让数据区避过DBR。
至于为啥Win格式化默认会把数据区正好放在备份DBR上!问得好!
因为Win根本不会把备份DBR放在数据区上!否则不就是Bug了嘛!
![](https://img.haomeiwen.com/i6388505/4c29044936575700.jpg)
稍微调查一下就会发现这类“病毒”最常出现在MP3上,山寨MP3可以说是报废片(50次PE就报废的NAND见过没有?我见过~)最常出没的场所了,这类故障通常是由于数据无法写入的时候主控胡乱映射造成的,比如我上面的例子里其实是主控把写在0扇区的数据映射到了0x001000000的位置上,因为这个地方的NAND块已经不可读/不可写了。
不信?H2TESTW测一发:
没事,问题不大,我之前给U盘开卡的时候没勾选检测坏快,我回去再开个卡就好了
![](https://img.haomeiwen.com/i6388505/ed67d3a0b8d7aac6.jpg)