15

私は最近、MBR のコードを変更する必要があることを発見した電気技師です。基本的に、OS が起動して引き継ぐ前に、HDD でコードを実行する機能が必要です。

これはアセンブリで記述する必要があり、MBR に 446 バイト程度のコード空間があることを十分に理解しています。MBR の外部で他のコードを呼び出すことを期待しています。私の質問は、MBR に書き込む最良の方法は何ですか? たとえば、ディスク HDD_1 の MBR を変更したい場合は、HDD_1 を別のマシンにスレーブしてから書き込みを行うか、現在のマシンで (ウィンドウの外部で) 直接書き込む方がよいでしょうか。基本的に、呼び出しを挿入し、MBR の残りの部分はそのままにしておくことにします。

任意の提案をいただければ幸いです

クリス

大変なことになるのは十分承知しております。私の質問は、MBR に命令を入れる最良の方法は何ですか? Windows がディスクへの直接アクセスを許可していないことは言うまでもありません。MBR に指示を書き込む方法を教えてください。おそらく *nix のライブ CD を起動し、そこから MBR に書き込みますか?

4

11 に答える 11

20

ドライブのブート セクタへの書き込みにはさまざまな方法があり、自作 OS 開発を実験していたときに使用した一般的なリファレンスがあります: http://wiki.osdev.org/

私は個人的にLinuxで起動し、ddを使用します:

  1. 最初にバックアップ

    dd if=/dev/sda of=~/windows_bootloader.bin bs=512 count=1

  2. ブートローダーを分解する

    ndisasm -b16 -o7C00h ~/windows_bootloader.bin > ~/windows_bootloader.asm

  3. 修正を加えて再組み立てする

    nasm ~/windows_bootloader.asm -f bin ~/modified_bootloader.bin

  4. ブートローダーを上書きする

    dd if=~/modified_bootloader.bin of=/dev/sda bs=512 count=1

これは、「sda」が正しいブロック デバイスであることを前提としています。また、ステップ 4 はファイルを /dev/sda にコピーするだけではないことに注意してください (コピーすることはできますが、出力バイナリが 512 バイトを超える場合は、最初のセクター以上を上書きする可能性があります)。

ライブ システムでこのアプローチをデバッグしたくないことは明らかです。bochs、qemu、VMWare Server などのある種の x86 エミュレーターを使用すると、頭痛の種を大幅に減らすことができます。

ただし、Michael Burr が述べているように、これはおそらく悪い考えです。Windows ブートローダーを変更すると、おそらく独自のコードを作成する余地がほとんどまたはまったくなくなります。

于 2009-02-20T09:16:02.060 に答える
9

BIOSは、各ブートデバイスの最初のセクター(512バイト)を読み取り、特定の署名バイトのセットをチェックすることにより、ハードドライブ(またはフロッピードライブ)からコンピューターをブートします。それらのバイトが見つかると、512バイトのセクターが(特定の位置にある)RAMにコピーされ、BIOSがジャンプして実行します。

それ以外の場合、署名バイト、セクター内の446バイトをブートプログラムとして使用できますが、ブートプログラムはそのセクターに完全に適合する必要があります。446バイトはそれほど大きくないため、BIOS呼び出しを行って、他のセクターをハードドライブ(またはフロッピードライブなど)からRAMにコピーして実行する必要があります。

プログラムを実行するのに十分な量のRAMをロードしたら、それにジャンプして、準備が整います。

これが、オペレーティングシステムが文字通り「独自のブートストラップによって自分自身を引き上げる」方法です。

http://en.wikipedia.org/wiki/Master_boot_recordを参照してください

さて、CまたはC ++(または他のほとんどのもの)でブートコードを記述できなかった理由はありませんが、アセンブリを使用すると、生成されるコードが正確にわかり、BIOS呼び出しを簡単に行うことができます。

プログラムをディスクからRAMにロードし、プログラムの開始アドレスにジャンプする512バイトのディスクドライブをRAMコピー機に書き込むことをお勧めします。その後、任意の言語でプログラムを作成できます。ブートコードの実行が開始されると、RAMのように信頼できるのはこれらの512バイトだけであることに注意してください。(BIOSはBIOS呼び出しを行うことができます。BIOSはRAM内の特定の場所にもシステム情報を配置します...)そのセクター外で作成した関数を呼び出したい場合は、次のことを行う必要があります。それらを自分でRAMにロードします。

また、コードをテストする最も簡単な方法は、おそらくフロッピーディスクにコードを入れて起動することです。

