6

インストールしてgrub v1.98MBR を逆アセンブルした後、理解できない次のコード スニペットを見つけました。

xor ax,ax
mov [si+0x4],ax
inc ax
mov [si-0x1],al
mov [si+0x2],ax
mov word [si],0x10
mov ebx,[0x7c5c]
mov [si+0x8],ebx
mov ebx,[0x7c60]
mov [si+0xc],ebx
mov word [si+0x6],0x7000
mov ah,0x42
int 0x13

このコードは、ステージ 1.5 コードのディスク アドレスを設定し、ロードして実行しようとしているようです。ただし、読み取ろうとしている物理ブロックをどのように特定できますか? さらに、ステージ 1.5 のコードの行き先は? 0x7000?

後続の起動コードが読み込まれる Windows 7 の MBR を参照します0x7c00。MBR が最初にアドレス にロードされたとすると、元のコードが破損した場合に備えて、0x7c00MBR を から0x7c00にコピーし0x0600、次に に分岐するコードが含まれています。0x0600ステージ 1.5 のコードをロード0x7000して元のコードと競合しますか? さらに、次のことも見つけました。

jmp short 0x65
nop
sar byte [si+0x7c00],1
mov es,ax
mov ds,ax
mov si,0x7c00
mov di,0x600
mov cx,0x200
cld
rep movsb
push ax
push word 0x61c
retf

MBR の先頭。最初の命令を除いて、コードは元の MBR を から0x7c00にコピーするために Windows 7 の MBR と同じことをしようとしているようです。これらのコードは実際に実行されますか? はいの場合、ここでジャンプを制御するのはいつですか。0x0600jmpjmp

4

1 に答える 1

5

GRUB 1.98はGRUBバージョン2です。バージョン2では、ステージ1.5はもうありません。ステージ1.5は、MBRと最初のパーティションの間に固定された場所がありました。それは(ほとんどの場合)ハードドライブ上の未使用のスペースでした。GPTパーティションおよびその他の(通常とは異なる)レイアウトでは、このスペースは提供されません。

GRUB v2では、ステージ1はcore.imgをロードします。これは、LBA48の任意の場所(通常はMBRと最初のパーティションの間)に保存できますが、パーティション内に保存することもできます。GPTの非EFIの場合は、カスタムパーティションを作成する必要があります。場所はステージ1に配線されています。

参照:http ://www.gnu.org/software/grub/manual/grub.html#Images

于 2012-07-29T00:54:23.417 に答える