主引导记录(MBR)的反汇编分析

合集下载

硬盘主引导记录详解

硬盘主引导记录详解

硬盘主引导记录详解硬盘的数据结构对于一些朋友来说总是很神密!为什么我们删除了的文件用软件能找到?为什么我们格式化了的硬盘数据还能找回来?要回答这一切,你就得对硬盘的数据结构有个清醒的认识。

硬盘上的数据由五大部分组成,它们分别是: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引导程序的反汇编代码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逆向分析工程实验报告

基于MBR逆向分析工程实验报告

基于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)及其结构详解

硬盘主引导记录(MBR)及其结构详解

硬盘主引导记录(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)及其故障处理

硬盘主引导记录(MBR)及其故障处理

硬盘主引导记录(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代码分析【转载,学习使用】

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引导代码分析

MBR引导代码分析

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)详解

硬盘主引导扇区(MBR、DPT、DBR、BPB)详解

硬盘主引导扇区(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字节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主引导记录(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。

相关文档
最新文档