2

現在、x86 unpaged protected mode用にビルドされているように見えるプログラム (〜 30KB、ほとんどがコード) をリバース エンジニアリングしようとしています。これには、物理​​メモリ (より正確にはメモリ マップド デバイス レジスタ) に直接アクセスする命令が含まれています。

mov esi, 0FED400000h ; Some device base address
mov eax, [esi+18h]   ; Memory mapped status register of said device

上記のプログラムをQEMUで実行し、理想的には gdb などのデバッガーでステップ実行できるようにしたいと考えています。

ここでの問題は、コードでエンコードされた絶対メモリ アドレスにより、ページングが有効になっているオペレーティング システムでセグメンテーション違反が発生することです。

私はこれを回避する方法を考えてきました:

  • /dev/mem で mmap を使用して物理メモリをユーザー空間にマップし、ユーザー空間でプログラムを実行します。これにより物理メモリへのアクセスが可能になりますが、マップされたアドレスが物理アドレスと同じではないため、分析されたプログラムのハードコードされたメモリ アドレスにパッチを適用する必要があります。これは、エンコードされた絶対アドレスが大量にあるため、ほとんど実行できないようです。
  • アドレスを書き換えることで不正なメモリ アクセスを修正しようとするセグメンテーション フォールト ハンドラをインストールします。次に、ユーザー空間でプログラムを実行します。
  • プログラム コードをディスクからメモリにロードし、保護モード (GDT のセットアップを含む) に入り、そこにジャンプするブートローダーを作成します。同等のコードを書いたことがないので、これが機能するかどうかさえわかりません。

これまで見逃していたこのプログラムを実行するための他のオプションはありますか? または、上記のアイデアに関する提案、追加、または経験はありますか?

4

1 に答える 1

1

私が見たいくつかの SINIT モジュールには、モジュールの最後に埋め込まれたプレーンな PE ファイルを解析してジャンプするエントリに小さなリアルモードローダー部分があります。そのため、ローダーをデバッグする必要がない場合は、PE を抽出し、PE ファイルをサポートする DOS エクステンダ (HX-DOS、WDOSX など) のいずれかを使用して、DOS からロードおよびデバッグできます。ただし、モジュールが実行されて CLOSE-PRIVATE コマンドが発行されると、プライベート TXT レジスタにアクセスできないことに注意してください。

ところで、0xFED40000 の範囲は Intel の内部 TPM (iTPM) に属しているようです。tpm_tisLinux のドライバーを参照してください。そのため、代わりにこれらのアクセスを (シグナル/例外ハンドラーを使用して) インターセプトし、実際の TPM にリダイレクトすることができます。

于 2013-07-03T23:09:22.480 に答える