2016-05-31 5 views
0

インポートアドレステーブルを再構築中:コードのHMODULEハンドルエラーIが午前問題はこのように述べているIAT

バッドボーイライン:

HMODULE handle = (HMODULE)pLoadLibraryA((LPCSTR)(codeBase + importDesc->Name)); 

を私は非静的ハンドルを使用している場合、私はこれを取得します出力: http://paste.ofcode.org/33Lp6qsTmCAnsknebx2XRfs

大きな出力であるが、それはのための機能をミス: (ijl11.dll & libcef.dll)

私は試してみました:

私は、HMODULEのハンドルを "グローバル"にすると、良い出力ですが、2つのDLLの出力がありません。

私は、HMODULEを "機能にローカル"のハンドルにすると、良い出力ですが、2つのdllがありません。

私は、 "FORループのローカル"のハンドルを作る場合、良い出力が2つのdllがありません。


コードのバッドボーイライン:

static HMODULE handle = (HMODULE)pLoadLibraryA((LPCSTR)(codeBase + importDesc->Name)); 

私がハンドルを作る場合、私は、この出力を得るだろう「静的」:「静的」として http://paste.ofcode.org/VDYRrnL8jNa7HbsQgNdAEM

出力が不足して私に2を与えますDLLの機能。

質問:静的を使用すると、2つの欠落しているdll関数の出力が表示されるのはなぜですか?非静的を使用しても正しい出力が得られません。

また、なぜ両方の方法を併用すると、私が探している出力が得られるのでしょうか?

結論私はこれまでのところ: ハンドルには何かが続いています。

しかし、非静的な使用は私に大きな出力を与え、静的な使用は私には駄目な出力を与えますが、私に2つの欠落したDLLのインポート関数の出力を与えます。

私はそれを取得しません。誰か説明してもらえますか?

コード:

// Custom Module Struct 
typedef struct 
{ 
    PIMAGE_NT_HEADERS NT_Headers; 
    unsigned char *codeBase; 
    HMODULE *modules; 
    int numModules; 
    int initialized; 
} MEMORYMODULE, *PMEMORYMODULE; 

    //HMODULE handle; 
    int BuildImportTable(PMEMORYMODULE module) 
    { 
     int result = 1; 
     //HMODULE handle; 

     unsigned char *codeBase = module->codeBase; 
     PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_IMPORT); 

     printf("Directory Size: %d\n", directory->Size); 
     if (directory->Size > 0) 
     { 
      PIMAGE_IMPORT_DESCRIPTOR importDesc = (PIMAGE_IMPORT_DESCRIPTOR)(codeBase + directory->VirtualAddress); 

      // Check Each Import Descriptor 
      for (; !pIsBadReadPtr(importDesc, sizeof(IMAGE_IMPORT_DESCRIPTOR)) && importDesc->Name; importDesc++) { 

       // loop scope     
       PIMAGE_THUNK_DATA thunkILT; 
       PIMAGE_THUNK_DATA thunkIAT; 

       // Load Each Library By Name 
       printf("\n\n\n[BuildImportTable]: Trying To Load: %s\n", codeBase + importDesc->Name); 
       static HMODULE handle = (HMODULE)pLoadLibraryA((LPCSTR)(codeBase + importDesc->Name)); 
       if (handle != NULL){ 
        printf("[BuildImportTable]: Loaded: %s\n", codeBase + importDesc->Name); 
       } 

       if (handle == INVALID_HANDLE_VALUE) { 
        result = 0; 
        printf("[BuildImportTable]: Handle NULL\n"); 
        break; 
       } 

       //// Build Out Module Structure Members 
       //HMODULE *p = (HMODULE*)MemRealloc(module->modules, (module->numModules + 1) * (sizeof(HMODULE))); 
       //module->modules = p; 
       //if (module->modules == NULL) { 
       // result = 0; 
       // printf("[BuildImportTable]: Modules NULL\n"); 
       // break; 
       //} 

       //// Store Allocated Library 
       //module->modules[module->numModules++] = handle; // Load Library Handle 

       // OriginalFirstThunk - Names are stored in ILT.    
       if (importDesc->OriginalFirstThunk) {    

        // Get RVA of the Import Lookup Table (ILT) 
        thunkILT = (PIMAGE_THUNK_DATA)(importDesc->OriginalFirstThunk); 
        if (thunkILT == NULL) { printf("[BuildImportTable]: thunkILT RVA NULL\n"); continue; } 

        // Get VA to (ILT) 
        thunkILT = (PIMAGE_THUNK_DATA)(codeBase + importDesc->OriginalFirstThunk); 
        if (thunkILT == NULL) { printf("[BuildImportTable]: codeBase + thunkILT RVA NULL\n"); continue; } 

        // Offset Linear Address to get valid data 
        //thunkILT = (PIMAGE_THUNK_DATA)rvaToPtr((DWORD)thunkILT, module->NT_Headers, (DWORD)codeBase);    
       } 

       // FirstThunk - (i.e., the array of linear addresses built by the loader). 
       if (importDesc->FirstThunk){ 

        // The RVA of the Import Address Table (IAT) 
        thunkIAT = (PIMAGE_THUNK_DATA)(importDesc->FirstThunk); 
        if (thunkIAT == NULL) { printf("[BuildImportTable]: thunkIAT RVA NULL\n"); continue; } 

        // Get VA to (IAT). 
        thunkIAT = (PIMAGE_THUNK_DATA)(codeBase + importDesc->FirstThunk); 
        if (thunkIAT == NULL) { printf("[BuildImportTable]: codeBase + thunkIAT RVA NULL\n"); continue; } 
       } 

       while((thunkILT->u1.AddressOfData != 0) || thunkILT->u1.Ordinal != 0) 
       { 
        if (IMAGE_SNAP_BY_ORDINAL(thunkILT->u1.Ordinal)) { 

         // BY ORDINAL 
         printf("[BuildImportTable]: OLD thunkIAT->Function: 0x%08X\n", thunkIAT->u1.Function); 
         /*HMODULE hModule = GetModuleHandle((LPCSTR)(codeBase + importDesc->Name)); 
         if (hModule != NULL){*/ 
          thunkIAT->u1.Function = (DWORD)pGetProcAddress(handle, (LPCSTR)IMAGE_ORDINAL(thunkILT->u1.Ordinal)); 
          if (thunkIAT->u1.Function == NULL){ 
           printf("[BuildImportTable]: Procedure Not Found By Ordinal\n"); 
           printf("[BuildImportTable]: HMODULE: 0x%08X ERROR: %d\n", handle, GetLastError()); 
           thunkILT++; 
           break; 
          } 
          printf("[BuildImportTable]: NEW thunkIAT->Function: 0x%08X\n", thunkIAT->u1.Function); 
          printf("[BuildImportTable]: Ordinal: 0x%08X\n", thunkILT->u1.Ordinal); 
          thunkILT++; 
         //} 
         //else{ 
         // printf("[BuildImportTable]: HMODULE: 0x%08X ERROR: %d\n", hModule, GetLastError()); 
         // thunkILT++; break; } 

        } else { 

         // if statement scope 
         PIMAGE_IMPORT_BY_NAME NameData; 
         NameData = (PIMAGE_IMPORT_BY_NAME)(thunkILT->u1.AddressOfData); 
         if (NameData == NULL) { printf("[BuildImportTable]: NameData RVA NULL\n"); break; } 
         NameData = (PIMAGE_IMPORT_BY_NAME)(codeBase + thunkILT->u1.AddressOfData); 
         if (NameData == NULL) { printf("[BuildImportTable]: codeBase + NameData RVA NULL\n"); break; } 

         // BY NAME 
         printf("[BuildImportTable]: OLD thunkIAT->Function: 0x%08X\n", thunkIAT->u1.Function); 
         thunkIAT->u1.Function = (DWORD)pGetProcAddress(handle, NameData->Name); 
         if (thunkIAT->u1.Function == NULL){ printf("[BuildImportTable]: Procedure Not Found By Name\n"); break; } 
         printf("[BuildImportTable]: NEW thunkIAT->Function: 0x%08X\n", thunkIAT->u1.Function); 
         printf("[BuildImportTable]: ThunkData->Name: %s\n", NameData->Name); 
         thunkILT++;     
        } 

        // CHECK NEW IAT 
        if (thunkIAT == 0) { 
         result = 0; 
         printf("[BuildImportTable]: NEW IAT NULL\n"); 
         break; 
        } 

        // Increment 
        thunkIAT++; 

       } // End of Thunk Loop 

      } // End of for Loop 
     } // Director Size 

     _getch(); 
     return result; 
    } 

答えて

0

(ANSWER):

私はLoadLibraryの正しいモジュールの位置を有し確認することによって、上記の問題を解決しました。そうすることで、各モジュールの正しいハンドルを教えてくれました。

私はprocmonを使用してアプリケーションをフィルタリングし、領域ロードライブラリがモジュールを検索していることを示すCreateFile()にフィルタを配置しました。モジュールはリストされた場所のいずれにも入っていませんでした。

したがって、上記の問題を解決するために、ここからloadlibraryフルパスを提供します。

私の質問を読んで、読んでいただきありがとうございます。それを解決すると考えてください:)

関連する問題