2016-11-15 38 views
0

我的目標是填補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下面的屏幕截圖)?

這裏是我的調試會話的截圖。 enter image description here

UPDATE:

也許0x0000FFFF意味着DLL沒有依賴關係?

我已經看了API-MS-雙贏CRT-語言環境l1-1-0.dll依賴關係Dependency Walker中,似乎這個dll無關的進口。

回答

2

從您的屏幕截圖清除視圖importTable指向imageBase(即IMAGE_DOS_HEADER)。發生這種情況時header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0 - 你不檢查此條件下,結果和錯誤

api-ms-win-crt-locale-l1-1-0.dll根本沒有進口 - DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]爲零。需要檢查 - 在導入過程之前存在,

+0

,這是否意味着DLL沒有進口,當且僅當'DataDirectory目錄[IMAGE_DIRECTORY_ENTRY_IMPORT]'是零?如何最好地檢查該模塊沒有導入? –

+0

@DmitryKatkevich - 是的,你到底需要檢查'DataDirectory目錄[IMAGE_DIRECTORY_ENTRY_IMPORT]' - 其VirtualAddress必須= 0,大小=='的sizeof(IMAGE_IMPORT_DESCRIPTOR)* N;!'其中n> 0 – RbMm