bootsect.exe 在 FAT32 文件系统上的行为?

Icy_Ybk 2019-03-17 11:28:25
研究 bootsect.exe 行为时,发现其在写分区引导扇区的时候,在 FAT32 文件系统中,除了写分区的第一个扇区,还写了分区的第十二个扇区,请问有人能帮忙解答下,写入的第二段内容是什么吗?

第一段内容确定是引导扇区内容。
...全文
91 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Icy_Ybk 2019-03-17
  • 打赏
  • 举报
回复
少传一个图
Icy_Ybk 2019-03-17
  • 打赏
  • 举报
回复
先是它在处理命令行参数的时候,根据 /NT52、/NT60 等判断究竟是使用兼容 BOOTMGR 还是兼容 NTLDR 的引导扇区内容。 pBootmgr 和 pNtldr 应该都是 __int32 ** 二级指针。 这之后,它有一个过程,根据分区盘符获取对应的命名空间对象名(应该是),类似于 \\Harddisk\Volume... 啥的,应该影响不大。 之后跳过好多代码直接看写入分区前的准备部分,尝试调用函数判断文件系统类型 看第一个 NtQuery... 那里,获取文件系统类型,然后记录到 v6 中,可以看到取值分别是 0:FAT, 1:FAT32, 2:NTFS, 3:其他 然后第二个 NtQuery... 那里,获取大小信息,将文件系统类型返回给 fstype 变量,每扇区字节数返回给 bytesPerSector 上图对于 VolumeInformation 那个变量它的分析有些问题,应该是一个 void * 指针,指向一个结构体的首地址,那个首地址处的成员没有用,但被 IDA 识别成一个 char 变量了。看反汇编部分可以看出来 VolumeInformation 和 var_C 两个变量 注意后面的偏移,一个是 ebp - 0x20,一个是 ebp - 0xC,那么在结构体中就是 0000 VolumeInformation 0004 0008 ... 0014 var_C 这里需要参考下 NtQueryVolumeInformationFile 的文档, 可以找到一个结构体 其中 LARGE_INTEGER 是 8 字节的,ULONG 4 字节,0x14 = 20 = 8 + 8 + 4,那么实际上 var_C 就是结构体中的 BytesPerSector,每扇区字节数。 然后回来,接着看之后的代码,根据不同文件系统类型判断要分配的空间大小及使用哪个内置的引导扇区数据。 其中对应于 FAT32 的大小是 0x600,引导扇区数据在之前截图中,pBootMgr 以及 pNtldr 分别指向的三个指针,会按情况,选择对应的赋给 v6,之后会被赋给 bootsect_template 变量,这也就是我之前如何确定数据与文件系统的对应关系的由来。 接下来应该就是大小对齐(比如可能一个扇区非 512 字节的),以及空间分配等等,应该没有什么问题,如果有问题请告知 尝试锁定文件(分区),如果锁定失败就先卸载,其中 fscontrol 函数里调用的是 NtFsControlFile 然后读首扇区数据到分配的空间,再根据分区类型(以及 FAT/FAT32 文件系统中根据开头的跳转指令判断)确定引导代码要写入的位置,然后将内置的模板中的数据,从那个位置开始,之后的所有内容拷到分配的空间里。 接着设置文件指针到开头,然后它判断了下文件系统类型 然后我们先往下看 FAT32 部分的代码 写了第一个扇区数据,然后设置文件指针到第 12 个扇区位置,跳转到 write_sectors。 解释一下,对于 FAT、NTFS 文件系统,它是直接写了之前准备的那些内容到分区里。然而 FAT32 特殊了下,先写首扇区数据,然后忽略准备的数据中的第二个扇区数据,直接写第三个扇区数据到分区的第 12 个扇区(第二步和 FAT、NTFS 的写入重叠了,那个应该不需要解释,文件指针和 bufBootsector 不一样)。 之后解除分区锁定,收尾,函数返回。 大致过程就这样。
Icy_Ybk 2019-03-17
  • 打赏
  • 举报
回复
针对指定盘符的写入,只讨论 FAT32: bootsect.exe 在准备处理时,先根据不同的文件系统,new 分配了一个空间,其中针对 FAT32 文件系统的那个空间大小是 0x600。 接着它读分区的第一个扇区(扇区大小在准备期间通过 NtQueryVolumeInformationFile 获取),读到那个空间开头。 进行下判断,看前 3 个字节跳转指令是如何写的,根据相对位置计算得到引导代码的位置。然后从它内置的 16 进制数据中,选择针对对应文件系统(FAT32)的那段数据中,将那个数据对应位置处之后的所有数据全部复制到之前分配的空间。 接下来的过程就有些特殊了,特别判断了下是否是 FAT32,然后如果是 FAT32 的话,将分配空间中第一个扇区大小的数据写到分区第一个扇区内,然后设置文件指针到 0x1800 处(第 12 个扇区开始位置),从分配空间中的 0x400 处(第 3 个扇区开始位置),再写一个扇区大小数据到磁盘。写入过程结束。 然后这就不明白了,为什么它特别地要在第 12 个扇区位置写数据。。。 一会儿贴下分析的代码部分,以便参考同时可以看看我有没有什么分析中的错误。
Icy_Ybk 2019-03-17
  • 打赏
  • 举报
