私の目標は、内部LoadLibrary呼び出しをフックするためにDllのインポートテーブルを手動で入力することです。ここでDLLインポートテーブルを手動で入力します。IMAGE_IMPORT_DESCRIPTORのNameフィールドに0x0000FFFFが格納されます。
はの依存性を階層内の各DLLの再帰的にインポート表に記入し、私のコードであり、この場合、いくつかのDLL(API-MS-WIN-CRT-ロケール-l1-1-0.dll除いて正常に動作します)。
void PEUtility::fillImportTable(HMODULE loadedModule, FillImportFlag flag, std::function<void(HMODULE&)> callback)
{
std::stack<HMODULE> modules;
modules.push(loadedModule);
while (modules.size())
{
auto module = modules.top();
modules.pop();
auto imageBase = (DWORD_PTR)module;
auto header = ImageNtHeader(module);
auto importTable = (PIMAGE_IMPORT_DESCRIPTOR)(DWORD_PTR)(header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + imageBase);
while (importTable->OriginalFirstThunk)
{
// !!!
// HERE I've got an error: importTable->Name stores 0x0000FFFF instead dll name
// !!!
auto importedModuleName = (char*)(DWORD_PTR)(importTable->Name + imageBase);
auto importedModule = GetModuleHandleA(importedModuleName);
if (!importedModule)
{
importedModule = LoadLibraryExA(importedModuleName, 0, DONT_RESOLVE_DLL_REFERENCES);
if (flag == FillImportFlag::Recursive)
modules.push(importedModule);
}
auto nameAddressPtr = (PIMAGE_THUNK_DATA)(DWORD_PTR)(importTable->OriginalFirstThunk + imageBase); //Import Lookup Table address (functions names)
auto functionAddressPtr = (PIMAGE_THUNK_DATA)(DWORD_PTR)(importTable->FirstThunk + imageBase); //Import Address Table (IAT) address (functions addresses)
while (nameAddressPtr->u1.Function)
{
FARPROC importedFunctionPtr = NULL;
if (nameAddressPtr->u1.Ordinal & IMAGE_ORDINAL_FLAG)
{
importedFunctionPtr = GetProcAddress(importedModule, MAKEINTRESOURCEA(nameAddressPtr->u1.Ordinal));
}
else
{
auto impotByNameImage = (PIMAGE_IMPORT_BY_NAME)(DWORD_PTR)(nameAddressPtr->u1.AddressOfData + imageBase);
importedFunctionPtr = GetProcAddress(importedModule, (char*)impotByNameImage->Name);
}
if (importedFunctionPtr)
{
auto oldProt = 0ul;
VirtualProtect(functionAddressPtr, sizeof(IMAGE_THUNK_DATA), PAGE_EXECUTE_READWRITE, &oldProt);
functionAddressPtr->u1.Function = (DWORD_PTR)importedFunctionPtr;
}
nameAddressPtr++;
functionAddressPtr++;
}
importTable++;
}
// HERE in callback I hook LoadLibrary & RegQueryVAlue calls if 'module' has such dependencies
callback(module);
}
}
問題はIMAGE_IMPORT_DESCRIPTOR
構造店0x0000FFFF
の代わりに、DLL名のName
分野です。
私の質問はどのように解決できますか? 0x0000FFFF
の意味は?おそらく、これはいくつかの「特別な」モジュールです(下記スクリーンショットの api-ms-win-crt-locale-l1-1-0.dllを参照してください)。
ここに私のデバッグセッションのスクリーンショットがあります。
UPDATE:
たぶん0x0000FFFFは、DLLが依存関係を持っていないことを意味?
私はを見たことがあります。依存関係ウォーカーの依存関係はありません。このDLLには何もインポートされていないようです。
これは、 'DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT]'がゼロの場合にのみ、DLLにインポートがないことを意味しますか?そのモジュールにインポートがないことを確認するにはどうすればよいですか? –
@DmitryKatkevich - はい、あなたは正確に 'DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT]'をチェックする必要があります - VirtualAddressは!= 0でなければならず、Size == 'sizeof(IMAGE_IMPORT_DESCRIPTOR)* n;' n> 0 – RbMm