Chinaunix首页 | 论坛 | 博客

qsh

  • 博客访问: 3932994
  • 博文数量: 1015
  • 博客积分: 15904
  • 博客等级: 上将
  • 技术积分: 8572
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-04 19:16
文章分类

全部博文(1015)

文章存档

2019年(1)

2017年(1)

2016年(19)

2015年(27)

2014年(30)

2013年(95)

2012年(199)

2011年(72)

2010年(109)

2009年(166)

2008年(296)

分类:

2008-09-03 10:08:36

 

好久不发贴了,发篇原创吧,其实是在卡饭先发的

去卡饭转了一圈,OD跟了一样本,却发生一件很不幸的事情,很无奈!分区表被改。。。分析如下:

打开磁盘并锁定,IOCTL_DISK_GET_DRIVE_GEOMETRY得到柱面数、磁盘介质类型、磁头数、每磁道扇区数、每扇区字节数,取每扇区字节数作为堆大小申请堆,读磁盘前512字节保存,解锁关句柄;

将第一分区标志修改为非法,将第一分区起始磁头号设置为0磁头,将第一分区类型设置为EBR中扩展DOS分区标记,取1C3h~1FEh每字节与1A进行异或处理。

00401142                  |. C68424 EE010000 >mov byte ptr ss:[esp+1EE],50
0040114A                  |. C68424 EF010000 >mov byte ptr ss:[esp+1EF],0
00401152                  |. C68424 F2010000 >mov byte ptr ss:[esp+1F2],5
0040115A                  |. B8 C3010000      mov eax,1C3
0040115F                  |> 8A4C04 30        /mov cl,byte ptr ss:[esp+eax+30]
00401163                  |. 80F1 1A          |xor cl,1A
00401166                  |. 884C04 30        |mov byte ptr ss:[esp+eax+30],cl
0040116A                  |. 40               |inc eax
0040116B                  |. 3D FE010000      |cmp eax,1FE
00401170                  |.^ 7E ED            \jle short kd.0040115F

处理完毕后重新打开物理磁盘并锁定,将加密后的数据写入主引导扇区,解锁关句柄。

未中毒时数据:

