7

VMware BIOS がロード前に MBR を検出する方法を理解しようとしています。

物理ハードディスクでは簡単です。MBR は最初のセクターにあります。
しかし、.. VM ではどうなるでしょうか。

2 つの VM を作成しました。最初の vmdk (Linux ベースのシステムがインストールされている) で、オフセット 0x2A0000 に MBR が見つかりました。
2 番目の vmdk ファイル (Windows XP がインストールされている) で、MBR を 2 回以上見つけましたが、見つけたすべてのオフセットを 512 (セクター サイズ) で割ることができませんでした。 MBRはセクターの先頭から開始する必要があります+セクターサイズはvmdkの512バイトです=> MBRの開始オフセットは512で除算する必要があります。間違っている場合は修正してください)。
したがって、それらはおそらくバックアップ用のコピーだったと思います..言うまでもなく、xp .vmdk の @ offset 0x2A0000 は何も興味深いものではありませんでした。

では、VMware の BIOS はどのように MBR を検出するのでしょうか? この構成可能なパラメータはどこにありますか\どのように計算されていますか?

追加情報:
- どちらの VMDK も 1 ファイルのハードディスク ファイルです (40GB まで拡張できます)。
それらが提供するシステムはそれらとそれらのみを使用します(XPはxp.vmdkを使用し、Linuxはlinux.vmdkを使用し、追加のVMDKはありません)。

- @Windows VM \.\PhysicalDrive0 で WinHex を使用して MBR を取得しました。問題ないように見えました (署名など)。
- @Linux VM コマンド「dd if=/dev/sda of=mbr.bin bs=512 count=1」を使用し、16 進バイトを表示して MBR を取得しました。最後に署名など)。
VM から MBR を取得した後、対応する各 .vmdk ファイルでホスト PC の MBR を検索しました (16 進エディターを使用)。オフセットは上記のとおりでした。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

9

人々がこの質問を見ていて、まだコメントや回答がないのを見たので、自分で少し調査しました.
次の結論を得ました(最終的に私の質問に答えます):

1.VMware(.VMDKファイル)でXXX GBの仮想ハードディスクを作成する場合、フラットまたはスパース(複数に分割することもできます) .VMDK ファイルですが、私の調査ではそれらについては説明しませんでした)。
-フラット= すべてのハードディスク容量 (XXX GB) が作成時に 1 回割り当てられます。
ディスク上の .VMDK ファイルのサイズは XXX GB です。

- sparse = ハードディスク ファイルは消耗品です (最大 XXX GB)。
.VMDK ファイルのサイズは最初は小さく、必要に応じて大きくなります。

追加情報の質問で述べたように、両方の .VMDK がスパースでした.

2.質問で述べたように、MBR は物理ハードディスクの最初のセクターの先頭にあり、.VMDK ファイルのどこにあるのか、VMware がどのように計算するのか疑問に思いました。フラットな .VMDK ファイルでは、最初のセクターの先頭にも配置されていることがわかりました
。 それらを見ると、それはかなり率直な序文です..しかし、私のものはフラットではありませんでした。では、スパース .vmdk ではどうなるでしょうか? mbrはどこに座っていますか? 3.sparse .vmdk ファイルの構造は異なります (詳細な構造については、VMware の Virtual Disk Format Specを参照してください。ページ 6 - struct SparseExtentHeader.



MBR \ 最初のセクターがどのように計算されるかのロジックがそこに見つかりませんでしたが、私が見た限りでは (5 で説明されています)、次のようになります:

@ .VMDK オフセット 0x38 - 0x3F (8 バイト長) gdOffset.it は、メタデータのオフセット (****) を格納します。
メタデータの最初の 4 バイトは、ジャンプ先の次のオフセット (****) です。
そこで、次の 4 バイトは MBR のオフセット (****) です
(****) はセクター単位のオフセットを意味します。たとえば、1 はオフセット 512 を意味し、2 は 1024 を意味します。

すべてを要約すると、次のようになります。
「オフセット 0x38-0x3F (8 バイト長) に格納されたデータ」を [(0x38):8] としましょう。

次に、
MBR オフセット = 512 X [(512 X [(512 X [(0x38):8]):4]):4]

4.スパース .VMDK を使用して 2 つの新しい VM (Windows xp および Linux) を作成しました。この MBR 計算方法は、それらの両方に対しても有効であることが証明されました (7 の添付画像でわかるように)。

5. どうやってこの式にたどり着いたのですか? フィルタリング中に SysInternal のプロセス モニター
を使用し ます 。 MBR のオフセットを読み取る場所 (Linux システムでは、オフセットが 0x2A0000 であることはわかっていました) と、以前に読み取ったものを調べました。そこで何が起こっているのかを理解するのに役立つように見えるオフセットにジャンプしました..そして、彼らは確かにそうしました:)







6. 私が説明しなかったのは、元の質問で xp システムの MBR が奇妙なオフセット (512 で割り切れない) にあった理由です。
正直なところ、完全な理由はありませんが、MBR チェックの前に、このシステムから元の MBR を削除し、VM の電源を入れたことを忘れていました。Windowsを通常どおり起動するかどうかを尋ねられた後、奇妙なオフセットに表示されました(バックアップなどのためにそこにコピーしました)。ここで奇妙なことは、このMBRが通常のオフセットで見つからなかったことです。ある程度の進歩はありましたが、確固たる答えはありませんでした。
知ってる人いたら気軽にコメントしてね(: 7.

添付画像:
Windows XP MBR 検索の説明 Linux MBR 検出の説明

于 2015-01-07T22:39:06.047 に答える