私は最近、新しい母国語の作成を検討しています。私は PE 形式の (非常に) 基本を理解しており、Web からかなり親切なインターフェイスを備えたアセンブラーを入手しました。これを使用していくつかの単純な関数を実装することに成功しました。しかし、ライブラリの関数を使用すると問題が発生しました。以前に動的にコンパイルされた関数からライブラリ関数を呼び出す唯一の方法は、関数ポインターを手動で渡すことでした。これは、PE ファイルを作成して独自のプロセスで実行する場合にはできません。現在、CRT を使用する予定はありませんが、独自の標準ライブラリを実装するには、Win API にアクセスする必要があります。PE ローダーがパッチを適用できるように、WinAPI 関数への参照を生成するにはどうすればよいですか?
2 に答える
インポート テーブルを作成する必要があります。これは基本的に、アプリケーションで使用したい関数名のリストです。PE ヘッダーによってポイントされます。ローダーは DLL ファイルをプロセス メモリ空間にロードし、要求された関数をエクスポート テーブルで見つけて、そのアドレスをインポート テーブルに残します。その後、通常はその場で逆参照しjmp
ます。
詳細と asm の例については、Izelion のアセンブリ チュートリアルを参照してください。
アセンブリの代わりに C を発行することから始めてみませんか? 次に、ASM への直接書き込みは単なる最適化です。
私は冗談ではありません。ほとんどのコンパイラは、最終的なネイティブ コードが渡される前に、ある種の中間コードを生成します。
null で区切られたすべてのリグマロールから逃れようとしていることは理解していますが、とにかく WinAPI 関数にはそれが必要です。
質問を読み直すと、LoadLibrary() を呼び出してから GetProcAddress() を呼び出し、呼び出しを設定することで WinAPI 関数のアドレスを取得できることがわかります。
純粋なアセンブリからこれをブートストラップする方法を確認したい場合: 古い SDK には ASM サンプル コードがありましたが、おそらく新しいものにはまだあります。そうでない場合は、DDK が行います。