[原创]三种方法在应用层创建具有system权限的进程(有代码)
关于如何创建具有system权限进程的问题,有许多方法。俺今天整理了下,给出三种比较实用的方法。
一, 通过Inline Hook ZwCreateProcessEx修改父进程。
在xp环境下,创建进程过程为:kernel32!CreateProcess(A\W) -> kernel32!CreateProcessInternalW -> ntdll!ZwCreateProcessEx -> 内核。所以创建进程必须经过ZwCreateProcessEx,它参数如下:
NTSTATUS ZwCreateProcessEx( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN BOOLEAN InheritObjectTable, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, IN HANDLE UnknownHandle );
第四个参数ParentProcess为父进程句柄,默认情况下为0xFFFFFFFF,表示本进程为父进程。如果ZwCreateProcessEx在挂个钩,把具有system权限的进程句柄填上去,那么创建的进程就继承了它所有的权限了。
过程:
1,提升到调试权限。(DWORD EnablePrivilege (PCSTR name))
1, 打开system进程,得到句柄。OpenProcess
2, InLine Hook ZwCreateProcessEx 修改第四参数。
3, 成功。

注:另外,在win 7环境下不能实现,因为在Win 7不是通过ZwCreateProcessEx,而是通过NtCreateUserProcess函数进入内核的。有搞定的通知一声!
二, 得到具有system权限的进程安全描述ACL表,然后调用CreateProcessAsUser创建一个进程,把得到的Token传递过去。
CreateProcessAsUser参数:
BOOL WINAPI CreateProcessAsUser( _In_opt_ HANDLE hToken, _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _In_ LPSTARTUPINFO lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation );
过程:
1, 提调试权限
2, 得到pid,打开system进程,得到句柄。OpenProcess
3, 得到进程访问令牌。OpenProcessToken
4, 设置ACE具有所有访问权限。BuildExplicitAccessWithName
5, 得到安全描述符的访问控制列表。GetKernelObjectSecurity, GetSecurityDescriptorDacl
6, 将具有所有访问权限的访问控制列表加入到新的安全描述符中。SetSecurityDescriptorDacl
7, 将新的安全描述符加到TOKEN中。SetKernelObjectSecurity
8, 用TOKEN_ALL_ACCESS标志再次打开system进程,得到所有访问权限的TOKEN
9, 复制一份TOKEN。DuplicateTokenEx
10,调用CreateProcessAsUser创建进程,把复制的TOKEN作为参数。
11,成功!

注:win 7 下不能成功,OpenProcess失败!有搞定的通知一声!
三, 系统服务创建进程
系统服务是具有system权限,所以创建一个服务,然后服务创建进程,那么就得到具有system权限的进程了。这个的代码就不贴了,有兴趣可以试下。
---代码
源码.zip
