Как получить точку входа в функцию в PE-файле

Если у меня есть exampleA.exe процесс, и я использую FindEntryPointAddress() функция, чтобы получить main() точка входа exampleB.exe процесс

FindEntryPointAddress() является функцией exampleA.exe

DWORD FindEntryPointAddress( TCHAR *exeFile )
{
  BY_HANDLE_FILE_INFORMATION bhfi;
  HANDLE hMapping;
  char *lpBase;

  HANDLE hFile = CreateFile(exeFile, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL);

  if (hFile == INVALID_HANDLE_VALUE)
    ;

  if (!GetFileInformationByHandle(hFile, &bhfi))
    ;

  hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, bhfi.nFileSizeHigh, bhfi.nFileSizeLow, NULL);

  if (!hMapping)
    ;

  lpBase = (char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, bhfi.nFileSizeLow);

  if (!lpBase)
    ;

  PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)lpBase;

  if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) // 0x00004550(IMAGE_NT_SIGNATURE)
    ;

  PIMAGE_NT_HEADERS32 ntHeader = (PIMAGE_NT_HEADERS32)(lpBase + dosHeader->e_lfanew);

  if (ntHeader->Signature != IMAGE_NT_SIGNATURE)
    ;

  DWORD pEntryPoint = ntHeader->OptionalHeader.ImageBase + ntHeader->OptionalHeader.AddressOfEntryPoint;

  UnmapViewOfFile((LPCVOID)lpBase);

  CloseHandle(hMapping);

  CloseHandle(hFile);

  printf( "test.exe entry point: %p\n", pEntryPoint );

  return pEntryPoint;
} // FindEntryPointAddress()

Знайте, у меня есть вопрос, как я могу редактировать FindEntryPointAddress() чтобы получить func() точка входа exampleB.exe

exampleB.exe

  void func()
  {
    char str[10];

    strcpy( str, "iambuffer\n" );

    printf( "%s", str );
  } // func()

  int main()
  {
    func();

    return 0;
  } // main()

большое спасибо

2 ответа

Решение

Если функция не экспортируется (см., Например, __declspec(dllexport)) не повезло тебе. Без записи в таблице экспорта невозможно получить адрес функции, отличной от точки входа.

Более того, даже если вы найдете какие-либо данные, относящиеся к функции в другом месте (например, в символах отладки), вы все равно не сможете получить адрес, так как вполне возможно, что функция была встроена везде или была удалена по какой-либо другой причине и ее связанных данных не было. На экспортируемые функции это не влияет, так как компилятор и компоновщик достаточно осторожны, чтобы всегда их излучать.

Если вы хотите сделать заказ GetProcAddressпосмотрите здесь, однако, если у вас нет pdb или символ функции находится в EAT (таблица адресов экспорта), вы не сможете его найти.

Другие вопросы по тегам