現在、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 のセットアップを含む) に入り、そこにジャンプするブートローダーを作成します。同等のコードを書いたことがないので、これが機能するかどうかさえわかりません。
これまで見逃していたこのプログラムを実行するための他のオプションはありますか? または、上記のアイデアに関する提案、追加、または経験はありますか?