Winapi CreateRemoteThreadEx和NtCreateThreadEx失败
我目前正在尝试实现一个名为Rust的进程规避方法 我已经成功地创建了NTFS事务,进程,我已经在进程的PEB中写入了新的参数,但是我无法创建主线程 当我试图创建主线程时,我的程序崩溃 当我使用Winapi CreateRemoteThreadEx和NtCreateThreadEx失败,winapi,process,rust,Winapi,Process,Rust,我目前正在尝试实现一个名为Rust的进程规避方法 我已经成功地创建了NTFS事务,进程,我已经在进程的PEB中写入了新的参数,但是我无法创建主线程 当我试图创建主线程时,我的程序崩溃 当我使用NtCreateThreadEx时,函数返回0xC0000022(状态\访问\拒绝) (我用process\u ALL\u ACCESS常量创建了这个进程,我以管理员身份运行) va_entrypoint变量等于所创建进程的PEB中的ImageBaseAddress,以及我加载到内存中的PE文件的可选头中的
NtCreateThreadEx
时,函数返回0xC0000022(状态\访问\拒绝)
(我用process\u ALL\u ACCESS
常量创建了这个进程,我以管理员身份运行)
va_entrypoint
变量等于所创建进程的PEB中的ImageBaseAddress
,以及我加载到内存中的PE文件的可选头中的AddressOfEntryPoint
我检查了进程是否正在运行,它是否正在运行,但我只能通过tasklist.exe
输出中的PID
来识别它,因为程序没有任何名称
我想这是正常的,因为我没有创建主线程,但我也不确定
我用一些过程分析工具手动检查了PEB的地址、图像的基址等,一切正常
当我尝试创建主线程时,我想我遗漏了一些东西-当我尝试创建主线程时,进程实际上会死亡。
transmute::(va_entrypoint),
似乎是错误的,除非这是开发的要点。你有C++的功能代码吗?@ SePiMeMIT它应该指向新创建的进程的入口点。我将其定义为:let va_entrypoint:u64=std::mem::transmute:(peb.ImageBaseAddress)+nt_headers.OptionalHeader.AddressOfEntryPoint为u64代码> @ DavidHeffernan是在开发过程中使用的官方C++代码。我自己在它上面建立我的代码。你的程序在什么地方偏离了工作C++代码?
ntstatus = NtCreateThreadEx(
&mut thread,
THREAD_ALL_ACCESS,
null_mut(),
process,
transmute::<u64, *mut c_void>(va_entrypoint),
null_mut(),
0, 0, 0, 0,
null_mut()
);
let thread = CreateRemoteThreadEx(
process,
THREAD_ALL_ACCESS,
0,
transmute::<u64, *mut c_void>(va_entrypoint),
null_mut(),
0,
null_mut(), &mut id
);