我使用CreateProcess()从进程内部创建了一个子进程,并挂起了该子进程。我可以在子进程的内存中获取主入口点,但是应该如何获取子进程的函数入口点呢?

这就是我获得子进程的主要切入点的方式

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)
    ;

  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()


我的目的是,如果我没有子进程源代码,而只有子进程.exe文件,能否获得子进程的功能入口点?

这样的子进程

void foo()
{
  char str[10];
  strcpy( str, "buffer\n" );
} // foo()

int main()
{
  foo();
  return 0;
} // main()

最佳答案

函数没有被称为entry point的东西。如果您想了解调用函数时的执行流程,则可以放置一些printf()语句,如下所示:

#include <stdio.h>

void foo(void)
{
    printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__);
    return;
}

int main(void)
{
    printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__);
    foo();
    return 0;
}


或者,您可以使用gdb并在每个函数的开头设置breakpoints来查看执行流程!

关于c - 如何获得功能入口点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8800035/

10-11 23:00