私は現在、このエミュレーターのコアとして libemu を使用して、何よりも楽しみのためにコード エミュレーターを開発しています。
私が本当に達成したい唯一のことは、PE 全体をメモリにロードしてリッピングさせることです。
そこで、次の項目を含む小さな TODO リストを作成しました。
- ヘッダーを読む ◦ PE が有効かどうかを確認する (x86 プラットフォーム)
- 必要なデータを抽出してメモリ セグメントをセットアップする
- インポートしたすべての関数をカスタム API にフックします。
- EIP が正しく機能するように設定する
- スタック セグメントを構築します (esp と ebp を設定します)。
- Eflags を設定する
ほとんどの作業を 1 日で完了することができました。スタックセグメントを正しく設定することに問題があるようですが。現在、次のコード セグメントを使用してレジスタを設定しています。
/* Set Registers */
entry_point = pe->nt_header->AddressOfEntryPoint;
emu_cpu_eip_set(cpu, entry_point);
emu_cpu_reg32_set(cpu, eax, 0x00
emu_cpu_reg32_set(cpu, ecx, 0x00);
emu_cpu_reg32_set(cpu, edx, entry_point);
emu_cpu_reg32_set(cpu, ebx, 0x00);
emu_cpu_reg32_set(cpu, ebp, (0x0095f000 - 0x1000 / 2));
emu_cpu_reg32_set(cpu, esp, emu_cpu_reg32_get(cpu, ebp));
emu_cpu_reg32_set(cpu, esi, 0x00);
emu_cpu_reg32_set(cpu, edi, 0x00);
emu_cpu_eflags_set(cpu, 0x0000246);
問題はebpレジスタ内にあると考えています。値は奇妙に見えますが、PyEmu もそれらを使用しているようです。問題がスタックの使用にあると私が考える理由は、最初にハードコードされていることと、クラッシュするコードが 00692D67 に変換される 83 65 f8 00 であり、アセンブラーで dword ptr [ebp-8], 0 であることです。
PEファイルはNTLoaderを使ってスタックが設定されていると思います。しかし、私はそれまたはこれに関するドキュメントを見つけることができないようです。
続行する方法についての指針があれば、本当に感謝しています。
- ロビン
ps。回答の可能性を高めるために、これをいくつかのボードなどにクロス投稿しました。PE ファイルのロードに関する多くの古い Windows ドキュメントを読みましたが、それらはすべてヘッダーの SP セグメントを指しているだけです。しかし、それは ESP ではないので、スタックのベース (EBP) であるとは思えません。
1 つの相互投稿は OpenRCE にあります: http://www.openrce.org/forums/posts/2171もう 1 つの相互投稿 は SysInternals にあります: http://forum.sysinternals.com/topic28898_post138041.html# 138041