2

Russell LibbyによるDisAsm32を使用すると、プロシージャ/関数/メソッドを逆アセンブルするには、(一貫性のある)ポインタをに渡すだけprocedure TDisAsm.Disassemble(Address: Pointer; Size: Cardinal = 0);です。

これまでのところ、ロードされた外部モジュール(BPL / DLL)からでも、適切にエクスポートされていれば、任意のプロシージャ/メソッドを分解することができました。

現在のプロセス(WindowsローダーによってロードされたEXEイメージ)から、エントリポイントへの有効なポインターを取得したいと思います。

IDR (Interactive DelphiCompiler)が提供するコードビューアタブに似たものを考え出したいのですが、Exeを実行しているインスタンス自体からです。

ここに画像の説明を入力してください

どのようにそれを行うことができますか?私は当分の間、PE構造にあまり慣れていません(しかし、私は努力しています、私を信頼します)、そしてそれらが目的に関連しているかどうか疑問に思います。

4

2 に答える 2

1

PE構造の読み取り/書き込みについては、オープンソースのJEDIライブラリJCLを参照してください。例: http ://www.koders.com/delphi/fid38455E3CFDAF1F38C48DA3A295034E7015A4D01E.aspx?s = zip#L1810

実行中のインスタンスのエントリポイントは「System.MainInstance」ですか?

于 2012-05-08T11:58:54.363 に答える
1

私自身の答え:

私は次のように実用的な解決策を思いついた

function TForm1.GetEntryPoint: Pointer;
var
  DosHeader: PImageDosHeader;
  NtHeaders : PImageNtHeaders;
  OptionalHeader: PImageOptionalHeader;
begin
  DosHeader := PImageDosHeader(HInstance + 0);
  NtHeaders := PImageNtHeaders(HInstance + Cardinal(DosHeader^._lfanew));
  OptionalHeader := PImageOptionalHeader(Cardinal(NtHeaders) + SizeOf(DWORD) + IMAGE_SIZEOF_FILE_HEADER);
  //
  Result := Pointer(HInstance + OptionalHeader^.AddressOfEntryPoint);
end;

サイドノート:

SysInit.HInstanceと同じSystem.MainInstanceです:それはより多くのC / C ++に聞こえ、その場合により意味があると思うので、私の好みはそれを選びます。

DisAsm32は、EntryPointから逆アセンブルするときに命令を超えcall @Halt0ます。これは、関数/プロシージャ/メソッドを逆アセンブルするように設計されており、ret命令を終了と見なします。

それの教訓:

BeaEngineのような他のもっと魅力的な逆アセンブラを探して、ボールを転がし続けます。

于 2012-05-09T16:27:17.667 に答える