【发布时间】:2012-01-11 10:59:18
【问题描述】:
我使用 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()
【问题讨论】:
-
我从来没有听说过函数的入口点,据我所知,
main本身就是程序的入口点。如果有这样的事情,我真的很高兴知道! -
如果它与
main不在同一个源文件中,那么它可能在与主源文件一起编译的另一个源文件中。或者它在一个库中,在这种情况下您需要查找该库。 -
你的意思是
&foo,相当于foo? -
欢迎来到 SO。在我看来,您的问题在词汇上存在问题。您能否更详细地描述您要实现的目标?我认为您应该能够相应地“编辑”您的问题。
标签: c