C++ 如何获取子进程的入口点?

C++ 如何获取子进程的入口点?,c++,process,entry-point,C++,Process,Entry Point,我使用CreateProcess()从进程中创建了一个子进程(在C++中) 然后,我继续使用ReadProcessMemory来读取内存并搜索特定的内容 我想从该进程的入口点开始搜索,因为该进程被加载到它自己的虚拟空间中,我现在不知道如何找到代码本身的入口点(我不关心PE文件的其他部分), 我知道PE格式的“AddressOfEntryPoint”字段,我已经知道了,但由于我不知道该进程将在哪个地址加载,如何计算入口点本身 为了演示我想要的内容,例如,如果您使用OllyDbg打开一个流程,那么您

我使用CreateProcess()从进程中创建了一个子进程(在C++中) 然后,我继续使用ReadProcessMemory来读取内存并搜索特定的内容

我想从该进程的入口点开始搜索,因为该进程被加载到它自己的虚拟空间中,我现在不知道如何找到代码本身的入口点(我不关心PE文件的其他部分), 我知道PE格式的“AddressOfEntryPoint”字段,我已经知道了,但由于我不知道该进程将在哪个地址加载,如何计算入口点本身

为了演示我想要的内容,例如,如果您使用OllyDbg打开一个流程,那么您立即到达代码的入口点,我希望获得该地址

请记住,这是我创建的一个子流程,如果它有帮助的话


请允许我提及,我不想向该应用程序中插入任何代码或DLL。查找该地址我不太清楚,但……据我所知,您可以在.exe/.DLL的PE头中查找入口点地址吗

或者。。。。这是固定的


这就是我所记得的

我不太清楚,但是……据我所知,你能在.exe/.dll的PE头中找到入口点地址吗

或者。。。。这是固定的


这就是我记忆中的全部内容。

入口点的地址是相对于映像基址的(相同映像的ImageBase成员\u可选\u头结构)。对于可执行文件,映像库几乎总是PE头中设置的内容,因为每个可执行文件都有自己的虚拟地址空间

事实上,带剥离重定位段的EXE只能在PE中的底部加载


我不确定是否存在异常以及是否可以检索正在运行的进程的映像库…

EntryPoint的地址相对于映像库地址(相同映像的ImageBase成员\u可选\u头结构)。对于可执行文件,映像库几乎总是PE头中设置的内容,因为每个可执行文件都有自己的虚拟地址空间

事实上,带剥离重定位段的EXE只能在PE中的底部加载

我不确定是否有异常,是否有可能检索正在运行的进程的映像库…

使用带有NULL的HMODULE的PSAPI。这将为您提供可执行文件的入口点以及内存中的总大小(遗憾的是,没有设置基址)

请注意,入口点不一定是main()函数,它可能是CRT的 依次调用main()的入口点

您还可以使用获取进程中的所有模块及其基址。

将PSAPI与空模块一起使用。这将为您提供可执行文件的入口点以及内存中的总大小(遗憾的是,没有设置基址)

请注意,入口点不一定是main()函数,它可能是CRT的 依次调用main()的入口点


您还可以使用获取进程中的所有模块及其基址。

+1。但是请注意,
GetModuleInformation
不会返回模块的基址(我甚至没有找到任何说明可以将0作为HMODULE传递的文档。它保证工作吗?)。您可能需要调用
EnumProcessModules
@avakar-它似乎可以工作,至少在我的机器和Windows版本上是这样。EnumProcessModules first有助于保证它正常工作。我尝试了GetModuleInformation和EnumProcessModules,两者都不起作用,EnumProcessModules作为错误返回,没有特定信息,似乎与函数无关,当我将GetModuleInformation与HMODULE一起使用为NULL时,我收到一个填充了0xCCCCC值的结构,该值不是很高helpful@ratata,请发布您试图使用GetModuleInformation的代码,这应该可以工作。如果(!CreateProcess(NULL,“c:\\test.exe”,NULL,NULL,TRUE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)){printf(“CreateProcess失败(%d)。\n”,GetLastError();返回0;}句柄hproces=pi.hProcess;MODULEINFO-mi;GetModuleInformation(hProcess,NULL,&mi,sizeof(mi));我已经跳过了所有与CreateProcess相关的内容,该流程已创建我确信,出于我的需要,我需要将其创建为挂起,因为我尝试创建它以定期打开,并得到相同的结果,我得到一个错误6,它说:“无效的句柄值”,可能我得到了错误+1。但是请注意,
GetModuleInformation
不会返回模块的基址(我甚至没有找到任何说明可以将0作为HMODULE传递的文档。它保证工作吗?)。您可能需要调用
EnumProcessModules
@avakar-它似乎可以工作,至少在我的机器和Windows版本上是这样。EnumProcessModules first有助于保证它正常工作。我尝试了GetModuleInformation和EnumProcessModules,两者都不起作用,EnumProcessModules作为错误返回,没有特定信息,似乎与函数无关,当我将GetModuleInformation与HMODULE一起使用为NULL时,我收到一个填充了0xCCCCC值的结构,该值不是很高helpful@ratata,请发布您试图使用GetModuleInformation的代码,这应该可以工作。如果(!CreateProcess(NULL,“c:\\test.exe”,NULL,NULL,TRUE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)){printf(“CreateProcess失败(%d)。\n”,GetLastError();返回0;}句柄hproces=pi.hProcess;MODULEINFO-mi;GetModuleInformation(hProcess,NULL,&mi,sizeof(mi));我已经跳过了所有与CreateProcess相关的内容,该流程已创建我确信,出于我的需要,我需要将其创建为挂起状态,我尝试创建它以定期打开并获得相同的结果,我得到了一个错误6,它说:“无效句柄值”,可能我得到了一些错误我知道这一事实,但