C语言 入口点遮挡



我一直在编写一个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: %Xn", namearray[i], rvaArray[i]);
         }
     }

注意:许多代码已被剥离(用于跟踪进度的 printf 语句。

问题是我一直使用的数组类型。我不确定如何正确存储pThunkData(名称)和pFThunkData(RVA)以供以后使用。

我已经尝试了一些弄乱代码的事情,但我承认失败并寻求您的帮助。

您可以创建一个包含 pThunkData 和 pFThunkData 的结构列表或数组。

#define n 100
struct pdata
{
     PIMAGE_THUNK_DATA p_thunk_data;
     PIMAGE_THUNK_DATA pf_thunk_data;
}
struct pdata pdatas[n]

相关内容

  • 没有找到相关文章

最新更新