CreateProcess - 第一个线程例程 - 为线程分配的内存在哪里?

逆向工程 视窗 记忆 登录 线 过程
2021-06-16 02:28:33

当调用CreateProcess内部会(显然调用ZwCreateProcessEx,然后)ZwCreateThreadCreateSuspended设置为True,那么,我想最终正在初始化。之后它正在调用ZwResumeThread,然后一切正常。

我的问题集中在ZwCreateThread函数上:http : //undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FThread%2FNtCreateThread.html

在这整个CreateProcess例程中,它正在为ThreadStartRoutine参数分配远程进程中的内存,在 ZwCreateThread 中,参数是参数ThreadContext->EAX,我已经看到了几个具有Protect的 NtAllocateVirtualMemoryPAGE_EXECUTE_READWRITE - 0x40但它们都没有为NewThreadRoutine. . 那么 Thread 入口点究竟是在哪里分配的呢?

2个回答

免责声明:这些 API 的实现可能会在 Windows 版本之间发生变化。我将在我的回答中引用 32 位 Windows XP SP3。您的结果可能会有所不同。

创建线程的工作原理

在调用之前必须初始化三个结构NtCreateThread

  1. INITIAL_TEB: 包含指向堆栈区域的指针
  2. CONTEXT: 包含寄存器状态
  3. OBJECT_ATTRIBUTES: 包含线程的安全属性

:我在执行,有处理这些任务的专用功能BaseCreateStackBaseInitializeContextBaseFormatObjectAttributes分别。

BaseInitializeContext但是,函数是您感兴趣函数,因为新线程将从CONTEXT.Eip.

有趣的是,BaseInitializeContext将线程的起始地址(即新进程的入口点)放入CONTEXT.Eax. CONTEXT.Eip设置为 的地址BaseProcessStartThunk(由于kernel32在每个进程中都映射到相同的地址,我们知道这也将BaseProcessStartThunk是其他进程中的地址

因此,当我们打电话NtCreateThread,我们在开始在其他进程中一个新的线程BaseProcessStartThunkeax相同的入口点。

BaseProcessStartThunk从 register 保存起始地址eax它通过NtSetInformationThread使用ThreadInformationClassof调用内部设置起始地址ThreadQuerySetWin32StartAddress(请参阅 参考资料ntddk.h)。然后调用起始地址。最后,当线程返回时,它调用ExitThread.

可执行映像如何映射到新进程中

如果您想知道流程是首先创建的,我们必须返回几个步骤。

首先,新进程可执行文件的句柄通过NtOpenFile.

文件句柄用于创建一个部分经由对象NtCreateSection

调用NtQuerySectionwithInformationClass设置为SectionImageInformation这将解析 section 对象并填充一个SECTION_IMAGE_INFORMATION结构,其中最显着的是包含字段的EntryPoint字段。这就是新进程的入口点是如何确定的。

最终,NtCreateProcessEx被调用,给定节句柄 fromNtCreateSection作为参数。这就是实际创建新进程并将可执行映像映射到新进程的地址空间等的内容。 NtCreateProcessEx还提供了我们传递NtCreateThread给创建新线程的进程句柄

好的,所以 ZwCreateThread 在上下文结构中有它 (PCONTEXT + 0xB0)

接收地址的 api 调用是这样的: CreateSection(..SectionInformation..)- 可能创建到初始地址

NtQuerySection(Handle, x, SectionInformation, x, x)

此 SectionInformation 包含远程进程的 EntryPoint 的地址,稍后ThreadContext使用该函数进行初始化_BaseInitializeContext@20,然后使用ZwCreateThread...

这都是在windows xp下检查过的,希望对某人有用