ソフトウェア開発 Win32プログラミング

ImageDirectoryEntryToDataの代わり

戻る


このページでは、 dbghelp.dllやimagehlp.dllのImageDirectoryEntryToData関数を使わずにインポートテーブルを取得する方法を解説する。

与えられたモジュールのインポートテーブルを取得する簡単な方法は、dbghelp.dllのImageDirectoryEntryToDataを使って次のようにするのが一般的な方法である。

#include <dbghelp.h>
 
#pragma comment(lib, "dbghelp.lib")

PIMAGE_IMPORT_DESCRIPTOR
GetImageImportDescriptor(HMODULE hmodCaller, LPDWORD pdwSize)
{
    return (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(
        hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, pdwSize);
}

だが、ImageDirectoryEntryToDataを使わない方法というのもある。次の通り。

PIMAGE_IMPORT_DESCRIPTOR WONAPI WonGetImportDescriptor(HMODULE hModule)
{
    PIMAGE_NT_HEADERS pNtHeaders;
    PIMAGE_OPTIONAL_HEADER pOptionalHeader;
    PIMAGE_DATA_DIRECTORY pDirectory;
    UINT_PTR Address;
    LPBYTE pb = (LPBYTE)hModule;
 
    if (pb[0] == 'M' && pb[1] == 'Z')
    {
        PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
        pNtHeaders = (PIMAGE_NT_HEADERS)(pb + pDosHeader->e_lfanew);
    }
    else
    {
        pNtHeaders = (PIMAGE_NT_HEADERS)hModule;
    }
 
    pOptionalHeader = &pNtHeaders->OptionalHeader;
    pDirectory = &pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
    Address = pDirectory->VirtualAddress;
 
    if (!Address)
        return NULL;
 
    return (PIMAGE_IMPORT_DESCRIPTOR)((PBYTE)hModule + Address);
}

DOSヘッダがあれば、スキップして、NTヘッダの位置を取得する。次にNTヘッダの中のオプショナルヘッダを見つけて、その中のインポートに関するデータディレクトリから仮想アドレスを取得する。その後、モジュールに仮想アドレスの値を加算してインポートテーブルのアドレスを取得する。

この方法なら、dbghelp.dllなどを再配布する必要がない。


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system