元の質問に答えるために、古いMBRのバックアップコピーをどこかに保存し、新しいMBRで関数をRAMにロードして実行し、次に元のMBRをロードして実行すると、ウィンドウの起動を続行できます。

また、Michael Burrは正しいです。あなたがやりたいことを成し遂げることは、悪夢になるでしょう。

これを実際にハードドライブに書き込む方法についてのコメントに答えて、ディスク上のセクターにコピーできる「生の書き込み」プログラムがいくつかあります。また、Linux Live CDから起動し、ddを使用して、選択したブロックデバイス上の選択したセクターにデータを書き込むこともできます。-その部分をパイのように単純です。

于 2009-02-20T05:15:15.507 に答える
5

基本的に、電話を入れて残りのMBRはそのままにしておくと思います

このサブルーチン呼び出しによって何が呼び出されますか?その時点でメモリ内にある唯一のコードは、MBRまたはROMにあるものです。

あなたが本当にこれを必要とするのか、それともあなたがそれに多くの時間を費やす前にそれがより良い選択肢がないのかを慎重に考えてください。MBR(OSローダーがそこに配置するMBR以外)に書き込まれたサードパーティのコードは、次の理由でユーザーに受け入れられないことがよくあります。

  • ウイルス対策プログラムは、ウイルスがマシンを制御するために使用した手法であるため、疑わしいコードとしてフラグを立てることがよくあります。
  • プログラムは、自分自身をMBRに挿入し、追加のコードとデータをディスクの「予約済み」セクターに保存する手法を使用しています(MBRに保存できるものが実際にはあまりないため)。残念ながら、これらのセクターを実際に予約するための優れた標準的な方法がないため、この手法(コピー防止に使用されることもあります)により、ディスク上のデータ構造が破損する可能性があります(つまり、ドライブ上のすべてのデータがさようなら)。ユーザーは本当にそれを嫌います。ある時点で、Quickenはこのようなことを行い、かなり大きな反発に直面した保護スキームを使用したと思います。

したがって、この道を続けることにした場合は、慎重に踏み、頭痛に備えてください。

于 2009-02-20T05:25:46.730 に答える
4

Windows がディスクへの直接アクセスを許可しないのはなぜですか? CreateFile()の MSDN ページには、次のように書かれています。

