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

一个为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

上一篇:分布式数据仓库实践指南:第一章-数据仓库体系结构


下一篇:[收藏学习]Ubuntu Git入门学习