我的目標是填補DLL的導入表,以勾內部調用LoadLibrary調用手動(當你加載庫可能加載其內部的DllMain另一個庫)。填寫手動DLL導入表:IMAGE_IMPORT_DESCRIPTOR的名稱字段存儲0x0000FFFF
這裏是我的代碼填寫在導入表遞歸的依賴條件層級中的每個DLL和除了一些dll文件,它工作正常(API-MS-雙贏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-雙贏CRT-語言環境l1-1-0.dll下面的屏幕截圖)?
UPDATE:
也許0x0000FFFF意味着DLL沒有依賴關係?
我已經看了API-MS-雙贏CRT-語言環境l1-1-0.dll依賴關係Dependency Walker中,似乎這個dll無關的進口。
,這是否意味着DLL沒有進口,當且僅當'DataDirectory目錄[IMAGE_DIRECTORY_ENTRY_IMPORT]'是零?如何最好地檢查該模塊沒有導入? –
@DmitryKatkevich - 是的,你到底需要檢查'DataDirectory目錄[IMAGE_DIRECTORY_ENTRY_IMPORT]' - 其VirtualAddress必須= 0,大小=='的sizeof(IMAGE_IMPORT_DESCRIPTOR)* N;!'其中n> 0 – RbMm