ディスクまたはボリュームへの直接アクセスは制限されています。詳細については、ヘルプとサポートのナレッジ ベース ( http://support.microsoft. com/kb/942448

Windows Server 2003 および Windows XP/2000: ディスクまたはボリュームへの直接アクセスは、この方法では制限されません。

KB942448は制限を説明しており、十分な権限を持つプロセスが MBR またはパーティション ブート セクターに書き込むことを許可しているようです。

于 2009-02-20T06:48:21.010 に答える
2

MBRを作成する必要がありますか?パーティションのあるディスクの場合、パーティションのVBR(ボリュームブートレコード)を変更することもできます。MBRに触れる必要がなく、テストパーティションを完全に破棄した場合でも、マシンは他のパーティション(およびOS)から起動できるため、これはより簡単で安全な場合があります。

于 2012-10-30T10:30:10.303 に答える
2

私は役立つかもしれない同様の質問を見つけました:

WindowsのMBRを変更する

ただし、何をする予定かについて詳しく説明することをお勧めします。私が自分自身を知ったように、ブートローダーコードは操作するのが非常に面倒な場合があります。また、可能であればフロッピーでこれをテストします。

これをすべてWindowsから実際に行う限り、私は少し無知です。これまでの私のプログラミング経験のほぼすべては、Unix環境下でした。

于 2009-02-20T05:18:28.340 に答える
2

実際のパーティションをいじりたくない場合はnasm、コンパイル、ddクラスターのコピー(MBRも意味します)、さらにはブートローダーメニュー(たとえば)を使用するのが最善の方法だと思います。lilo

昨年、自分のブートシーケンスを作らなければなりませんでした。基本的に、私はこれを持っていました:

LILO boot menu:
    -> WindowsXP
    -> linux

実際のインストールに影響を与えることなく、MBR で個別に何かをしたかったので、新しい (小さい) パーティションを作成し、それを LILO リストに追加しました (ここでは詳細を省略します)。これにより、次のようになりました。

LILO boot menu:
    -> WindowsXP
    -> linux
    -> TESTMBR

そうすれば、すべてのパーティションにも独自の MBR があるため、自分自身をロックアウトする危険を冒すことなく (これを修正するのは少し面倒です)、好きな奇抜なコードをそこに入れることができます。

その MBR を実際に変更するには、次のようにしました。

  1. 実際の MBR をバックアップします。dd if=/dev/sda3 of=/home/you/mbr−backup count=1
  2. ファイル内のコードを編集: boot.asm
  3. nasm でコンパイル: nasm boot.asm -o boot.bin -f binif エラーの修正
  4. 新しく作成した MBR をドライブにコピーします。dd if=boot.bin of=/dev/sda3
  5. リブート。
  6. メニューで TESTMBR を選択します。
  7. それがどうなるか見てください。

確かに、ここで行ったようにパーティションの MBR ではなく、ドライブの MBR で直接行うこともできますが、私の場合はそれがより実用的でした。

実際の MBR からのコード ジャンプに関しては、ディスク上のクラスターをロードするINT 13,42割り込みを使用する必要があります。私のテストの目的のために、その内容を表示する必要がありましたが、必要に応じて詳しく見ることができます。

お役に立てれば幸いです。長い返信で申し訳ありません。

于 2010-04-15T12:42:56.620 に答える
2

MS コマンド プロンプトで起動するフロッピー、CD、またはメモリ スティックを作成でき、対応するバージョンの MS デバッグがあれば、以下のように MBR を読み書きできます。win95 または win98 を実行しているマシンは、ブート フロッピーを作成できるはずです。windows\command ディレクトリからフロッピーにデバッグをコピーするだけです。

内部デバッグ: r コマンドを使用して、レジスタ値を変更します。ax を読み取りの場合は 0201 に、書き込みの場合は 0301 に設定します。es:bx を、使用するメモリ (バッファ) の開始アドレスに設定します。0000:7C00 は、通常、ブート プロセスで次のセクターが読み取られる領域であるため、機能する可能性があります。cx を 0001 に設定して、512 バイトの 1 セクタを読み書きします。最初の物理ハード ドライブの dx を 0080 に設定します。

「a」コマンドを使用して、1 行のコードを組み立てます: INT 13h

「p」コマンドを使用して続行します。選択した AX に基づいて、データの読み取りまたは書き込みが行われます。

「n」でファイルに名前を付け、「w」でファイルを書き込み、次に他のプログラムでmbrのコピーを編集して、メモリに読み込むことができます。完了したら、debug の「n」と「L」を使用して、編集した MBR ファイルに名前を付けてロードし、ax= 0301h を使用して int 13h を呼び出して、イメージを正しいセクターに書き込みます。

于 2011-06-10T18:22:55.217 に答える
1

MBR の編集は、Windows(XP) 内から完全に可能です。これには HxD hex エディタが使用されるため、アクティブなシステム ドライブであっても、MBR に hex ファイルを文字通りコピー アンド ペーストできます (注意して使用してください! :)) http://mh-nexus.de/en/hxd/

開始点として、ソースが利用可能な MBR (たとえば Grub) を取得します。(ですから、grub に Windows への boto を実行させます) これで、MBR に変更を加えるための良い出発点ができました。この小さなソフトウェアは非常に基本的なものであるため、MBR の編集はそれほど難しくありません。ただし、ある程度の 16 ビット (DOS) アセンブラーのスキルが必要です。もう 1 つの方法は、MBR をまったく変更せずに grub に追加のペイロードを実行させることですが、これが可能かどうかは 100% 確信しています。Grub のマニュアルを参照してください。

于 2010-04-15T12:12:09.383 に答える
1

GRUBを調べることができます。私は決して MBR コードの専門家ではなく、*nix OS を実行してから長い時間が経ちましたが、ブートローダーが段階的に機能し、OS が起動する前にディスクから段階をロードしたことを覚えています。OS をロードしてから OS を起動する前に必要な作業を行う独自のステージを作成できます。このオプションがどれほど実用的かはわかりません。特に、ドキュメントによると「レガシー」バージョンが保守不可能であったためにコードが書き直されているように見えるためです。

于 2009-02-20T07:18:31.747 に答える
0

Windows には文書化されていないユーティリティ "debug" があり、これを使用すると、1) HDD の任意のセクター (mbr を含む) を RAM にロードできます。2)そのコードをバイナリまたはアセンブリとして表示します。3) ram でいくつかのコードを組み立てます。4) そのコードを任意のセクター (mbr にも) に書き込みます。このユーティリティを開始するには、コマンド プロンプトで debug と入力し、Enter キーを押します。プロンプトが「-」に変わり、「help」と入力します。使い方の説明を受けたり、

于 2015-02-15T11:53:45.320 に答える