主引导记录(MBR)的反汇编分析
- 格式:doc
- 大小:521.50 KB
- 文档页数:9
硬盘主引导记录详解硬盘的数据结构对于一些朋友来说总是很神密!为什么我们删除了的文件用软件能找到?为什么我们格式化了的硬盘数据还能找回来?要回答这一切,你就得对硬盘的数据结构有个清醒的认识。
硬盘上的数据由五大部分组成,它们分别是:MBR区、DBR区,FAT区,DIR区和DATA区。
1.MBR(Main Boot Record)区,即主引导记录区,位于整个硬盘的0磁道0柱面1扇区.2.DBR(Dos Boot Record)区,操作系统引导记录区。
位于硬盘的0磁道1柱面1扇区,是操作系统可以直接访问的第一个扇区.3.FAT(File Allocation Table文件分配表)区;4.DIR(Directory)根目录区,记录着根目录下每个文件(目录)的起始单元,文件的属性等;5.DATA区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。
了解了硬盘数据的基本结构,今天我们把重点放在mbr所在的扇区:主引导扇区。
主引导扇区包括:mbr,dpt和结束标志。
位于硬盘的0磁道0柱面1扇区,用diskman可以读出其中的内容,下面是一次操作的结果:表一:这块10.2G(以下显示为9766MB,误差原因不用我解释了吧?)的硬盘共分了四个区:分区结构如下:主引导扇区中前446字节--偏移地址从0000H-01BDH为mbr区,存放着主引导程序,从上面的显示中,读者可能已经看出,这个硬盘以linux系统的grub为引导程序。
接下来的64字节为硬盘分区表--dpt,偏移地址从01BEH-01FDH,共分为四个分区表项,每个分区表项占16字节,表示一个分区,从这里大家就可以知道为什么硬盘只能分四个主分区了吧?但有时我们需要更多的分区来规划我们的硬盘,为解决这个问题,就把这四个分区表项中的一个定义为扩展分区(与主分区是并列关系),扩展分区中又可以定义逻辑分区(与扩展分区是包含与被包含的关系)。
Mbldr引导程序的反汇编代码Mbldr引导程序的反汇编代码抽了一点时间,注释了一下Mbldr引导程序,有的地方不理解,可能是反汇编工具的不足,总之,抛砖引玉吧,希望高人指点。
寄存器初始化0:7C00 FA CLI ;禁止中断0:7C01 31C9 XOR CX,CX ;使CX=00:7C03 8ED1 MOV SS,CX ;SS=00:7C05 BC007C MOV SP,7C00h ;SP=7C000:7C08 89E6 MOV SI,SP ;SI=7C000:7C0A 51 PUSH CX ;CX入栈0:7C0B 07 POP ES ;ES=00:7C0C 51 PUSH CX ;CX入栈0:7C0D 1F POP DS ;DS=0程序转移0:7C0E FC CLD ;置数据传输正方向0:7C0F BF0006 MOV DI,0600h ;目的指针DI=6000:7C12 FEC5 INC CH ;使CX=1000:7C14 F3 REPZ ;CX不为0则重复执行0:7C15 A5 MOVSW ;按字从7C00传送至6000:7C16 E9008A JMP 8B19 ;此处实现从7C16到619的转移机制不明?E9 00 8A——其中E9 00=jmp 7C18,怀疑后面的8A是个操作码或转义码,如何实现7C18到619的转换?显示启动菜单0:0619 BE0A07 MOV SI,070Ah ;指向70A处的启动菜单字符串0:061C AC LODSB ;装入一个字节到AL0:061D 84C0 TEST AL,AL ;测试AL中是否字符串结束字节000:061F 7406 JZ Short 0627 ;显示结束转6270:0623 CD10 INT 10h ;调用显示中断服务程序0:0625 EBF5 JMP Short 061C ;转到61C截获INT 1Ch中断0:0627 66BBF6060000 MOV EBX,000006F6h ;EBX指向替代的临时INT 1Ch中断服务程序0:062D 66871E7000 XCHG EBX,[0070] ;替换INT 1Ch中断服务程序入口地址向量0:0632 FB STI ;允许中断延时及获取键盘输入0:0633 B639 MOV DH,39h ;DH=39设置键盘等待倒计时初始值0:0635 B401 MOV AH,01h ;设置获得键盘缓冲区键值功能(不清除缓冲区) 0:0637 CD16 INT 16h ;调用键盘中断服务程序0:0639 7419 JZ Short 0654 ;未获取到按键值转到6540:063B B400 MOV AH,00h ;设置读取键盘输入功能(清除缓冲区) 0:063D CD16 INT 16h ;调用键盘中断服务程序0:063F 3C0D CMP AL,0Dh ;判断是否是回车键0:0641 7427 JZ Short 066A ;是回车键转到66A0:0643 3C1B CMP AL,1Bh ;判断是否是Esc键0:0645 7505 JNZ Short 064C ;不是则转到64C0:0647 C606F60690 MOV Byte Ptr [06F6],90h ;将6F6处改为NOP空指令0:064C 88E0 MOV AL,AH ;AL=AH将扫描码送入AL0:064E 2C3B SUB AL,3Bh ;AL=AL-3B将AL中的扫描码转换为0—5的数值0:0650 3C06 CMP AL,06h ;将AL与06比较0:0652 7218 JB Short 066C ;AL小于06转到66C0:0654 B80100 MOV AX,0001h ;AX=00010:0657 39C1 CMP CX,AX ;将CX与AX=1比较0:0659 72DA JB Short 0635 ;CX小于1转到6350:065B 29C1 SUB CX,AX ;CX=CX-AX0:065F 88F0 MOV AL,DH ;AL=DH0:0661 CD10 INT 10h ;调用显示中断服务程序0:0663 FECE DEC DH ;DH=DH-10:0665 80FE30 CMP DH,30h ;将DH与30比较0:0668 73CB JNB Short 0635 ;不小于30转到6350:066A B000 MOV AL,00h ;AL=0清除AL中的按键值0:066C 90 NOP ;空指令0:066D 90 NOP ;空指令0:066E 90 NOP ;空指令恢复INT 1Ch中断0:066F FA CLI ;关中断0:0670 66891E7000 MOV [0070],EBX ;恢复INT 1Ch中断服务程序入口地址向量0:0675 FB STI ;开中断0:0676 98 CBW ;将AL(字节)转换为AX(字)0:0677 C1E002 SHL AX,02h ;将AX左移两位高位移进CF,低位置00:067A 01C6 ADD SI,AX ;SI=79D+AX,SI指向保存的启动扇区号0:067C 668B2C MOV EBP,[SI] ;将用户选中的启动扇区号送入EBP0:067F 6645 INC EBP ;EBP=EBP+1通过此动作获取标志0:0681 7502 JNZ Short 0685 ;根据标志判断EBP是否为FFFF,不是则转到685 0:0683 CD18 INT 18h ;调用INT 18作启动失败处理0:0685 664D DEC EBP ;EBP=EBP-1还原EBP值0:0687 BEBE7D MOV SI,7DBEh ;SI=7DBE指向分区表头0:068A B90400 MOV CX,0004h ;CX=4设置分区表项搜索计数值对分区表项做去除隐藏处理并激活启动分区0:068D B000 MOV AL,00h ;AL=00:068F 663B6C08 CMP EBP,[SI+08h] ;将EBP与分区表项保留扇区数比较0:0693 7502 JNZ Short 0697 ;不相等转到6970:0695 B080 MOV AL,80h ;AL=800:0697 8804 MOV [SI],AL ;动态处理[SI]指向的分区表项活动标志0:0699 8A4404 MOV AL,[SI+04h] ;取当前分区表属性标志到AL 0:069C 0C10 OR AL,10h ;把AL中属性标志值转成隐藏形式0:069E 3C11 CMP AL,11h ;判断是否是DOS 12-bit FAT分区0:06A0 7418 JZ Short 06BA ;是则转到6BA0:06A2 3C14 CMP AL,14h ;判断是否是DOS 3.0+ 16-bit FAT <32M分区0:06A4 7414 JZ Short 06BA ;是则转到6BA0:06A6 3C16 CMP AL,16h ;判断是否是DOS 3.31+ 16-bit FAT >32M分区0:06A8 7410 JZ Short 06BA ;是则转到6BA 0:06AA 3C17 CMP AL,17h ;判断是否是Windows NT NTFS分区0:06AC 740C JZ Short 06BA ;是则转到6BA0:06AE 3C1B CMP AL,1Bh ;判断是否是WIN95_OSR2/Win98 FAT32分区0:06B0 7408 JZ Short 06BA ;是则转到6BA0:06B2 3C1C CMP AL,1Ch ;判断是否是WIN95_OSR2/Win98 FAT32 LBA分区0:06B4 7404 JZ Short 06BA ;是则转到6BA 0:06B6 3C1E CMP AL,1Eh ;判断是否是WIN95/98/DOS 16-bit FAT LBA分区0:06B8 750B JNZ Short 06C5 ;不是则转到6C5 0:06BA 663B6C08 CMP EBP,[SI+08h] ;将EBP与分区表项保留扇区数比较0:06BE 7502 JNZ Short 06C2 ;不相等则转到6C20:06C0 24EF AND AL,0EFh ;AL和EF相与,去除隐藏属性0:06C2 884404 MOV [SI+04h],AL ;将真实属性写回分区表项0:06C5 81C61000 ADD SI,0010h ;调整分区表项指针指向下一项0:06C9 E2C2 LOOP 068D ;循环至68D将去除隐藏属性的MBR回写0:06CB BEFA06 MOV SI,06FAh ;SI=6FA指向INT13扩展功能调用包0:06CE B80043 MOV AX,4300h ;设置INT13扩展写功能0:06D1 CD13 INT 13h ;调用INT13执行写盘功能0:06D3 6685ED TEST EBP,EBP ;EBP相与0:06D6 7502 JNZ Short 06DA ;EBP非0转到6DA0:06D8 FEC2 INC DL ;DL=DL+10:06DA 66896C08 MOV [SI+08h],EBP ;将EBP写入分区表项保留扇区数位置0:06DE B442 MOV AH,42h ;设置INT13扩展读功能0:06E0 CD13 INT 13h ;调用INT13执行读盘功能0:06E2 7307 JNB Short 06EB ;调用成功转到6EB0:06E4 B280 MOV DL,80h ;DL=800:06E6 6631ED XOR EBP,EBP ;EBP=00:06E9 EBEF JMP Short 06DA ;转到6DA0:06EB 813EFE7D55AA CMP Word Ptr [7DFE],0AA55h ;判断装入扇区的有效性0:06F1 75F1 JNZ Short 06E4 ;非法扇区转到6E40:06F3 E90A75 JMP 7700 ;此处实现到7C00的转移机制不明?E9 0A 75——其中E9 0A=jmp 6FF指向7C00,怀疑后面的75是个操作码或转义码,如何实现到7C00的转移?临时的INT 1Ch中断服务程序0:06F6 41 INC CX ;CX=CX+10:06F7 CF IRET ;中断返回此处似乎未使用?0:06F8 53 PUSH BX ;BX入栈0:06F9 CB RETF ;返回调用程序INT13扩展功能调用包,共16字节0:06FA 1000 ADC [BX+SI],AL ;INT13扩展功能调用包包头0:06FC 0100 ADD [BX+SI],AX ;0:06FE 007C00 ADD [SI+00h],BH ;0:0701 0000 ADD [BX+SI],AL ;0:0703 0000 ADD [BX+SI],AL ;0:0705 0000 ADD [BX+SI],AL ;0:0707 0000 ADD [BX+SI],AL ;0:0709 000A ADD [BP+SI],CL ;Mbldr引导程序的内存映像0:0600 FA 31 C9 8E D1 BC 00 7C-89 E6 51 07 51 1F FC BF z1I.Q<.|.fQ.Q.|?0:0610 00 06 FE C5 F3 A5 E9 00-8A BE 0A 07 AC 84 C0 74 ..~Es%i..>..,.@t0:0620 06 B4 0E CD 10 EB F5 66-BB F6 06 00 00 66 87 1E .4.M.kuf;v...f..0:0630 70 00 FB B6 39 B4 01 CD-16 74 19 B4 00 CD 16 3C p.{694.M.t.4.M.<0:0640 0D 74 27 3C 1B 75 05 C6-06 F6 06 90 88 E0 2C 3B .t'<.u.F.v...`,;0:0650 3C 06 72 18 B8 01 00 39-C1 72 DA 29 C1 B4 0E 88 <.r.8..9ArZ)A4..0:0660 F0 CD 10 FE CE 80 FE 30-73 CB B0 00 90 90 90 FA pM.~N.~0sK0....z0:0670 66 89 1E 70 00 FB 98 C1-E0 02 01 C6 66 8B 2C 66 f..p.{.A`..Ff.,f0:0680 45 75 02 CD 18 66 4D BE-BE 7D B9 04 00 B0 00 66 Eu.M.fM>>}9..0.f0:0690 3B 6C 08 75 02 B0 80 88-04 8A 44 04 0C 10 3C 11 ;l.u.0....D...<.0:06A0 74 18 3C 14 74 14 3C 16-74 10 3C 17 74 0C 3C 1B t.<.t.<.t.<.t.<.0:06B0 74 08 3C 1C 74 04 3C 1E-75 0B 66 3B 6C 08 75 02 t.<.t.<.u.f;l.u.0:06C0 24 EF 88 44 04 81 C6 10-00 E2 C2 BE FA 06 B8 00 $o.D..F..bB>z.8.0:06D0 43 CD 13 66 85 ED 75 02-FE C2 66 89 6C 08 B4 42 CM.f.mu.~Bf.l.4B0:06E0 CD 13 73 07 B2 80 66 31-ED EB EF 81 3E FE 7D 55 M.s.2.f1mko.>~}U0:06F0 AA 75 F1 E9 0A 75 41 CF-53 CB 10 00 01 00 00 7C*uqi.uAOSK.....|0:0700 00 00 00 00 00 00 00 00-00 000A 46 31 2A 43 5F ...........F1*C_0:0710 50 41 4E 58 50 0D 0A 46-32 20 49 42 4D 5F 50 41 PANXP..F2 IBM_PA0:0720 4E 0D 0A 46 33 20 44 5F-50 41 4E 20 20 0D 0A 46 N..F3 D_PAN ..F0:0730 34 20 45 5F 50 41 4E 20-20 0D 0A 46 35 20 46 5F 4 E_PAN ..F5 F_0:0740 50 41 4E 20 20 0D 0A 46-36 20 44 45 4C 4C 5F 50 PAN ..F6 DELL_P0:0750 41 4E 0D 0A 0A 45 53 43-20 73 74 6F 70 73 20 32 AN...ESC stops 20:0760 73 20 74 69 6D 65 72 0D-0A 45 4E 54 45 52 20 62 s timer..ENTER b0:0770 6F 6F 74 73 20 64 65 66-61 75 6C 74 0D 0A 46 2D oots default..F-0:0780 6B 65 79 73 20 62 6F 6F-74 20 4F 53 0D 0A 5B 20 keys boot OS..[0:0790 20 20 20 20 20 20 20 20-20 5D 0D 5B 003F 00 00 ].[.?..0:07A0 00 5F 62 3C 02 E9 57 FB-02 31 D3 32 08 79 4E 6A ._b<.iW{.1S2.yNj0:07B0 0D 00 4C A1 12 00 00 00-D9 73 D9 73 00 00 00 01..L!....YsYs....0:07C001 00 1C FE FF FF 3F 00-00 00 20 62 3C 02 00 00...~..?... b<...0:07D0C1 FF 12 FE FF FF 5F 62-3C 02 4B F5 BE 00 00 00 A..~.._b<.Ku>...0:07E0C1 FF 0F FE FF FF AA 57-FB 02 56 F4 A5 0F 00 00 A..~..*W{.Vt%...0:07F000 00 00 00 00 00 00 00-00 00 00 00 00 0055 AA ..............U*注:棕色为INT13扩展功能调用包;蓝色为显示信息;红色为启动分区的绝对扇区号;绿色为磁盘签名;桃红色为分区表。
基于MBR逆向分析工程实验报告电子科技大学信息与软件工程学院逆向工程实验报告姓名:___学号:20__52090710指导教师:何兴高一、题目基于 MBR 的 Bootkit 的逆向分析二、题目梗概利用逆向工程技术,从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。
随着用户需求的复杂度越来越高,软件开发难度不断上升,快速高效地软件开发已成为项目成败的关键之一。
Bootkit 是一种比较旧的技术,这个概念最早是在 20__5 年由 eEye Digital安全公司在他们的ldquo;BootRoot;项目中提及的。
Rootkit 是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是 Rootkit 一般都和木马、后门等其他恶意程序结合使用。
Rootkit 通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。
rootkit 并不一定是用作获得系统 root 访问权限的工具。
实际上,rootkit 是攻击者用来隐藏自己的踪迹和保留root 访问权限的工具。
通常,攻击者通过远程攻击获得 root访问权限,或者首先密码猜测或者密码强制破译的方式获得系统的访问权限。
进入系统后,如果他还没有获得 root 权限,再通过某些安全漏洞获得系统的 root权限。
接着,攻击者会在侵入的主机中安装 rootkit,然后他将经常通过 rootkit的后门检查系统是否有其他的用户登录,如果只有自己,攻击者就开始着手清理日志中的有关信息。
通过 rootkit 的嗅探器获得其它系统的用户和密码之后,攻击者就会利用这些信息侵入其它的系统。
所有在开机时比 Windows 内核更早加载,实现内核劫持的技术,都可以称之为 Bootkit。
硬盘主引导记录(MBR)及其结构详解hbrqlpf 于 2008-10-01 21:14:00 发布14569 收藏 5 文章标签:扩展磁盘代码分析任务活动basic硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE来读取。
用INT13H的读磁盘扇区功能的调用参数如下:入口参数:AH=2 (指定功能号)AL=要读取的扇区数DL=磁盘号(0、1-软盘;80、81-硬盘)DH=磁头号CL高2位+CH=柱面号CL低6位=扇区号CS:BX=存放读取数据的内存缓冲地址出口参数:CS:BX=读取数据存放地址错误信息:如果出错CF=1 AH=错误代码用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下:A>DEBUG-A 100XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)XXXX:XXXX INT 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR内容)2.MBR的组成一个扇区的硬盘主引导记录MBR由4个部分组成。
主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
硬盘主引导记录(MBR)及其结构详解硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用语硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE 来读取。
用INT13H的读磁盘扇区功能的调用参数如下:入口参数:AH=2 (指定功能号)AL=要读取的扇区数DL=磁盘号(0、1-软盘;80、81-硬盘)DH=磁头号CL高2位+CH=柱面号CL低6位=扇区号CS:BX=存放读取数据的内存缓冲地址出口参数:CS:BX=读取数据存放地址错误信息:如果出错CF=1 AH=错误代码用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下:A>DEBUG-A 100XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)XXXX:XXXX INT 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR内容)2.MBR的组成一个扇区的硬盘主引导记录MBR由如图6-15所示的4个部分组成。
·主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
MBR代码分析【转载,学习使⽤】MBR代码分析西西,很早以前的东东了,都不太记得了,有什么错误和不⾜欢迎⼤家指出机器加电或按reset键后都要进⾏系统复位,复位后CS=FFFFH,IP=0000H那么⾃然就从FFFF:0000H处开始执⾏指令,这个地⽅只有⼀条JMP指令跳转到系统⾃检程序处,系统⾃检完成后把软盘的第⼀个扇区(如果由软盘启动)或者硬盘的第⼀个扇区,即MBR扇区(如果由硬盘启动)读⼊到0:7C00H处然后把控制权交出,从0:7C00H处继续执⾏,下⾯就是硬盘的MBR代码分析其中的引导扇区是指硬盘相应分区的第⼀个扇区,是和操作系统有关的操作系统的引导是由它来完成的,⽽MBR并不负责,MBR和操作系统⽆关他的任务是把控制权转交给操作系统的引导程序程序流程:1 将程序代码由0:7C00H移动到0:0600H(注,BIOS把MBR放在0:7C00H处)2 搜索可引导分区,即80H标志成功:goto 3失败:跳⼊ROM BASIC⽆效分区表:goto 53 读引导扇区失败:goto 5成功:goto 44 验证引导扇区最后是否为55AAH失败:goto 5成功:goto 65 打印错误进⼊⽆穷循环6 跳到0:7C00H进⾏下⼀步启动⼯作下⾯将⽤汇编语⾔写出这⼀段代码,并进⾏说明。
;MBR.ASM; MASM MBR; LINK MBR; EXE2BIN MBR.MODEL tiny.CODE;设置寄存器及堆栈值org 0Head:Start:clixor ax,axmov ss,axmov sp,7C00H ;ss:sp=0:7C00Hmov si,sppush axpop espush axpop ds ;es=ds=0sti;将程序代码由0:7C00H移动到0:0600H处cldmov di,600Hmov cx,100H ;100H Words=512 Bytes,即⼀个扇区⼤⼩repne movswdb 0EAH ;这个是FAR JUMP的机器码dw offset Continue+600H, 0000H ;这个是跳转⽬的地址,即0:061DH ;搜索可引导分区Continue:mov si,600H+1BEH ;si指向分区表mov bl,4 ;四个分区FindBoot:cmp byte ptr[si],80Hje SaveRec ;读扇区位置cmp byte ptr[si],0jne Invaild ;⽆效分区add si,10Hdec bljnz FindBootint 18H ;进⼊ROM BASIC;读取引导分区的扇区,柱⾯号SaveRec:mov dx,[si]mov cx,[si+2]mov bp,si;检查其余分区表FindNext:add si,10Hdec bljz SetReadcmp byte ptr[si],0 ;是否存在⾮法分区je FindNextInvaild:mov si,offset ErrMsg1+600H;字符串输出⼦程序PrintStr:lodsbcmp al,0je DeadLockpush simov bx,7mov ah,0EH ;输出字符int 10Hpop sijmp short PrintStr ;下⼀字符jmp short DeadLock ;⽆穷循环,也可以写成jmp $;读引导扇区SetRead:mov di,5 ;读取次数ReadBoot:mov bx,7C00Hmov ax,201Hpush diint 13H ;cx,dx已经在SaveRec处得到pop dijnc GoBoot ;成功则启动xor ax,axint 13H ;reset驱动器,然后再读取dec dijnz ReadBootmov si,offset ErrMsg2+600Hjmp short PrintStr 失败输出信息,并进⼊⽆穷循环;检查读⼊的引导扇区GoBoot:mov si,offsetErrMsg3+600Hmov di,7C00H+1FEHcmp word ptr[di],0AA55Hjne PrintStr ;⾮AA55标志则输出错误信息mov si,bp ;si指向可启动分区db 0EAH,0,7CH,0,0 ;跳转⾄0:7C00HErrMsg1 db Invaild partition table,0ErrMsg2 db Error loading operating system,0ErrMsg3 db Missing operating system,0Tail:FillNum equ 1BEH-(Tail-Head) ;计算填0数⽬db FillNum dup(0);四个分区表项数据,跟分区情况有关,详细含义另解PartTable db 80H,1,1,0,4,4,0D1H,2,11H,0,0,0,0FEH,0FFH,0,0db 0,0,0C1H,3,5,4,0D1H,0FEH,0FFH,0FFH,0,0,0ACH,53H,0,0db 20H dup(0)ID dw 0AA55Hend start;如果开始试⽤org 600H,那么访问数据时就不必加上600H,如mov si,offset ErrMsg2+600H;可写为mov si,offset ErrMsg2,这时就不能⽤exe2bin得到数据,必须试⽤debug ;debug mbr.exe;-nmbr.bin;-rcx 200;-q在硬盘的第⼀个扇区上保存着分区信息,称为主分区表,共有四项读取分区表必须使⽤bios的int 13h,⼀般使⽤debug就可以了debug-axxxx:0100 mov ax,201mov bx,200mov cx,1mov dx,80 ;如果是第⼆个硬盘则是81...int 13int 20xxxx:-g这时xxxx:0200开始的512字节就是分区表所在的扇区,前⾯⼀部分为MBR,在debug中⽤-d3be l40就可以看到64字节的分区表信息,16个字节为⼀项⽤-e命令就可以修改,改完后可以重新写回去,只要把前⾯代码中的mov ax,201改为mov ax,301即可,或者直接把102处的2改成3,⽐如:-e 102xxxx:0102 02.3-g=100这样就写回去了,不过要⼩⼼哦,呵呵,弄不好就坏了,⼤家还是把分区表⼿抄⼀份存下来吧,会省去很多⿇烦的下来说⼀下分区表项的具体意义,取其中⼀项举个例⼦:80 01 01 00 0B 3F FF 00 3F 00-00 00 81 4F 2F 001 (80)引导标志,80代表可引导,00代表不可引导,⼀般必须且只能有⼀个分区表项的引导标志为80,除⾮你⾃⼰修改MBR2 (01)分区开始磁头3,4 (01 00)=(1,0)分区开始柱⾯和扇区(后⾯后详解)5 (0B)分区类型(后⾯有详解)6 (3F)=(63)分区结束磁头7,8 (FF 00)=(768,63分区结束柱⾯和扇区(同上)9-12 (3F 00 00 00)=(63)此分区前扇区总数,即相对扇区数13-16 (81 4F 2F 00)=(002F4F81H=3100545)此分区扇区总数由于柱⾯和扇区共⽤两个字节表⽰,⽽柱⾯号为10位,最⼤1023,扇区号为6位,最⼤63扇区号______|____| |( 7 6 5 4 3 2 1 0 ) ( 7 6 5 4 3 2 1 0 )|___| |_____________||________________________||_柱⾯号关于分区类型,常见的有:00 未⽤,Unused01 DOS-12(FAT 12)02 XENIX04 DOS-16(FAT 16)(分区<32M时⽤的,还有么?)05 EXTEND(DOS扩展分区)06 BIGDOS(>32M)(这个才是现在常说的FAT 16)07 HPFS(OS/2)(好像NTFS也是这个标记)0B FAT 320F 这个⼀时不确定,西西50 DM63 386/ix(unix)64 NET286(Novell)65 NET386(Novell)FF BBT(UNIX Bad Block Table)下⾯有⼏个平衡式⽤来计算分区参数:1 第⼀分区参数平衡式扇区总数=(结束柱⾯+1)*磁头数*每柱⾯扇区数-相对扇区数例如:3100545=(768+1)*64*63-632 其它分区参数平衡式扇区总数=(结束柱⾯-起始柱⾯+1)*磁头数*每柱⾯扇区数00 00 C1 01 05 3F FF FD C0 4F-2F 00 C0 90 0F 00000F90C0H=1020096,(FF FD)=(1021,63),(C1 01)=(769,1)例如:1020096=(1021-769+1)*64*633 第⼀分区相对扇区=每柱⾯扇区数其它分区相对扇区=上⼀分区相对扇区+上⼀分区扇区总数扩展分区信息是⼀个链状结构,很多⼈不知道在删分区时把前⾯的分区删掉导致后⾯的分区找不到,原因就在于此,我们从主分区表中取出扩展分区项进⾏⼀下分析,如下:00 00 01 C0 05 FE BF 6E C0 10-2F 00 EF A6 69 00由此我们可以得到数据:开始磁头:00开始柱⾯扇区:01 C0=(192,0)⽤debugdebug-a100xxxx:0100 mov ax,201mov bx,200mov cx,05c0 ;开始柱⾯扇区号mov dx,80 ;dh中为开始磁头号,这⾥为0int 13int 20xxxx:-g=100-d3be l10读出的扇区中有两个16字节的分区表项和最后的⼀个55AA标志,这两个分区表项为:00 01 01 C0 06 FE 7F 97 3F 00-00 00 99 F2 34 0000 00 41 98 05 FE BF 6E D8 F2-34 00 17 B4 34 00第⼀个分区类型为6,其实这是第⼀个逻辑分区,含义和主分区表项相同第⼆个分区类型为5,这其实是指向下⼀个扩展分区表的从这⾥我们可以得到:开始磁头:0开始柱⾯扇区:41 98=(408,1)继续⽤debug读出(mov cx,9841)得到00 01 41 98 06 FE BF 6E 3F 00-00 00 D8 B3 34 00只有⼀个表项,是第⼆个逻辑盘,⽽且是逻辑盘链的最后⼀个可以看到,主分区表是⾮常重要的,所以除了⼩⼼操作外,还应当进⾏备份最安全的备份⽅式就是⽤笔抄下来,呵呵,放到安全的地⽅,当然,每次重新进⾏分区后还应当及时更新的说,:P从前⾯可以看出,分区表⾥最重要的还是柱⾯号,其它⽐如磁头号都是0或者1或者最⼤值,扇区号都是1或63(最⼤值),扇区总数什么的也都能算出来,所以分区时最好把各分区的柱⾯号记下来,这样⼀旦分区信息被破坏就可以进⾏恢复了。
MBR引导代码分析整理:太虚野老用WinHex读MBR,如下:图中3个用红色矩形框框住的是3个字符串(Invalid partition table、Error loading operating system、Missing operating system)的地址相关的,分别是0x12C、0x144、0x 163。
用蓝色矩形框框住的,MBR里面的1B8偏移位置为磁盘签名,该签名由ntldr写入,W indows就是靠这个磁盘签名来确定是从哪块硬盘启动的,如果两个磁盘签名相同了,那么n tldr就会随机更改一块磁盘,但是下次就不会出现这种情况了。
实际MBR的可执行代码到0 x12B处结束。
MBR引导代码的作用就是加载活动分区的引导代码。
用IDA Pro反汇编MBR 后如下(包括分析):;//MBR在系统启动时由BIOS INT 19H自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:06cc处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00 开始的空间将读入活动分区的操作系统的引导扇区.seg000:0000 33 C0 xor ax, ax ;//ax寄存器清0seg000:0002 8E D0 mov ss, ax ;//栈寄存器ss=0seg000:0004 BC 00 7C mov sp, 7C00h ;//栈指针—SS:SP=0000:7C00seg000:0007 FB sti ;//允许中断seg000:0008 50 push ax ;这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系. seg000:0009 07 pop es ;//附加数据段寄存器es=0seg000:000A 50 push ax;seg000:000B 1F pop ds ;//数据段寄存器ds=0seg000:000C FC cld ;//使方向标志寄存器DF=0,规定其后的串操作为正向串操作;把7C1Bh处的长1E5h的代码拷贝到61Bh处seg000:000D BE 1B 7C mov si, 7C1Bh ;//用于movsbseg000:0010 BF 1B 06 mov di, 61Bh ;//用于movsb ,将[DS:SI]中字节传送到[ES:DI]中seg000:0013 50 push ax ;//保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转seg000:0014 57 push diseg000:0015 B9 E5 01 mov cx, 1E5h ;//用于rep movsb中的rep,每次cx 减1,到0不执行movsb ,200H-1BH=1E5seg000:0018 F3 A4 rep movsbseg000:001A CB retf ;//相当于pop ip; pop cs,即执行retf指令后跳转到061BH处执行seg000:001B; ---------------------------------------------------------------------------seg000:001B BD BE 07 mov bp, 7BEh ;// 600h+1BEh=7BEh,分区表起始偏移为1BEh,07BEH开始的16个字节是第一个分区表项seg000:001E B1 04 mov cl, 4 ;//硬盘的mbr分区表最多有4个表项,用于loopseg000:0020seg000:0020 loc_10020: ; CODE XREF: seg000:002A↓j seg000:0020 38 6E 00 cmp [bp+0], ch ;//检查分区指示符.cx寄存器前面用movsb减为0,所以ch=0.判断第一个分区表项的第一个字节是否为活动分区,因为cmp是有符号数据比较,如果[bp+0]=80,80H为负数,则其比0小seg000:0023 7C 09 jl short loc_1002E ;//如果是80,活动分区,则跳到002E地址.这里有点问题,如果[bp+0x0]是符号位为1的任意数的话,也是小于0,也会跳到002E地址seg000:0025 75 13 jnz short loc_1003A;//分区指示符不为0就跳转(显示分区表无效)seg000:0027 83 C5 10 add bp, 10h ;//指向下一个表项(每一个表项的长度为10h字节)seg000:002A E2 F4 loop loc_10020 ;//cx不为0就循环;四表项的状态字节都为0就执行ROM BASIC中断.只有IBM个人计算机有Basic包括在ROM中;Int 18h中断服务程序就是启动ROM-Basic,如果没有ROM BASIC,中断18H通常会显示消息 NO ROM BASIC 然后"系统暂停",并且系统中断seg000:002C CD 18 int 18h;//找到活动分区后,还要检查剩余分区的启动标志是否为0;不允许存在多个活动分区seg000:002Eseg000:002E loc_1002E: ; CODE XREF: seg000:0023 j seg000:002E 8B F5 mov si, bpseg000:0030seg000:0030 loc_10030: ; CODE XREF: seg000:0038↓j seg000:0030 83 C6 10 add si, 10h ;//下一个分区表表项seg000:0033 49 dec cx ;//分区表表项数量减1seg000:0034 74 19 jz short loc_1004F ;//如果4个表项都检查完毕就跳转seg000:0036 38 2C cmp [si], ch ;//检查分区指示符是否为0 seg000:0038 74 F6 jz short loc_10030 ;//如果分区指示符是0就跳转检查下一分区,否则分区表是无效的seg000:003Aseg000:003A loc_1003A: ; CODE XR EF: seg000:0025 j seg000:003A A0 B5 07 mov al, ds:7B5h ;// 01B5+0600=7B5h,0x1B5偏移地址处一般为2C,0x12C偏移地址处指向字符串“Invalid partition table”seg000:003Dseg000:003D loc_1003D: ; CODE XREF: seg000:0069↓j seg000:003D B4 07 mov ah, 7 ;//例如:AX=72C,原0x12C偏移地址处指向字符串“Invalid partition table”,012C+0600=72C,即AX指向错误信息seg000:003F 8B F0 mov si, ax ;//si就指向字符串seg000:0041seg000:0041 loc_10041: ; CODE XREF: seg000:004D↓j seg000:0041 AC lodsb ;//读取一个字节到alseg000:0042seg000:0042 loc_10042: ; CODE XREF: seg000:0044↓j seg000:0042 3C 00 cmp al, 0 ;//字符串是否显示完成,MBR中三个错误信息字符串都以00结尾seg000:0044 74 FC jz short loc_10042 ;// 如果字符串显示完成,则进入死循环。
硬盘主引导扇区(MBR、DPT、DBR、BPB)详解.txt“恋”是个很强悍的字。
它的上半部取自“变态”的“变”,下半部取自“变态”的“态”。
硬盘主引导扇区(MBR、DPT、DBR、BPB)详解引用:网上收集的资料,放到这里来学习,这方面登山人大哥是高手,有空指点一下喽硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。
MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(图一)。
MBR由三部分构成:1.主引导程序代码,占446字节2.硬盘分区表DPT,占64字节3.主引导扇区结束标志AA55H一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。
启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
主引导代码实现下列功能:1.扫描分区表查找活动分区;2.寻找活动分区的起始扇区;3.将活动分区的引导扇区读到内存;4.执行引导扇区的运行代码。
如果主引导代码未完成这些功能,系统显示下列错误信息:Invalid partition tableError loading operating systemMissing operating system二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(图二);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。
windows 7 的 MBR 分析前话: 引导磁盘的 MBR 由 int 0x19 加载到 0x7c00,int 0x19 最后的工作是 跳到 0x7c00 执行。
一、 我的 bochs 上的 windows 7 的 disk images 介绍在 bochs 上, 我为 windows 7 分配了 10g 的磁盘空间, 这 10g 的分空间, bochs 是这样分配的:cylinders = 20805, heads = 16, spt = 63 cylinders(柱面或道)是 20805,heads(磁头或面)是 16,spt(扇区/柱 面 - 每道扇区数)为 63 那么:磁盘空间为:disk size = cylinders * 63 * heads * 512 = 20805 * 63 * 16 * 512 = 10,737,377,280 bytes = 10g二、硬盘的 MBR(主引导记录)MBR 是位于: 扇区 0 (逻辑扇区) 即: 柱面 0 (0-cylinder) 0 磁头 , (0-head) , 1 扇区(1-sector) 大小为 512 bytes。
整个 MBR 的结构如下:位置(hex) 大小(bytes) 描述000 - 162 162 - 1BD 1BE - 1CD 1CE - 1DD 1DE - 1ED 1EE - 1FD 1FE - 1FF354 bytes 92 bytes 16 bytes 16 bytes 16 bytes 16 bytes 2 bytes硬盘 MBR 引导记录(代码区) MBR 数据区域 分区表 1 分区表 2 分区表 3 分区表 4 MBR 标志(55AA)1、磁盘分区表(Disk Partition Table) 在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分 区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。
windowsxpMBR结构分析1、系统通电启动-->BIOS启动代码进⾏加电⾃检,包括显卡,内存,主板等-->根据⽤户指定的启动顺序。
从指定设备加载MBR(第⼀个扇区,0磁头0柱⾯1扇区)到内存地址0x7c00处。
2、⽤winhex软件打开磁盘,内容0x00-0x200总共512个字节为MBR。
0x0000-0x01BD, 446字节,引导代码和数据区域0x01BE-0x01FD, 64字节,4个分区表,每个分区表占16个字节0x01FE-0x01FF, 2字节,MBR结构标志,值为0xAA553、分区表结构(16字节):0x1BE,1bytes; =0x00: 不可启动分区,=0x80:可启动分区0x1BF-0x1C1, 3bytes; 0x1BF,分区起始磁头号 0x1C0-0xC01,分区起始扇区和柱⾯号,0x1C0低6位为起始扇区,0x1C0⾼2位加上0xC01组成10位为起始柱⾯号0x1C2, 1bytest; =0x07,分区⽂件系统类型,07为ntfs,0x0B为FAT32,0x83为Linux等0x1C3-0x1C5, 3bytes; 分区结束磁头号,结束扇区,结束柱⾯号,定义同前0x1C6-0x1C9, 4bytes; 分区前扇区数,即此分区的起始扇区号0x1CA-0x1CD,4bytes; 分区⼤⼩,即总扇区数4、winxp mbr反汇编代码分析利⽤⼯具ndisasmw⽣成MBR反汇编代码,命令ndisasmw -o 0x7c00 mbr.bin >> dismbr.asm4.1:第⼀步,MBR代码拷贝。
(0x7c1b到0x61b)00007C00 33C0 xor ax,ax ;ax=000007C02 8ED0 mov ss,ax ;ss=000007C04 BC007C mov sp,0x7c00 ;sp=0x7c0000007C07 FB sti ;开中断00007C08 50 push ax 00007C09 07 pop es ;es=000007C0A 50 push ax00007C0B 1F pop ds ;ds=000007C0C FC cld ;CLD是使得si,di传送⽅向从低地址到⾼地址增长00007C0D BE1B7C mov si,0x7c1b ;si=0x7c1b00007C10 BF1B06 mov di,0x61b ;di=0x61b00007C13 50 push ax00007C14 57 push di00007C15 B9E501 mov cx,0x1e5 ;200h-1bh=1e5,cx=485个字节拷贝00007C18 F3A4 rep movsb ;[ds:si]=[0:0x7c1b], [es:di] =[0:0x61b],拷贝0x7c1b地址以上的485个字节的内容到0x61b内存地址中00007C1A CB retf ;ip=0x61b,cs=0,跳转到内存地址0x61b处执⾏,即后⾯的代码4.2:第⼆步,MBR查找分区表信息,找到启动分区表以后,读取第⼀个扇区内容,并跳转⾄启动分区执⾏相关代码。
剖析主引导记录——主引导记录的修复与应用贾立莎摘要:硬盘的0柱面、0磁头、1扇区为主引导扇区,FDISK程序写到该扇区的内容为主引导记录(MBR),该记录占用446个字节,它用于硬盘启动时将系统控制权转移给用户指定的并在分区表中登记了的某个操作系统区,所以要进行主引导记录的备份,恢复,重写等。
用来修复由于主引导记录而引起的系统故障。
关键词:硬盘主引导修复1.主引导记录概述1.1什么是主引导记录MBR就是我们经常说的<硬盘主引导记录>,简单地说,它是由FDISK等磁盘分区命令写在硬盘绝对0扇区的一段数据,它由主引导程序、硬盘分区表及扇区结束标志字(55AA)这3个部分组成。
1.2主引导记录的组成主引导记录由三个部分组成(共占用512个字节):主引导程序区 446 负责检查硬盘分区表、寻找可引导分区并负责将可引导分区的引导扇区(DBR)装入内存;硬盘分区表区 16*4=64 每份16字节的4份硬盘分区表,里面记载了每个分区的类型、大小和分区开始、结束的位置等重要内容;结束标志字区 2 内容总为”55AA”。
这3部分的大小加起来正好是512字节=1个扇区(硬盘每扇区固定为512个字节),因此,人们又形象地把MBR称为“硬盘主引导扇区”。
这个扇区所在硬盘磁道上的其它扇区一般均空出,且这个扇区所在硬盘磁道是不属于分区范围内的,紧接着它后面的才是分区的内容(也就是说假如该盘每磁道扇区数为63,那么从绝对63扇区开始才是分区的内容)。
1.3写主引导记录程序-F 100 FFFF 0-E 7DBE 80 01 01 00 06 0F 66 F9 26 0000 00 9A B1 04 00-E7DCE 00 00 00 00 00 00 00 00 00 00 0000 00 00 01 00-D 7D80-E 7DFE 55 AA-E 7DB5 8B FC 1E 57 8B F5 CB-A 100-E102 03C:\FDISK/MBR-U 100-A 103Mov CX ,41FA-G=100-D7C00-A 106Mov DX ,0180-G=100-Q1.4主引导记录的作用检测分区表链是否正确,如果正确将引导具有激活标志的分区上的操作系统,也就是DBR。
产业科技创新 Industrial Technology Innovation76Vol.2 No.5浅谈MBR的引导过程刘宏斌(苏州高等职业技术学校,江苏 苏州 215000)摘要: MBR损坏后需要重建数据结构后,才能重新调用原来的的数据文件。
主引导扇区内的数据可以通过基于操作系统的相关分区软件进行写入,但是又和操作系统本身一定的关系,也就是说只要创建了有效的主引导记录就可以引导任意一种操作系统关键词:MBR;BOOT引导;汇编中图分类号:TP393.08 文献标识码:A 文章编号:2096-6164(2020)05-0076-021 MBR简介MBR最早在DOS操作时就已经开始使用了主引导记录的代码中包含了磁盘的相关参数和启动引导代码。
其中的磁盘启动引导代码的功能有检查这个分区表是不是有错误,还在计算机系统硬件完成POST自检程序后启动引导磁盘在引导记扇区1BEH位置有激活标志(代码为80H)的分区上的操作系统,并将控制管理权交给启动引导程序。
MBR是由特定分区程序(DOS 操作系统使用的Fdisk程序和LINUX使用分区程序也是Fdisk,名称相同功能和使用有区别)所划分的,但是又和操作系统没有任何依赖关系,而且磁盘引导程序可以进行修改的,利用复发引导程序,可以在开机时有多个系统可以进行选择进入,从而实现多系统共存。
目前由于操作系统的更新和分区的数量限制常用GPT 分区,但是MBR的分区方式还是以一定的方式存在。
向window7,windows10及linux操作系统也一直在使用。
MBR(masterbootrecord)可以解释为主引导记录,MBR的信息就通过分区软件写入到这个扇区,常用的软件有微软磁盘操作系统DOS中自带的FDISK,也可用第三方软件DM万用版、PartitionMagic、DiskGenius等等。
MBR和操作系统没有从属关系,不同操作系统的不会改变MBR的结构,它是具有公共引导的特性。
MBR反汇编;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 主引导记录(MBR)的反汇编分析; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MBR代码分析⽹上早就有了,但我找到的都是针对⽼版MBR的分析。
这⾥所谓的⽼版MBR,指的是早期的MBR,那时⼤容量硬盘还没有出现,MBR使⽤传统的Int 13h接⼝访问硬盘。
随着硬盘容量越来越⼤,传统的Int 13h已经⽆法完全访问硬盘上所有扇区(Int 13h接⼝理论上可访问的最⼤硬盘容量约为8G)。
因此,扩展Int 13h规范出台以适应这种变化。
MBR的代码也必须相应改动,必要时采⽤扩展Int 13h来加载引导扇区。
我称之为新版MBR。
本篇分析的就是新版MBR。
MBR其实并不复杂,但要完全理解也需要⼀些底层的系统知识。
code⾥的⼀些技巧值得借鉴。
seapeak@88 转载时就保持完整;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 设置栈SS:SP = 0:7C00;0000:7C00 xor ax, ax0000:7C02 mov ss, ax0000:7C04 mov sp, 7C00h0000:7C07 sti;; DS = ES = 0;0000:7C08 push ax0000:7C09 pop es0000:7C0A push ax0000:7C0B pop ds;; 将后⾯的代码复制到低端内存,为加载; 活动分区的引导扇区腾出空间,因为引导; 扇区也必须加载到0:7C00;0000:7C0C cld0000:7C0D mov si, 7C1Bh0000:7C10 mov di, 61Bh0000:7C13 push ax0000:7C14 push di0000:7C15 mov cx, 1E5h0000:7C18 repe movsb;; 跳到低端内存的代码继续执⾏;0000:7C1A retf;; 开始扫描分区表(Partition Table),寻找活动分区;0000:061B mov bp, 7BEh ; 600h+1BEh,分区表起始偏移为1BEh0000:061E mov cl, 4 ; 分区表中有4个分区表项loc_620:0000:0620 cmp [bp+0], ch ; 是活动分区吗?(此时ch中的值为0)0000:0623 jl loc_62E ; 活动分区的标志是80h,如果解释成有符号数,则⼩于0 0000:0625 jnz loc_63A ; 引导标志的合法值只能是0和80h,其它的值则出错0000:0627 add bp, 10h ; 指向下⼀个表项(每⼀个表项的长度为10h字节)0000:062A loop loc_620 ; 依次扫描所有分区表项;; 没有发现活动分区,⽆法启动OS,按照规范调⽤Int 18h; 早期的BIOS的Int 18h中断服务程序就是启动ROM-Basic,; 现在的BIOS⼀般是打印错误信息;0000:062C int 18h;; 找到活动分区后,还要检查剩余分区的启动标志是否为0; 不允许存在多个活动分区;loc_62E:0000:062E mov si, bploc_630:0000:0630 add si, 10h ; 下⼀个分区表项0000:0633 dec cx0000:0634 jz loc_64F ; 所以剩余分区都扫描完0000:0636 cmp [si], ch ; 启动标志是否为0?0000:0638 jz loc_630 ; 是则合法,检查下⼀分区;; 分区启动标志不合法,打印错误信息; "Invalid partition table";loc_63A:0000:063A mov al, byte_7B5loc_63D:0000:063D mov ah, 70000:063F mov si, axloc_641:0000:0641 lodsb0000:06420000:0642 loc_642:0000:0642 cmp al, 00000:0644 jz loc_642 ; 打印完错误信息后,进⼊死循环0000:0646 mov bx, 70000:0649 mov ah, 0Eh0000:064B int 10h ; 调⽤Int10h显⽰⼀个字符0000:064D jmp short loc_641;; 开始加载活动分区的引导扇区;loc_64F:;; 将⼀个标志的初始值清0。
MBR引导代码详解MBR主引导扇区前139个字节引导代码详解1(前27字节,作用:复制)默认分类 2009-12-01 14:50:48 阅读127 评论0 字号:大中小订阅MBR在系统启动时自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:0600处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00开始的空间将读入活动分区的操作系统的引导家扇区.0000 xor ax,ax '置ax为00002 mov ss,ax '把堆栈代寄存器置为00000004 mov sp,7c00 '把堆栈指令置为7c00,把以堆栈指向0000:7c00,0007 sti '中断使能0008 push ax '这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系.这条PUSH ax指令与下面一条指令一起是把es置为0,es用于movsb指令,'REP MOVSB (同repz movsb)的作用是重复CX次将[DS:SI]中字节传送到[ES:DI]中。
SI、DI加或减1由DF确定,DF=0,加。
REP使CX减1,到0后结束传送。
所以REP MOVSB 指令与CX、SI、DI、ES、DS寄存器和Flag的DF位设置有关。
0009 pop es000a push ax '作用同上000b pop ds000c cld '使方向标志寄存器DF=0000D mov si, 7c1b '用于movsb0010 mov di, 061b '用于movsb ,将[DS:SI]中字节传送到[ES:DI]中0013 push ax '保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转0014 push di0015 mov cx,01e5 '用于repz movsb中的repz,每次cx减1,到0不执行movsb,为485,除去复制代码27个字节,即复制001B开始的代码0018 repz0019 movsb '复制字节001a retfMBR主引导扇区前139个字节引导代码详解2默认分类 2009-12-01 19:15:58 阅读55 评论0 字号:大中小订阅(第28到第76字节,共49个字节,作用:判断是否是活动分区,是否是非活动分区),一个扇区是512个字节,所以MBR主引导扇区也是512个字节,最后两个字节是55 AA,是表示结束的字节.而次后64个字节是硬盘分区表字节,每16个字节代表一个分区表项,所以最多有4项分区表项(如最多分为C,D,E,F盘),如果分区个数多于4个,则用虚拟MBR技术,即在MBR 扇区的分区表中用2项就行,第一项分区表为主分区C盘,第2项分区表为扩展分区,它指向这项中磁头,扇区,柱面3维地址所指向的扇区(为第二个分区的第一个扇区,如D),在这个扇区中的分区表项也只有2项,第一项是这个分区,第二个分区表项为扩展分区.这个分区项指向下一个分区(如E盘)的的第一个扇区.,以此推之,就是一个分区链,这种就可以突破MBR中只有4个分区表项了.分区表项的第一个字节代表的是是否为活动分区,80表示是活动分区(主分区),00表示的是非活动分区(扩展分区,或没有用到的分区表项这个标志也为00),除这两个标示外.其它标示为非法.下面是这17个字节的代码:001B mov si,07BE '因为前面27个字节代码把MBR内容复制到0000:0600处(其实前面27个复制代码字节为00,没有复制过来,一开始就复制到0000:061b 处),所以分区表的位置就为0000:06BE(第一项的开头地址).所以这句代码是把si指向MBR 中硬盘分区表的第一项的首地址.001E mov cl,04 '分区表有4项,4*16=64个字节,用于loop0020 cmp [si],ch 'cx寄存器前面用movsb减为0,所以ch=0,判断第一个分区表项的第一个字节标示是否为非活动分区,因为cmp是有符号数据比较,如果[si]=80,则其比0小0022 jl 002D '如果是80,活动分区,则跳到002D地址,这里有点问题,如果是81非法数据,也是小于0,也会跳到002D地址,所以用JZ比较好点0024 jne 003B ' 如果不等于00,(即不为非活动分区),则跳到003B,显示错误信息.0026 add si,0010 '使si指向下一个分区项,即跳过16个字节.0029 loop 0020 '循环取出4个分区表项.loop由cx次数决定002B int 18 'INT 18 为ROM BASIC 入口代码,它指分区表项中没有活动分区标志或非活动分区标志时,进行ROM BASIC代码.002D mov dx,[si] '若找到活动分区,把分区表项的前2个字节放到DX中dl=80,dh=起始磁头号002F mov bp,si '把活动分区的起始位置保存到BP寄存器中0031 add si,0010 '指向下一个分区表项0034 dec cx '因为前面ch=0,就是把前面cl=4减1,0035 je 004D '分区检测完毕,则跳转到系统引导区0037 cmp [si],ch '判断是否为非活动分区,是则跳转检测下一个分区表项,就是一面这条指令0039 je 0031'下面地址003B,是前面在检测既不是活动分区时,也不是非活动分区时,跳过来显示错误信息003B mov si,0710 'MBR扇区中错误信息的地址(10fH),在这里起始地址是0600,所以为070f003e dec si '前一指令是0710,这里减1,正好是070f003F lodsb '把si指向的地址中的数据字节放到al中,执行后si+10040 cmp al,00 '如果指向的数据字节为00(到结束了),就跳到003E,这时因为上面si+1了,003E处减1还是指向这个00,所以就(循环)停止到这,显示错误信息0042 je 003E0044 mov bx,0007 'BIOS中断int 10h,BX=传输区地址0047 mov ah,0E '设置显示模式,AL=0E 640×200 彩色图形(EGA)0049 int 10 '中断10H 显示字符004B jmp 003f '跳转显示下一个字符.MBR主引导扇区前139个字节引导代码详解3默认分类 2009-12-02 12:03:23 阅读46 评论0 字号:大中小订阅最后一段字节的作用是把活动分区对应的第一个扇区的512个字节数据读到0000:7C00处,如果读取不成功再读,读取的次数赋到DI中,如果读取成功,判断结束标志是否为AA 55,则恢复活动分区指针到SI,转到0000:7c00处,执行活动分区的系统引导程序.mov si,bpjmp 0000:7c00。
主引导记录(MBR)的反汇编分析1.)首先启动机器到实模DOS下,加载NTFS4DOS程序使程序可以读NTFS分区。
2.)转到引导系统启动的主分区。
输入C:回车转到主分区,输入DEBUG启动到DEBUG界面3.)开始备份MBR主引导记录,-a 100 ;指定开始汇编的位置mov ax,0201 ;AH=功能号0=复位磁盘2=读磁盘3=写磁盘AL=读取的扇区mov bx,7c00 ;bx=读入的内存地址mov cx,0001 ;ch=磁道号cl=扇区号mov dx,0080 ;dh=磁头号dl=驱动器号80h:硬盘Cint 13 调用BIOS中断int 3 异常中断-g =100 ;运行地址100处的程序-d 7c00 l100 ;L加载文件到内存,D转储100个字节长度n MBR.DA T ;指定写入文件的名称-rbx ;显示BX寄存器的内容:0 改变BX寄存器的值为零-rcx ;显示CX寄存器的内容:200 改变CX寄存器的值为200-W 7c00 ;将BX和CX指定的字节数的内容写入文件保存MBR备份到C盘根目录4.)先用Q退出DEBUG再重新进入下5.)加载备份文件到内存6.)开始用自己写的编码代替从7C00开始27个字节的编码Mov ax,cs ;代码段地址送AXMov sp,7c00 ;7C00送堆栈寄存器Sti ;开中断Jmp 7c0c ;跳转到7C0C-T =100 ;从地址100处单步跟踪单步跟踪输入T回车一直跟到跳转到7C0C处CLD ;DF方向标志置零DF=0串操作指令中操作数地址自动递增MOV SI,7C1B ;7C1B地址送SI源变址寄存器MOV DI,061B ;061B地址送DI目的变址寄存器PUSH AX ;AX里保存着CS代码段的地址PUSH DI ;将DI=061B压栈位将来弹出到IP做准备MOV CX,01E5 ;循环传送的字节数REPZMOVSB ;循环把7C1B地址01E5字节的数据复制到061B地址单步跟踪到REPZ MOVSB 后面是一个循环指令用T 1E5执行过去继续T一下看下现在各个寄存器里的值RETF会从堆栈里弹出SP到IP 弹出SP+2到CS这样代码会转到061B地址执行来到了061B地址,先看下反汇编代码MOV SI,07BE ;600h+1BEh,分区表起始偏移为1BEh ;7BE-61B=1A3==419 ,这是说从7C00偏移27字节的地址加上419字节正好是446字节偏移MOV CL,04 ;分区表中有4个分区表项CMP [SI],CH ; 从SI地址取分区起始标志80和CH比较JL 062D ;是活动分区吗?(此时ch中的值为0) JL被减数小于减数则转移;条件成立则转移到062DJNZ 063B ;不等于零则跳到063BADD SI,10 ;SI加16个字节到下个分区表的地址LOOP 0620 ;循环到CMP [SI],CH 继续比较INT 18 没有发现活动分区,无法启动OS,BIOS的Int 18h中断服务程序ROM-Basic 现在的BIOS一般是打印错误信息MOV DX[SI] ;取SI地址值; DX=0180 80是主分区标志MOV BP,SI ;把07BE保存到BPADD SI,+10 ;;SI=07CE || 07BE加了16个字节到下个表头DEC CX ;4个分区表项次数JZ 7C4D ;;4个分区活动标志都检测后跳出去来到064D这里,反汇编下机器码MOV [BP+25],AX ;AX值保存到07BE+37字节处XCHG SI,AX ;SI值和AX=0ED9交换MOV AL,[BP+04] ;07BE +4个字节是文件系统标志MOV AH,06 ;06传送到AHCMP AL,0E ;判断是不是FA T16文件系统JZ 066BMOV AH,0BCMP AL,0C ;判断是不是FA T32文件系统JZ 0665 ;因为是FA T32文件系统跳转成立跳转到0665先汇编下机器码MOV BYTE PTR [BP+25],06JNZ 068F ;MOV BX,55AA ;55AA送BX寄存器PUSH AX ;保护寄存器内容MOV AH,41 ;功能号41HINT 13 ;这个是int 13 扩展功能检测POP AX ;保护寄存器内容JB 068C ; CF=1时是错误AH 里包含错误号CMP BX,AA55 ;比较BX是否是AA55JNZ 068C ;不等于零跳向错误TEST CL,01 ;测试API子集错误跳向068CJZ 068C 跳向错误MOV AL,AHMOV [BP+24],DL查看下寄存器内容现在使用命令g = 0671 0673 不跟入中断执行完INT13后寄存器的变化如图:BX 的内容反转了变成了AA55。
硬盘数据恢复本文是一篇科普文章,是作者考虑到一般用户的接受能力而写的,对本领域的专家本文并无价值。
作者力图能给广大用户做准确的描述,但由于作者时间和水平的限制,作者不能保证本文的涉及的观点、处理方法等绝对正确。
欢迎大家就各种问题与我探讨。
————————————————————————————————1、系统工作机理的简单介绍(本节由lowpower缩写)这一部分在原作中是最重要的一章,考虑到篇幅关系,进行了大量的删节。
①、DOS(DOS兼容系统)硬盘数据的构成DOS磁盘系统,可以按照逻辑分区的概念管理物理空间,不同分区可以装载不同的OS系统。
示意如下:对FAT结构的分区每一分区都有独立的引导记录,FDT表,FAT表等。
同时,系统还有一个最为重要的主引导记录。
在0柱0面1扇区,今后我们用CYL代表柱、SIDE代表面,SEC代表扇区。
以下一个FAT结构分区的简图。
以下简单介绍一下重要的部分:主引导记录又称主分区表、MBR等等:MBR占一个扇区,在CYL0、SIDE0、SEC1,由代码区和数据区构成。
其中代码区是一端标准的程序,完成BIOS自举到OS BOOT之间的工作,为OS 启动做最后的准备。
标准代码区可以由FDISK/MBR重建,但对于多系统引导的不标准MBR,将被这一操作破坏。
MBR的数据区记录了分区情况。
系统扇区:CYL0、SIDE0、SEC1-CYL0、SIDE0、SEC63,共62个扇区引导区又称BOOT区:CYL0、SIDE1、SEC1这是我们过去称的DOS引导区。
也占一个扇区。
文件分配表又称FAT:是记录文件占用簇的情况和连接关系的地方。
一般有两个FAT表,起到备份的作用。
FAT12、FAT16的第一FAT表一般均在0-1-2,FAT32的第一FAT表在0-1-33。
由于FAT 表记录文件占用扇区连接的地方,如果两个FAT表都坏了,后果不堪设想。
由于FAT表的长度与当前分区的大小有关所以FAT2的地址是需要计算的。
主引导记录工作原理; 下面是DOS汇编部分;@ECHO OFF;GOTO END_BATCH ;下面是一些编译设置,因为要编成COM文件,所以是TINY模式(C语言的微型模式).MODEL tiny.CODE ;CODE(代码)STARTUPCODE ;BIOS引导系统把我从硬盘的主引导分区中搬到了内存中,我现在的位置是0000:7C00;STARTUP(起始)我终于可以工作了,让我先设置新的堆栈段,数据段,附加段吧!M_0100:CLI ;禁止INTR中断XOR AX,AX ;SS:SP=0000:7C00,因为0000:7C00是我的家,所以我的堆栈当然要在我前面啦MOV SS,AX ;异或逻辑XOR AX,AX的结果是0000MOV SP,7C00H ;等一会我们就要搬家了,所以先把般家的位置准备好,DS:SI=0000:7C00,ES=0000MOV SI,SP ;PUSH AX ;以下是利用堆栈指令来进行转送数据POP ES ;ES=0000PUSH AXPOP DS ;DS=0000STI ; STI(开放INTR中断)CLD ;CLD(0→DF,DF是方向标志位,串操作的指针移动方向从低到高)MOV DI,0600H ;把新家搬到0000:0600的位置吧,因为0000:7C00这个地方要让给DOS引导程序玩啊;注意:系统引导型病毒也会搬家的哦,不过是搬到9FC0:0这个内存最高端的1K内;存中的,这样既腾出了空间给DOS,又保护了自已不会发现,当然新家就很安全了哦MOV CX,0100H ;串操作的次数:256,因为是字传送,故可传送512字节。
REPNZMOVSW ;新家搬好了,赶快跳过去吧,是0000:061D这个地方,不要跳错了哦:)DB 0EAH,1DH,6,0,0 ;JMP 0000:061D ;终于跳到新家了,我们又可以继续我们的工作了,不过我现在的位置是在0000:061D处M_011D:MOV SI,0600H+PT-M_0100 ;设好分区表的起始位置,我们要一个一个地检查了啊MOV BL,04 ;我们要读4个分区的信息,所以BL=4,BL是我们的计数器哦,M_0122:CMP BYTE PTR [SI],80H ; 80H是活动分区标志,如果我们读到了活动分区标志80H的话,快去M_0135这个地方继续工作吧JZ M_0135 ; JZ:结果为零(ZF=1),则转移。
主引导记录(MBR)的反汇编分析
1.)首先启动机器到实模DOS下,加载NTFS4DOS程序使程序可以读NTFS分
区。
2.)转到引导系统启动的主分区。
输入C:回车转到主分区,输入DEBUG启动到DEBUG界面
3.)开始备份MBR主引导记录,
-a 100 ;指定开始汇编的位置
mov ax,0201 ;AH=功能号0=复位磁盘2=读磁盘3=写磁盘AL=读取的扇区
mov bx,7c00 ;bx=读入的内存地址
mov cx,0001 ;ch=磁道号cl=扇区号
mov dx,0080 ;dh=磁头号dl=驱动器号80h:硬盘C
int 13 调用BIOS中断
int 3 异常中断
-g =100 ;运行地址100处的程序
-d 7c00 l100 ;L加载文件到内存,D转储100个字节长度n MBR.DA T ;指定写入文件的名称
-rbx ;显示BX寄存器的内容
:0 改变BX寄存器的值为零
-rcx ;显示CX寄存器的内容
:200 改变CX寄存器的值为200
-W 7c00 ;将BX和CX指定的字节数的内容写入文件
保存MBR备份到C盘根目录
4.)先用Q退出DEBUG再重新进入下
5.)加载备份文件到内存
6.)开始用自己写的编码代替从7C00开始27个字节的编码Mov ax,cs ;代码段地址送AX
Mov sp,7c00 ;7C00送堆栈寄存器
Sti ;开中断
Jmp 7c0c ;跳转到7C0C
-T =100 ;从地址100处单步跟踪
单步跟踪输入T回车
一直跟到跳转到7C0C处
CLD ;DF方向标志置零DF=0串操作指令中操作数地址自动递增MOV SI,7C1B ;7C1B地址送SI源变址寄存器
MOV DI,061B ;061B地址送DI目的变址寄存器
PUSH AX ;AX里保存着CS代码段的地址
PUSH DI ;将DI=061B压栈位将来弹出到IP做准备MOV CX,01E5 ;循环传送的字节数
REPZ
MOVSB ;循环把7C1B地址01E5字节的数据复制到
061B地址
单步跟踪到REPZ MOVSB 后面是一个循环指令用T 1E5执行过去
继续T一下
看下现在各个寄存器里的值RETF会从堆栈里弹出SP到IP 弹出
SP+2到CS这样代码会转到061B地址执行
来到了061B地址,先看下反汇编代码
MOV SI,07BE ;600h+1BEh,分区表起始偏移为1BEh ;7BE-61B=1A3==419 ,这是说从7C00
偏移27字节的地址加上419字节正好是446字节偏移
MOV CL,04 ;分区表中有4个分区表项
CMP [SI],CH ; 从SI地址取分区起始标志80和CH比较
JL 062D ;是活动分区吗?(此时ch中的值为0) JL被减数小于减数则转移;条件成
立则转移到062D
JNZ 063B ;不等于零则跳到063B
ADD SI,10 ;SI加16个字节到下个分区表的地址
LOOP 0620 ;循环到CMP [SI],CH 继续比较
INT 18 没有发现活动分区,无法启动OS,BIOS的Int 18h中断服务程序
ROM-Basic 现在的BIOS一般是打印错误信息
MOV DX[SI] ;取SI地址值; DX=0180 80是主分区标志MOV BP,SI ;把07BE保存到BP
ADD SI,+10 ;;SI=07CE || 07BE加了16个字节到下个表头DEC CX ;4个分区表项次数
JZ 7C4D ;;4个分区活动标志都检测后跳出去
来到064D这里,反汇编下机器码
MOV [BP+25],AX ;AX值保存到07BE+37字节处XCHG SI,AX ;SI值和AX=0ED9交换
MOV AL,[BP+04] ;07BE +4个字节是文件系统标志MOV AH,06 ;06传送到AH
CMP AL,0E ;判断是不是FA T16文件系统
JZ 066B
MOV AH,0B
CMP AL,0C ;判断是不是FA T32文件系统
JZ 0665 ;因为是FA T32文件系统跳转成立
跳转到0665
先汇编下机器码
MOV BYTE PTR [BP+25],06
JNZ 068F ;
MOV BX,55AA ;55AA送BX寄存器
PUSH AX ;保护寄存器内容
MOV AH,41 ;功能号41H
INT 13 ;这个是int 13 扩展功能检测POP AX ;保护寄存器内容
JB 068C ; CF=1时是错误AH 里包含错误号CMP BX,AA55 ;比较BX是否是AA55
JNZ 068C ;不等于零跳向错误
TEST CL,01 ;测试API子集错误跳向068C
JZ 068C 跳向错误MOV AL,AH
MOV [BP+24],DL
查看下寄存器内容
现在使用命令
g = 0671 0673 不跟入中断
执行完INT13后寄存器的变化如图:
BX 的内容反转了变成了AA55。