一个为Process取得SYSTEM令牌的简单方法
(测试平台:windows XP sp2)
我们知道NT平台本地最高权限用户是SYSTEM,如果以SYSTEM用户打开
regedit.exe,就可以看到SAM目录下的内容,而用administrator用户却不能(除
非通过手动赋予)。那么如何创建一个带有SYSTEM Token的进程呢?
我采用的方法参考了一些技术文章,只是简单的Hook Windows原生API :
NtCreateProcessEx ,更改其第4个参数HANDLE : ParentProcess 即可。
下面是大致的思路:
0 取得 NtCreateProcessEx 的 address
1 放置 Hook 陷阱
2 为进程取得SE_DEBUG_NAME权限,如果不这样做就会有一个
有趣的现象:用调试器运行时一切正常,但是单独运行时就会失败。
3 用普通CreateProcess运行regedit.exe
4 进入事先设置的 Hook 陷阱,更改ParentProcess 为任意SYSTEM进程
的Handle,然后恢复原先代码,重新进入。(这个技术我在以前ring0级的
内核代码中也采用了,可是调试的时候差点累死,^o^)
5 一个带 SYSTEM Token 的 regedit.exe 出炉啦!^o^
以下是部分源代码:
;*********************************************
;** code by hopy | 侯佩 **
;*********************************************
.386
.model flat,stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
include /masm32/include/advapi32.inc
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/advapi32.lib
.const
szexe db 'regedit.exe',0
szdll db 'ntdll.dll',0
szfuc db 'NtCreateProcessEx',0
pid dd 540
SE_DEBUG_NAME0 db 'SeDebugPrivilege',0
_NtCreateProcessEx typedef proto :dword,:dword,:dword,/
:dword,:dword,:dword,/
:dword,:dword,:dword
lpNtCreateProcessEx typedef ptr _NtCreateProcessEx
.data?
ph HANDLE ?
NtCreateProcessEx lpNtCreateProcessEx ?
suinfo STARTUPINFO <?>
proc_info PROCESS_INFORMATION <?>
oldprotect dword ?
lphookcode dword ?
oldcode db 6 dup(?)
.code
;***************************************************************
start:
jmp init
hookcode:
pushad
mov eax,ph
mov [esp+30h],eax
invoke RtlMoveMemory,NtCreateProcessEx,/
addr oldcode,6
mov eax,oldprotect
invoke VirtualProtect,NtCreateProcessEx,16,/
eax,addr oldprotect
popad
mov eax,NtCreateProcessEx
jmp eax
init:
invoke LoadLibrary,addr szdll
invoke GetProcAddress,eax,addr szfuc
mov NtCreateProcessEx,eax
invoke EnableDebugPrivilege,TRUE
invoke RtlMoveMemory,addr oldcode,/
NtCreateProcessEx,6
invoke VirtualProtect,NtCreateProcessEx,16,/
PAGE_READWRITE,addr oldprotect
mov lphookcode,offset hookcode
mov edi,NtCreateProcessEx
mov word ptr ds:[edi],025ffh
mov ds:[edi+2],offset lphookcode
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,pid
mov ph,eax
invoke CreateProcess,NULL,addr szexe,NULL,NULL,FALSE,/
NORMAL_PRIORITY_CLASS,NULL,NULL,/
addr suinfo,addr proc_info
invoke ExitProcess,NULL
;***************************************************************
end start