2014-01-09 4 views
0

나는 EPO 프로그램을 작성해 왔으며 지금까지는 호출 opcode를 찾고 이진에서 다음 주소에서 RVA를 가져온 다음 IAT를 구문 분석하여 수입 된 RVA 및 해당 RVA.진입 점 모호성

+ RVA의 이름을 가진 배열을 채우고 가져온 모든 함수의 RVA에 대해 호출 주소의 WORD 값을 비교할 때 문제가 발생했습니다.

다음은 내가 사용 해본 코드입니다.

//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]