震惊!隭怣sdos.5.0的真相竟是这样!——记一次“杀毒”

2018-02-10  本文已影响0人  Dumbass

这是一个晴朗的早晨
鸽哨声伴着起床号音
但是这世界并不安宁
和平年代也有激荡的风云
...

一个晴朗的早晨,我拿出U盘,惊讶地发现我的U盘竟然变成了奇怪的样子!


我不慌不忙地百度了一下隭怣sdos.5.0。。。震惊!我竟然中毒了???


我好歹也是曾经在卡饭被人吊起来打的人,我还能中毒???

别慌,格式化一下。


??????????????????
然后打开一看盘里还是这三个文件
难道这真的是传说中格式化也杀不掉的无敌蠕虫???

别慌,我冷静分析了一下,这个问题要从底层来分析。于是我下载了一个WinHex,以二进制视图打开了我的U盘:


恩,看不太懂,我稍微百度了一下,了解了一下FAT32文件系统的结构:
FAT32文件系统的结构是这样的:
DBR (Dos Boot Record,提供引导记录和方便文件系统识别) + Reserved + FAT1(File Allocation Table,文件分配表,用于记载文件所在的具体位置) + FAT2 + Data Area(数据区)
这里为了方便大家理解我从CSDN上盗了一点图:
摘自http://blog.csdn.net/yangyang031213/article/details/79030247
恩,大概就是这么一个结构了。
具体来说的话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有了一定的认识了吧!那么这个和我中毒有什么关系呢???



莫慌!遇事要沉着冷静!经过上面对FAT32结构的大概了解,我们现在可以推出下面这些公式:
FAT1所在位置为0+DBR+Reserved
FAT2所在位置为0+FAT1+FAT1
Data Area所在位置为0+FAT2+FAT1
我们使用WinHex自带的FAT32 Template可以很轻松地从FAT32的DBR中读出我们需要的信息:



由此我们可以计算出我们需要的偏移量:
(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,都挺正常的:


然后我看到了数据区:


这N**的不是DBR吗??????????????????????????
再仔细一看,隭怣sdos.5.0的十六进制形式好像还真的是
EB 58 90 4D 53 44...
图转自http://blog.csdn.net/mjx91282041/article/details/8904705/

都。。都对上了

解决的话就很简单了,只要格式化的时候更改一下Sectors per cluster(每簇扇区数)就可以让数据区最小单位增大,让操作系统认为这些数据无效,或者也可以更改Sectors per FAT等数据,增加偏移量,让数据区避过DBR。

至于为啥Win格式化默认会把数据区正好放在备份DBR上!问得好!
因为Win根本不会把备份DBR放在数据区上!否则不就是Bug了嘛!


稍微调查一下就会发现这类“病毒”最常出现在MP3上,山寨MP3可以说是报废片(50次PE就报废的NAND见过没有?我见过~)最常出没的场所了,这类故障通常是由于数据无法写入的时候主控胡乱映射造成的,比如我上面的例子里其实是主控把写在0扇区的数据映射到了0x001000000的位置上,因为这个地方的NAND块已经不可读/不可写了。
不信?H2TESTW测一发:

没事,问题不大,我之前给U盘开卡的时候没勾选检测坏快,我回去再开个卡就好了
上一篇 下一篇

猜你喜欢

热点阅读