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中就没有入口点了——编译器会将其内联。