【发布时间】:2020-03-28 09:18:16
【问题描述】:
我想打电话给NtCreateProcessEx,但我没有收到异常和错误,也没有任何反应。我也不想使用CreateProcess。我的意图是从具有此特定功能的文件中创建和运行进程。
这是我迄今为止尝试过的:
#include <Windows.h>
#include <bcrypt.h>
#include "winternl.h"
#pragma comment(lib, "ntdll")
NTSTATUS NTAPI NtCreateProcessEx(
OUT HANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN OBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN BOOLEAN InJob);
int main()
{
const HANDLE ph = nullptr;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING fileName;
RtlInitUnicodeString(&fileName, PCWSTR(L"\\??\\C:\\Windows\\System32\\calc.exe"));
(&oa)->Length = sizeof(OBJECT_ATTRIBUTES);
(&oa)->RootDirectory = nullptr;
(&oa)->Attributes = 0x00000040L;
(&oa)->ObjectName = &fileName;
(&oa)->SecurityDescriptor = nullptr;
(&oa)->SecurityQualityOfService = nullptr;;
NtCreateProcessEx(ph, PROCESS_ALL_ACCESS, oa, nullptr, FALSE, nullptr, nullptr, nullptr, FALSE);
return 0;
}
整个互联网上没有关于此特定功能的文档和示例。我可以为NtCreateFile 做一些类似的事情,但这是我最接近NtCreateProcessEx 的尝试,但没有运气。
我使用 Visual Studio 2019 和 windows 10 1909。
这些是我尝试过的一些资源:
- NtCreateProcess(Ex) - Can I have a child process inherit the parents address space while running under a different process name?
- http://www.rohitab.com/discuss/topic/40191-ntcreateuserprocess/
- https://github.com/Microwave89/createuserprocess/blob/master/createuserprocess/main.c
- http://www.rohitab.com/discuss/topic/42229-start-a-process-using-ntcreateprocessex-usermode/
- https://hshrzd.wordpress.com/2017/12/18/process-doppelganging-a-new-way-to-impersonate-a-process/
【问题讨论】:
-
你用错了
NtCreateProcessEx。ObjectAttributes不能指向任何文件。并且必须为 0。相反,您需要从可执行文件创建部分并将其传递到位SectionHandle。还需要做更多的工作 - 在进程中创建线程,将进程附加到 csrss,分配环境变量等。CreateProcess完成所有这些。 -
@RbMm 所以我不能只打电话给
NtCreateProcessEx,我必须重新定义它。但我想知道为什么NtCreateFile更容易使用。你有任何例子或资源来帮助我完成这个吗? -
如果没有记录,你为什么要使用它?
-
@user207421 它没有记录但不是非法的(只是不支持)。在某些在线课程和隔离日中,尝试使用无证 Api 是很常见的事情 :)。你也应该责怪成千上万的开发人员知道一个未记录的函数。
-
你可以好好研究一下。我会先在网上找到调用它的源代码。
标签: c++ winapi system-calls ntdll