C 是否有可能获取函数的内存入口点?

C 是否有可能获取函数的内存入口点?,c,windows,portable-executable,C,Windows,Portable Executable,我使用CreateProcess()从进程中创建了一个子进程,并挂起该子进程。我可以得到子进程内存中的主入口点,但是我应该如何得到子进程的函数入口点呢 这就是我如何获得子进程的主要入口点 DWORD FindEntryPointAddress( TCHAR *exeFile ) { BY_HANDLE_FILE_INFORMATION bhfi; HANDLE hMapping; char *lpBase; HANDLE hFile = CreateFile(exeFile,

我使用
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()
我应该如何获得子进程的函数
foo()
入口点

像这样的子进程

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

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

可以问一个问题吗?为什么?如果要运行子进程,
CreateProcess()
会为您执行此操作。从任意函数运行进程毫无意义;由于RTL不会初始化,因此进程很可能崩溃

如果您想为creator进程调用函数,这就是LoadLibrary()/GetProcAddress()的作用
CreateProcess()
是完全不同的

如果您希望根据单个函数进行调试,则可以解析映射文件和/或调试符号。如果函数恰好是全局的并被导出,那么解析PE导出表可能会有所帮助


此外,在现代编译器中,编译时函数在EXE文件中可能没有一个明确的入口点。内联和所有这些。

我很久以前就做过类似的工作,但记不清了,所以这可能会被取消。但我相信,如果有足够的符号信息,您可以从中获取函数地址。或者,如果它被导出,只需通过直接获取地址即可


要修补入口点,您可以通过PE标头对入口点进行静态修补,也可以在运行进程并通过更改EIP后暂停进程。

使用子进程程序的.DEF文件中的导出, 然后,您的程序可以搜索IAT表以查找地址

您还可以搜索代码以查找设置帧指针的指令, 然后找到一个可能的切入点。
但是你不能完全信任这个地址。

我的目的是如果我没有子进程源代码,我可以得到子进程的函数入口点。你不需要源代码。可执行文件中嵌入了一些符号表,它们提供的信息量有限。如果它甚至没有那个符号信息,那么你将不得不通过其他启发式方法来确定目标函数的地址。我的目的是如果我没有子进程源代码,而我只是得到一个.exe文件,我可以得到子进程的函数入口点。一旦你得到了入口点(地址),你打算用它做什么?如果你没有源代码,你怎么知道函数的存在呢?如果那正是子进程的内容,那么foo函数在EXE中就没有入口点了——编译器会将其内联。