【问题标题】:How to get the entry point of a child process?如何获取子进程的入口点?
【发布时间】:2009-09-01 18:14:51
【问题描述】:

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

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

为了演示我想要什么,例如,如果您使用 OllyDbg 打开一个进程,您会立即到达代码的入口点,我想要那个地址

请记住,如果有帮助,这是我创建的子进程

让我提一下,我不想将任何代码或 DLL 注入该应用程序以找出该地址

【问题讨论】:

    标签: c++ process entry-point


    【解决方案1】:

    使用 PSAPI 的 GetModuleInformation 与 NULL 的 HMODULE。这将为您提供可执行文件的入口点以及内存中的总大小(不幸的是,未设置基地址。)

    请注意,入口点不一定是 main() 函数 - 它可能是 CRT 的 入口点又调用你的 main()。

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

    【讨论】:

    • +1。但是请注意,GetModuleInformation 不会返回模块的基地址(我什至没有找到任何说明您可以将 0 作为 HMODULE 传递的文档。它可以保证工作吗?)。您可能需要致电EnumProcessModules
    • @avakar - 它似乎工作,至少在我的机器和 Windows 版本上。 EnumProcessModules 首先有助于保证它正常工作。
    • 我尝试了 GetModuleInformation 和 EnumProcessModules ,两者都没有工作,EnumProcessModules 作为没有特定信息的错误返回,这似乎与函数无关,当我使用 GetModuleInformation 和 HMODULE 为 NULL 我收到了一个结构,其中填充了 0xccccccc 值,这些值不是很有帮助
    • @ratata,请发布您尝试使用 GetModuleInformation 的代码,这应该可以。
    •  if (!CreateProcess(NULL,"c:\\test.exe",NULL,NULL,TRUE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)){ printf("CreateProcess失败 (%d)。\n", GetLastError() );返回0; } 处理 hProcess = pi.hProcess; MODULEINFO mi; GetModuleInformation(hProcess,NULL,&mi,sizeof(mi)); 
      我已经跳过了所有与 CreateProcess 相关的内容,我确信该进程已创建,出于我的需要,我需要将其创建为挂起,我尝试创建它以定期打开并得到相同的结果,我得到了一个错误 6,上面写着:“无效的句柄值”,也许我弄错了
    【解决方案2】:

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

    或者......它是一个固定的

    我只记得这些

    【讨论】:

      【解决方案3】:

      AddressOfEntryPoint 是相对于图像基地址(同一 IMAGE_OPTIONAL_HEADER 结构的 ImageBase 成员)。对于可执行文件,镜像库几乎总是在 PE 标头中设置,因为每个可执行文件都有自己的虚拟地址空间。

      事实上,带有剥离重定位部分的 exe 只能在 PE 中的基础上加载。

      我不确定是否有异常以及是否可以检索正在运行的进程的图像库...

      【讨论】:

      • 我知道这一事实,但我已经针对一些进程进行了测试,主要是我正在尝试处理的进程,因为图像库是:00400000,入口点位于:0000311D 我希望它在 0040311D 但是当我使用 ollydbg 查看代码的真正入口点时,我得到:010E311D 这是如何完成的?
      • 嗯,在 ollydbg 中的随机可执行文件上进行了测试,它可以工作。也许只适用于某些前任...
      • ollydbg 说图片库是 00400000 吗?
      • 你提到它很有趣,我刚刚检查过 OllyDbg 说 ImageBase 是:010E0000 而任何其他 PE 编辑文件或只是我用于检查的代码将 ImageBase 指定为:00400000 如果我可以计算为 Ollydoes会有帮助,但它怎么知道其他软件不知道什么?我刚刚检查了其他一些反汇编程序,它们都将 EP 启动为 0040311D,这基于 PE 标头是正确的,问题是当我尝试用我的代码读取该地址时出现错误,但是当我读取 010E311D 这是 Olly 的地址时,我获取 EP 中存在的写入字节。
      • 检查其他一些调试器(不是反汇编器),看看它会进入哪里。我想知道exe是否已打包并且ollydbg是否足够聪明,可以在解包完成后向您显示入口点?如果其他调试器在 0040311D 处进入,稍微跟踪一下,看看做完后会不会跳转到 010E311D...
      猜你喜欢
      • 2017-03-05
      • 1970-01-01
      • 2013-07-18
      • 2017-10-11
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多