您的位置:首页 > 其它

[原创]一个为Process取得SYSTEM令牌的简单方法

2007-09-10 16:08 351 查看
一个为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: