2014-01-09 103 views
0

我一直在編寫一個EPO程序,到目前爲止我已經能夠找到一個調用操作碼,並從二進制文件中的以下地址獲取RVA,然後解析IAT以獲取名稱爲進口及其相應的RVA。入口點模糊

我試圖用名稱+ RVA填充數組並且繼續比較我從調用地址獲得的WORD值與所有導入函數的RVA之間的差異。

這是我一直在使用的代碼;

//Declarations. 
    DWORD dwImportDirectoryVA,dwSectionCount,dwSection=0,dwRawOffset; 
    PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor; 
    PIMAGE_THUNK_DATA pThunkData, pFThunkData; 

// Arrays to hold names + rva's 
    unsigned long namearray[100]; 
    DWORD rvaArray[100]; 
    int i = 0; 

而其餘的:

/* Import Code: */ 

    dwSectionCount = pNtHeaders->FileHeader.NumberOfSections; 
    dwImportDirectoryVA = pNtHeaders->OptionalHeader.DataDirectory[1].VirtualAddress; 

    for(;dwSection < dwSectionCount && pSectionHeader->VirtualAddress <= dwImportDirectoryVA;pSectionHeader++,dwSection++); 
    pSectionHeader--; 

    dwRawOffset = (DWORD)hMap+pSectionHeader->PointerToRawData; 

    pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)(dwRawOffset+(dwImportDirectoryVA-pSectionHeader->VirtualAddress)); 

    for(;pImportDescriptor->Name!=0;pImportDescriptor++) 
    { 

     pThunkData = (PIMAGE_THUNK_DATA)(dwRawOffset+(pImportDescriptor->OriginalFirstThunk-pSectionHeader->VirtualAddress)); 
     pFThunkData = (PIMAGE_THUNK_DATA)pImportDescriptor->FirstThunk; 
     for(;pThunkData->u1.AddressOfData != 0;pThunkData++) 
     { 
      if(!(pThunkData->u1.Ordinal & IMAGE_ORDINAL_FLAG32)) 
      { 

       namearray[i] = (dwRawOffset+(pThunkData->u1.AddressOfData-pSectionHeader->VirtualAddress+2)); 
       rvaArray[i] = pFThunkData; 

       i++; 
       // 
       pFThunkData++; 
      } 

     } 
    } 

    printf("\nFinished.\n"); 


    for (i = 0 ; i <= 100 ; i++) 
    { 
//wRva is defined and initialized earlier in code. 
     if (rvaArray[i] == wRva) 
     { 
      printf("Call to %s found. Address: %X\n", namearray[i], rvaArray[i]); 
     } 
    } 

注:很多這樣的代碼已經被剝離下來(printf語句來跟蹤進度。)

的問題是我的類型的數組一直在使用。我不知道如何正確地存儲pThunkData(Names)和pFThunkData(RVA's)以備後用。

我已經嘗試了一些與代碼混淆的東西,但我承認失敗並要求您的幫助。

回答

1

您可以創建一個包含pThunkData和pFThunkData的結構體列表或數組。

#define n 100 

struct pdata 
{ 
    PIMAGE_THUNK_DATA p_thunk_data; 
    PIMAGE_THUNK_DATA pf_thunk_data; 
} 

struct pdata pdatas[n]