有没有可能获得函数的内存入口点?

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

这是我如何得到subprocess的主要切入点

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

而我应该如何获得subprocess的函数foo()入口点?

subprocess就像这样

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

可能有人问 – 为了什么? 如果你想运行子进程, CreateProcess()为你做。 从一个任意函数运行这个过程是毫无意义的。 因为RTL不会被初始化,所以这个过程很可能会崩溃。

如果你想为创建者进程调用一个函数,这就是LoadLibrary()/ GetProcAddress()的作用。 CreateProcess()是完全不同的东西。

如果要根据单个函数进行调试,则解析MAP文件和/或调试符号是一种方法。 如果函数恰好是全局的并且导出,则解析PE导出表可能会有所帮助。

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

我很久以前就曾经做过类似的事情,不太清楚,所以这可能是关闭的。 但是我相信如果有足够的符号信息,你可以从SymFromName获得函数地址。 或者如果它被导出,直接通过GetProcAddress得到地址。

要修补入口点,您可以通过PE头在入口点上执行一个静态补丁,或者在运行该进程后暂停该进程,并通过SetThreadContext更改EIP。

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

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