如何获得功能入口点?

时间:2012-01-10 07:46:49

标签: c

我使用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()

2 个答案:

答案 0 :(得分:2)

函数中没有任何名为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以查看执行流程!

答案 1 :(得分:0)

按照Sangeeth Saravanaraj的建议使用gdbbreakpoints实际上是最好的方法,但是如果你想要一个运行时解决方案并想要一个替代方法来不断复制和粘贴相同的printf 1}}语句在您想要跟踪的每个函数中,您可以使用(可能是危险的)宏。

#include <stdio.h>

#define trace_func(_func) printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__); _func

void fooAgain(int myValue)
{
    printf("This is fooAgain, with my value: %d.\n", myValue);
}

void foo(void)
{
    printf("Hello, I'm foo.\n");
    trace_func(fooAgain(15));
}

int main(int argc, char** argv)
{
    trace_func(foo());
    return 0;
}

返回:

Entering *yourfilepath*/main.c:main:18
Hello, I'm foo.
Entering *yourfilepath*/main.c:foo:13
This is fooAgain, with my value: 15

如果你想成为一个可怕的人,并且即使在你为释放而建立时也能留下代码,你可以这样做(但不要,这是一种可怕的做法和错误。我为了这个包括它完成)。

将define语句更改为:

#define TRACE_FUNCTIONS

#ifdef TRACE_FUNCTIONS
    #define trace_func(_func) printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__); _func
#else
    #define trace_func(_func) _func
#endif