1

フラット アセンブラーによってコンパイルされたアセンブリ プログラムをテストしています。インポート テーブルを変更する必要があるため、実行するobjdumpと、プログラムが呼び出そうとしている外部関数を確認できます。

だから、私はから始めます:

format PE GUI
section '.flat' readable writeable executable

MS dll でいくつかの関数を呼び出していますが、インポート テーブルが間違っています。

これは、2 つの dll と関数を含める方法を示す簡単な部分です。

;user32

    _MessageBoxA           dw $0

                   db 'MessageBoxA', $0

    kernel32_name db 'kernel32.dll', $0

    user32_name   db 'user32.dll', $0

外部関数をインポート テーブルに表示するには、アセンブリ プログラムで何を行う必要がありますか?

4

1 に答える 1

1

インポート テーブルは、インポート記述子の 0 で終わる配列であり、ヘッダーのデータ ディレクトリのインポート ディレクトリ フィールドは最初の項目を指します。

struct ImportDescriptor   // size = 20 bytes
{
    dword ILTRVA;         // RVA to Import Lookup Table
    dword Timestamp;      // you can usually ignore
    dword ForwarderChain; // these two
    dword DllNameRVA;     // RVA to 0-terminated dll name
    dword IATRVA          // RVA to Import Address Table
}

ILT と IAT は異なる場所にある必要がありますが、相互にコピーされている必要があります (必ずしもそうとは限りませんが、これは通常のことです)。IAT は、インポートされた関数へのポインターを保持するものです。どちらも RVA から関数名までの 0 で終わる配列です。関数名は、「ヒント」語と 0 で終わる ASCII 文字列で構成されます。ヒント ワードは 0 にすることも、その関数の元の DLL のエクスポート テーブルにあるその関数の実際のインデックスにすることも、ランダムな値にすることもできます。これは単なるヒントです。

于 2013-03-19T18:32:15.900 に答える