00143980 00 00 00 00 00 00 00 00 B9 44 9E A8 00 00 80 01 ........笵灗..
00143990 01 00 07 FE FF FF 3F 00 00 00 39 B1 D4 01 00 00 . ? ...9痹 ..
001439A0 C1 FF 0F FE FF FF 78 B1 D4 01 88 F4 7B 07 00 00 ? ? 痹 堲{ ..
001439B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
001439C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U

中毒后数据:

0012FF34 00 00 00 00 00 00 00 00 B9 44 9E A8 00 00 50 00 ........笵灗..P.
0012FF44 01 00 05 E4 E5 E5 25 1A 1A 1A 23 AB CE 1B 1A 1A . 溴? #
0012FF54 DB E5 15 E4 E5 E5 62 AB CE 1B 92 EE 61 1D 1A 1A 坼 溴錬 掝a
0012FF64 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A
0012FF74 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 4F AA O

================================救命分割线=================================

给出三种解决方法,适合不同种类人。。。

1、中毒后没有重启计算机情况适用:

解决方案:重新运行一遍样本,再异或一次,修改三个标志位即可恢复

1BEh:50改80,因为00代表非活动分区,80代表活动分区,其余非法。

1BFh:00改01,因为通常1磁头作为第一分区的物理磁头号

1C2h:05改如下

如果你硬盘的第一分区是NTFS请改为07(带隐藏属性改17);如果为FAT32则改为0B(带隐藏属性改1C);如果为动态分区则为42;如果未知分区格式,见下文,已知则修复完毕。

2、未知分区格式或重启计算机无法启动者适用:

使用WINPE中的WINHEX或者DE等等打开主引导扇区,在WINHEX中直接打开那块磁盘即可,DE则打开LBA 0扇区。





定位到如下数据:




高亮出包含硬盘分区表共64字节,每十六字节代表一个分区表,共占偏移1BEh~1FDh;后两字节为分区表结束标志,必须为AA55。

分区表中各字节解释:

1BEh:激活标志

1BFh:分区起始磁头号(0x00~0x10之间,通常SATA硬盘与较新主板已经不支持)

1C0h:分区起始扇区号(如bios或硬盘不支持CHS寻址方式可以不填,通常SATA硬盘与较新主板已经不支持)

1C1h:分区起始柱面号(如bios或硬盘不支持CHS寻址方式可以不填,通常SATA硬盘与较新主板已经不支持)

1C2h:改分区文件系统标识符

1C3h:分区结束磁头号(如bios或硬盘不支持CHS寻址方式请添FE,通常SATA硬盘与较新主板已经不支持)

1C4h:分区结束扇区号(如bios或硬盘不支持CHS寻址方式请添FF,通常SATA硬盘与较新主板已经不支持)

1C5h:分区结束柱面号(如bios或硬盘不支持CHS寻址方式请添FF,通常SATA硬盘与较新主板已经不支持)

1C6h~1C9h(DWORD):分区前空余扇区数

1CAh~1CDh(DWORD):本分区扇区数

INT13&ATA换算、LBA&CHS、磁头&磁道&柱面&扇区等概念请自行查阅相关资料,如果主板bios或者硬盘已经不支持CHS分区表只需要LBA下分区前扇区数及分区总扇区数就可以实现引导。

手写分区表过程如下:

因为第一分区通常存在于硬盘LBA63扇,所以第一个分区表起始磁头号为01,起始扇区号为01,起始柱面号为00;因为MBR会占用C/H/S:00/00/01,所以在这个分区前多出一个磁道,也就是63个扇区,那么分区前空余扇区数就要添63的十六进制数3F


下面转到第一分区起始地址

观察03h~06h是否为NTFS,如果是修改分区表文件系统标识符为07,如果不是则看52h是否为FAT32,如果是修改分区表文件系统标识符为0B。



如果为NTFS,取上图BPB中28~2F值+1作为该分区扇区数,因为这个是面向改分区可以使用的分区总扇区数,并未包含DBR的一个扇区在内。我这里的扇区数是1D4B139,这个数字+62就是分区的LBA结束地址,如果+63,理论上为62+1,就是第一个EBR的位置,下图可以看到第一个EBR自己地址以及描述的第一个扩展分区和第二个EBR地址;如果是FAT32,则取20h~23h作为该分区扇区数


因为SATA与扩展Int13的对应关系一直没有人公开,且bios也不再支持CHS,扩展分区的CHS值无从添起,但不影响正常使用,一般情况下磁头值为0,柱面为FF,扇区为不定值;如果为IDE硬盘,起始结束的CHS则可以使用如下方式算出,将左侧的柱面号转换为二进制数(共十位),取第八位值转为18进制为C值,将扇区号转为二进制(共六位),将柱面剩余的高二位加到扇区的高二位上面,转化为十六进制添为S值,H值是多少转多少就可以。

因为扩展分区与第一个分区所在磁头号不同,所以第一分区扇区数+一个磁道的扇区数就是扩展分区前扇区数,这个值也是第一个EBR所在LBA扇区号(这里一定要搞清楚扇区数与LBA扇区号的区别,因为LBA下最小扇区号为0,而扇区数却是以1开始,CHS的扇区号也是以1开始);因为所填的是MBR中的扩展分区标志,所以要填0F;高亮出需要最后算出大小。



扩展分区的起始地址有了,第一个逻辑分区前扇区数有了,相加就等于第一个逻辑分区前地址,记下该逻辑分区扇区数后再相加,就是第二个EBR地址,(这里一定要搞清楚扇区数与LBA扇区号的区别,因为LBA下最小扇区号为0,而扇区数却是以1开始,CHS的扇区号也是以1开始)

其他不关心,我们只关心分区扇区数与分区前扇区数,同上记下该分区扇区数,跳当前扇区号+63+该分区扇区数



看到了,只剩一个分区了,在次记下扇区数,这时记下的三个扇区数的值分别为:30d3c74,2711637,1fda120,一共三个三个逻辑分区,也就意味着EBR链表中有三个链,每个链占用63个扇区,也就是Winhex中可以看到的分区间距32.5K这个数据,相加就等于扩展分区总扇区数:30d3c74+2711637+1fda120+63×3=77BF488,回头在DPT中写上,剩余两个分区表填零,纠正分区表结束标志AA55,手写分区表完毕。


3、最简单的方法,适合任何人使用,使用diskgen、PR、NDD、PDT等工具均可以自动修复,之所以写到最后只是想免去一些人偷懒心理。
阅读(1599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~