2016-11-15 4 views
0

私の目標は、内部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を参照してください)。

ここに私のデバッグセッションのスクリーンショットがあります。 enter image description here

UPDATE:

たぶん0x0000FFFFは、DLLが依存関係を持っていないことを意味?

私はを見たことがあります。依存関係ウォーカーの依存関係はありません。このDLLには何もインポートされていないようです。

答えて

2

あなたのスクリーンショットからは、importTableを指してimageBase(つまり、IMAGE_DOS_HEADER)です。 header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0 - この状態を結果とエラーとしてチェックしていないときに発生します。

api-ms-win-crt-locale-l1-1-0.dllDataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]はゼロです。必要なチェック - 処理前にインポートが存在する

+0

これは、 'DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT]'がゼロの場合にのみ、DLLにインポートがないことを意味しますか?そのモジュールにインポートがないことを確認するにはどうすればよいですか? –

+0

@DmitryKatkevich - はい、あなたは正確に 'DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT]'をチェックする必要があります - VirtualAddressは!= 0でなければならず、Size == 'sizeof(IMAGE_IMPORT_DESCRIPTOR)* n;' n> 0 – RbMm

関連する問題