研究 bootsect.exe 行為時,發現其在寫磁區引導扇區的時候,在 FAT32 檔案系統中,除了寫磁區的第一個扇區,還寫了磁區的第十二個扇區,請問有人能幫忙解答下,寫入的第二段內容是什么嗎?
第一段內容確定是引導扇區內容。
uj5u.com熱心網友回復:
針對指定盤符的寫入,只討論 FAT32:bootsect.exe 在準備處理時,先根據不同的檔案系統,new 分配了一個空間,其中針對 FAT32 檔案系統的那個空間大小是 0x600。
接著它讀磁區的第一個扇區(扇區大小在準備期間通過 NtQueryVolumeInformationFile 獲取),讀到那個空間開頭。
進行下判斷,看前 3 個位元組跳轉指令是如何寫的,根據相對位置計算得到引導代碼的位置。然后從它內置的 16 進制資料中,選擇針對對應檔案系統(FAT32)的那段資料中,將那個資料對應位置處之后的所有資料全部復制到之前分配的空間。
接下來的程序就有些特殊了,特別判斷了下是否是 FAT32,然后如果是 FAT32 的話,將分配空間中第一個扇區大小的資料寫到磁區第一個扇區內,然后設定檔案指標到 0x1800 處(第 12 個扇區開始位置),從分配空間中的 0x400 處(第 3 個扇區開始位置),再寫一個扇區大小資料到磁盤。寫入程序結束。
然后這就不明白了,為什么它特別地要在第 12 個扇區位置寫資料。。。
一會兒貼下分析的代碼部分,以便參考同時可以看看我有沒有什么分析中的錯誤。
uj5u.com熱心網友回復:
先是它在處理命令列引數的時候,根據 /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 不一樣)。
之后解除磁區鎖定,收尾,函式回傳。
大致程序就這樣。
uj5u.com熱心網友回復:
少傳一個圖
uj5u.com熱心網友回復:
于是它寫的第二段資料是什么?uj5u.com熱心網友回復:
FAT32 Bootmgr 部分16進制資料
hex

0x200~0x3ff 是第一個扇區內容,引導扇區,0x400~0x5ff 看樣子是 FAT32 的 Fs Information,這個部分沒有寫入
接下來的,就是它寫的第二段東西,不知道啥資料

Ntldr 的與之大同小異,差別似乎就是 BOOTMGR 換成了 NTLDR,引導代碼部分不一樣。寫的第二段資料沒區別。
請問有人能幫忙解釋下第二段到底什么含義嗎?寫到第 12 扇區,但是 FAT32 的檔案中沒看到對應的說明。 : )
uj5u.com熱心網友回復:
補圖,第一段 0x200~0x3ff
第二段,未知的東西
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/83121.html
標籤:非技術區