回复
补图,第一段 0x200~0x3ff 第二段,未知的东西
Icy_Ybk 2019-03-17
  • 打赏
  • 举报
回复
FAT32 Bootmgr 部分16进制数据 hex 0x200~0x3ff 是第一个扇区内容,引导扇区,0x400~0x5ff 看样子是 FAT32 的 Fs Information,这个部分没有写入 接下来的,就是它写的第二段东西,不知道啥数据 Ntldr 的与之大同小异,差别似乎就是 BOOTMGR 换成了 NTLDR,引导代码部分不一样。写的第二段数据没区别。 请问有人能帮忙解释下第二段到底什么含义吗?写到第 12 扇区,但是 FAT32 的文档中没看到对应的说明。 : )
Heom 2019-03-17
  • 打赏
  • 举报
回复
于是它写的第二段数据是什么?
NTLDR文件是win nt/win200/WinXP的引导文件,当此文件丢失时启动系统会提示"NTLDR is missing..."并要求按任意键重新启动,不能正确进入系统 。所以应该在系统正常的时候给予备份。 NTLDR文件是做什么的?我们如何来修复NTLDR文件类型的故障呢? NTLDR文件的是一个隐藏的,只读的系统文件,位置在系统盘的根目录,用来装载操作系统。 一般情况系统的引导过程是这样的: 代码 1、电源自检程序开始运行 2、主引导记录被装入内存,并且程序开始执行 3、活动分区的引导扇区被装入内存 4、NTLDR从引导扇区被装入并初始化 5、将处理器的实模式改为32位平滑内存模式 6、NTLDR开始运行适当的小文件系统驱动程序。 小文件系统驱动程序是建立在NTLDR内部的,它能读FAT或NTFS。 7、NTLDR读boot.ini文件 8、NTLDR装载所选操作系统 *如果NT/XP被选择,, NTLDR运行Ntdetect.com 对于其他的操作系统, NTLDR装载并运行Bootsect.dos然后向它传递控制。 windows NT过程结束。 9.Ntdetect.com 搜索计算机硬件并将列表传送给NTLDR,以便将这些信息写进HKE Y_LOCAL_MACHINEHARDWARE中。 10.然后NTLDR装载Ntoskrnl.exe,Hal.dll和系统信息集合。 11.Ntldr搜索系统信息集合,并装载设备驱动配置以便设备在启动时开始工作 12.Ntldr把控制权交给Ntoskrnl.exe,这时,启动程序结束,装载阶段开始 当此文件丢失时,我们可以从安装光盘上进行提取,方法是: 1、进入系统故障恢复控制台。 2、转到C盘。 3、输入"copy X:\I386\NTLDR c:\"(说明:X为光驱盘符)并回车, 如果系统提示要否覆盖则按下"Y",之后输入exit命令退出控制台重新启动即可。 症状 当试图在一台运行 Microsoft Windows 95、Microsoft Windows 98 或 Microsoft Windows Millennium Edition (Me) 的计算机上安装 Windows XP 或者升级到 Windows XP 时,可能在安装过程中的第一次重新启动后接收到下面的错误信息: NTLDR is missing Press any key to restart 此行为只有当 Windows 95、Windows 98 或者 Windows Me 安装于使用 FAT32 文件系统的大容量驱动器之上时才会出现。 原因 如果克隆现有的 Windows 95、Windows 98 或 Windows Me 的安装,然后应用于与克隆副本的源驱动器有不同布局的驱动器上,则可能发生此行为。 一种可能的情况如下所示:正在一个 4 GB 的驱动器上运行 Windows 98。在升级后,例如升级到一块 30 GB 的硬盘后,使用第三方磁盘映像实用程序对 Windows 98 安装进行镜像操作并应用镜像到新驱动器上。在晚些时候,接着在 Windows 98 的克隆映像上安装 Windows XP 以升级到 Windows XP。 要发生此行为,则下面的条件必须存在: ? 系统/启动分区用 FAT32 文件系统格式化。 ? 计算机通过使用 INT-13 扩展(大于 7.8 GB 且分区表内有 0C 的 System-ID 类型的分区)启动。 ? 由于克隆过程,造成了 FAT32 BIOS Parameter Block (BPB) 中的头(边)值与物理驱动器的布局不匹配。 Windows 95、Windows 98 或者 Windows Me 启动代码忽略 BPB 中的头值,并且即使在值无效时仍启动程序。但是,Windows 2000 和 Windows XP 中的启动代码需要这个值,如果此值无效则启动过程不会成功。 解决方案 若要解决此问题,请改正 FAT32 BPB 中的无效头(边)值以使得 Windows XP 启动过程得以继续。更新此字段最简单的方法是通过使用下面的过程重写 Windows 95、Windows 98 或者 Windows Me 的启动代码: 代码 一. 使用包含 Sys.com 文件(默认情况下包含此文件)的 Windows 95、Windows 98 或者 Windows Me 启动盘重新启动计算机。 二. 在系统驱动器的根目录中制作 msdos.sys 文件的备份副本。为此,请从命令提示处键入下面的命令: attrib -h -r -s c:\msdos.sys rename msdos.sys *.sys 三. 在命令提示符

1,508

社区成员

发帖
与我相关
我的任务
社区描述
Windows专区 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