在没有获得父进程的内存权限的情况下创建子进程

Creating child process without getting memory rights to parent

我正在尝试创建子进程,但没有以这种方式获得对父进程的 PROCESS_VM_WRITE 权限:

将内核驱动程序与 ObRegisterCallbacks 一起使用 当父进程试图获取启动子进程的句柄时,我删除了 PROCESS_VM_WRITE 访问权限:

  1. 在父进程中,我使用 CreateProcess 函数启动子进程,但失败并显示我没有权限的错误。

  2. 我也试过使用 RtlCreateUserProcess 并且成功了,但是你可能知道现在处理 运行 没有子系统并且它不能正常工作。

因此,出于所有这些原因,我有三个问题:

  1. 也许可以使用一些 ntdll.dll 函数来正确创建进程而不写入子内存?

  2. 也许可以挂钩某些 Nt 函数并在进程创建期间将所有写请求提升到我的内核驱动程序?如果是,我需要挂接哪些功能?我上钩了 NtWriteVirtualMemory,但是 ntdll.dll 在调用之前检查访问权

  3. 也许可以在使用RtlCreateUserProcess后完成创建自己的正确过程?如果是,我需要使用什么功能?

无法访问父进程的内存对我来说非常重要,因为我需要保护子内存免受所有 UserMode 技巧的影响,ObRegisterCallback 对它有好处,但父进程(启动器)是一个大洞。

Maybe it is possible to hook some Nt functions and elevate all write requests during process creating to my kernel driver? If yes, what functions do I need to hook? I hooked NtWriteVirtualMemory, but ntdll.dll checks access right before call it

是的,这就是您需要做的全部。挂钩 NtWriteVirtualMemory,从 CreateProcessInternalW 调用。这避免了 STATUS_ACCESS_DENIED 并且在这种情况下一切都会起作用。

ntdll.dll checks access right before call it

你错了 - 没有发生这样的事情。

ObjectPreCallback 中,您是否检查请求是否来自您的父进程并仅在是时删除 PROCESS_VM_WRITE?在进程创建期间调用 CsrClientCallServer,结果 csrss.exe 也打开了一个子进程。您确定不删除此处的 PROCESS_VM_WRITE 吗?

当然也可以使用 RtlCreateUserProcess,但在这种情况下,您将需要自己连接到 csrss 并使用未记录且可能不稳定的接口。我认为这不是最好的方法,但它是可能的。

不,没有另一个 ntdll API 用于创建连接了 csrss 的进程。