2012-01-11 62 views
3

我在的进程中创建了一个子进程,并暂停子进程。我可以在子进程的内存中获取主入口点,但我应该如何获取子进程的函数入口点?有没有可能获得函数的内存入口点?

这是我如何得到子进程

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

如果这*完全是*内容子进程,则foo函数在EXE中将没有入口点 - 编译器会将其内联。 – 2012-01-11 16:08:51

回答

1

子进程可以问问 - 什么?如果你想运行子进程,CreateProcess()为你做。从任意函数运行该进程使其毫无意义;由于RTL不会被初始化,所以这个过程很可能会崩溃。

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

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

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

+0

我的目的是,如果我没有子进程源代码,我只是得到一个.exe文件,我可以得到子进程的函数入口点。 – johnnys0318 2012-01-11 03:13:50

+0

一旦你获得了这个入口点(一个地址),你将如何处理它?如果你没有资料来源,你怎么知道这个函数的存在? – 2012-01-11 14:30:07

0

我很久以前就曾在类似的事情上工作过,不记得确切的事情,所以这可能是关闭的。但是如果有足够的符号信息,我相信你可以从SymFromName得到函数地址。或者,如果已导出,只需通过GetProcAddress直接获取地址即可。

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

+0

我的目的是,如果我没有子进程源代码,我可以得到子进程的函数入口点。 – johnnys0318 2012-01-11 02:47:39

+0

所以我没有足够的信息,我只是得到一个.exe文件 – johnnys0318 2012-01-11 02:50:20

+0

你不需要源代码。嵌入在可执行文件中的符号表提供了有限的信息量。如果它甚至没有那个符号信息,那么你将不得不通过其他启发式来确定目标函数的地址。 – 2012-01-11 03:42:45

0

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

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

相关问题