1

Windows XP 環境で fasm を学習しているときに fasm のソース コードを読んでいると、invoke マクロが見つかりました。

invoke  MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK

そしてインポートマクロ。

import user,\
     MessageBox,'MessageBoxA',\
     wsprintf,'wsprintfA'

しかし、MessageBoxA のハードコーディングされたアドレスも、アセンブリ コードでの user32.dll の読み込みも見つかりませんでした。アドレスではなく文字列にラベルを付けるマクロ定義のみがあります。

私の仮定はこれです

  1. user32.dll をロードし、ロードされた dll の開始アドレスを返すコードがあります => ここで、返されたアドレスをロケーション A に呼び出しましょう

  2. ハードコーディングされたアドレスとラベルのペアがあります (例: MessageBoxA = 0x00000000)

  3. したがって、命令「call」は MessageBoxA ラベルを呼び出すことができます (位置 A + MessageBoxA オフセットに変換されます)。

私の仮定は間違っていますか?API はどのように呼び出されるのだろうか。

ありがとう

4

2 に答える 2

1

FASM のドキュメントを読んでください。user32.dllで がどのようMessageBoxA()に参照されているかが説明されています。

次に、 Windows 実行可能ファイルが実際にどのように機能するかについて、MSDN のドキュメントをお読みください。PE ファイルのインポートに関するセクションに特に注意してください。このセクションでは、インポートされた DLL 関数のアドレスが実行時にどのように解決されるかを説明しています。

簡単にimport言うと、FASM のステートメントは、コンパイルされた EXE ファイル内のルックアップ テーブルにエントリを設定しています。次に、コードの実行が開始される前に EXE がメモリに読み込まれると、OS はそのルックアップ テーブルに入力します。

于 2012-12-26T03:42:32.770 に答える
0

これは、無料の Dependency Walker ツールのスクリーン ショットです。

注: 関数名、序数、およびエントリ ポイントがあります。

そうです、あなたが推測したことはほとんどそれです。関数は、コンパイル時ではなく実行時にリンクされます。(DLL ダイナミックリンクライブラリ)。

ここに画像の説明を入力

于 2012-12-26T03:36:18.327 に答える