Скрытие точки входа

Я писал программу 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 (имена) и pFThunkData (RVA) для последующего использования.

Я пробовал кое-что с кодом, но я признаю поражение и прошу вашей помощи.


person user2699298    schedule 09.01.2014    source источник


Ответы (1)


Вы можете создать список или массив структур, содержащих pThunkData и pFThunkData.

#define n 100

struct pdata
{
     PIMAGE_THUNK_DATA p_thunk_data;
     PIMAGE_THUNK_DATA pf_thunk_data;
}

struct pdata pdatas[n]
person ikstream    schedule 09.01.2014