通過API HOOK 創建SYSTEM用戶進程

 

 clsHookInfo.cls

VERSION 
1.0 CLASS
BEGIN
  MultiUse 
= -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name 
= "clsHookInfo"
Attribute VB_GlobalNameSpace 
= False
Attribute VB_Creatable 
= True
Attribute VB_PredeclaredId 
= False
Attribute VB_Exposed 
= False
Private Declare Function MessageBoxA Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As LongAs Long
Private Declare Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As LongAs Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As LongAs Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As LongAs Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As StringAs Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As StringAs Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As LongAs Long
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)

Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000

Private Const SYNCHRONIZE As Long = &H100000

Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)

Private mbytOldCode(5As Byte
Private mbytNewCode(5As Byte
Private mlngFunAddr As Long

Private mhProcess As Long

Public Function HookApi(ByVal strDllName As String, ByVal strFunName As String, ByVal lngFunAddr As Long, ByVal hProcess As LongAs Boolean
    
Dim hModule As Long, dwJmpAddr As Long
    mhProcess 
= hProcess
    hModule 
= LoadLibrary(strDllName)
    
If hModule = 0 Then
        HookApi 
= False
        
Exit Function
    
End If
    mlngFunAddr 
= GetProcAddress(hModule, strFunName)
    
If mlngFunAddr = 0 Then
        HookApi 
= False
        
Exit Function
    
End If
    CopyMemory mbytOldCode(
0), ByVal mlngFunAddr, 6
    Debug.Print mbytOldCode(
0); mbytOldCode(1); mbytOldCode(2); mbytOldCode(3); mbytOldCode(4)
    mbytNewCode(
0= &HE9
    dwJmpAddr 
= lngFunAddr - mlngFunAddr - 5
    CopyMemory mbytNewCode(
1), dwJmpAddr, 4
    Debug.Print mbytNewCode(
0); mbytNewCode(1); mbytNewCode(2); mbytNewCode(3); mbytNewCode(4)
    HookStatus 
True
    HookApi 
= True
End Function

Public Function HookStatus(ByVal blnIsHook As BooleanAs Boolean
    
If blnIsHook Then
       
If WriteProcessMemory(mhProcess, ByVal mlngFunAddr, mbytNewCode(0), 50<> 0 Then HookStatus = False '攔截
    Else
        
If WriteProcessMemory(mhProcess, ByVal mlngFunAddr, mbytOldCode(0), 50<> 0 Then HookStatus = False '恢復
    End If
End Function

Private Sub Class_Initialize()
'    mhProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId)
End Sub

Private Sub Class_Terminate()
    HookStatus 
False
'    CloseHandle mhProcess
End Sub


frmMain.frm

VERSION 
5.00
Begin VB.Form frmMain 
   BorderStyle     
=   1  'Fixed Single
   Caption         =   "創建系統進程"
   ClientHeight    
=   3090
   ClientLeft      
=   45
   ClientTop       
=   435
   ClientWidth     
=   4680
   LinkTopic       
=   "Form1"
   MaxButton       
=   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   3090
   ScaleWidth      
=   4680
   StartUpPosition 
=   3  '窗口缺省
   Begin VB.CommandButton cmdExit 
      Caption         
=   "退出"
      Default         
=   -1  'True
      Height          =   375
      
Left            =   3510
      TabIndex        
=   3
      Top             
=   2010
      Width           
=   945
   
End
   Begin VB.CommandButton cmdRun 
      Caption         
=   "啓動"
      Height          
=   375
      
Left            =   2190
      TabIndex        
=   2
      Top             
=   2010
      Width           
=   945
   
End
   Begin VB.TextBox txtPath 
      Height          
=   255
      
Left            =   960
      TabIndex        
=   1
      Text            
=   "notepad"
      Top             
=   1020
      Width           
=   3525
   
End
   Begin VB.Label lblNote 
      AutoSize        
=   -1  'True
      Caption         =   "文件路徑:"
      Height          
=   180
      
Left            =   90
      TabIndex        
=   0
      Top             
=   1050
      Width           
=   810
   
End
End
Attribute VB_Name 
= "frmMain"
Attribute VB_GlobalNameSpace 
= False
Attribute VB_Creatable 
= False
Attribute VB_PredeclaredId 
= True
Attribute VB_Exposed 
= False
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As LongAs Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As LongAs Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const SYNCHRONIZE As Long = &H100000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)

Private Type PROCESS_INFORMATION
    hProcess 
As Long
    hThread 
As Long
    dwProcessId 
As Long
    dwThreadId 
As Long
End Type

Private Type STARTUPINFO
    cb 
As Long
    lpReserved 
As String
    lpDesktop 
As String
    lpTitle 
As String
    dwX 
As Long
    dwY 
As Long
    dwXSize 
As Long
    dwYSize 
As Long
    dwXCountChars 
As Long
    dwYCountChars 
As Long
    dwFillAttribute 
As Long
    dwFlags 
As Long
    wShowWindow 
As Integer
    cbReserved2 
As Integer
    lpReserved2 
As Byte
    hStdInput 
As Long
    hStdOutput 
As Long
    hStdError 
As Long
End Type

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub cmdRun_Click()
    
Dim lp As PROCESS_INFORMATION
    
Dim si As STARTUPINFO
    si.cb 
= Len(si)
    CreateProcess vbNullString, txtPath.Text, ByVal 
0&, ByVal 0&00, ByVal 0&, vbNullString, si, lp
End Sub

Private Sub Form_Load()
    EnablePrivilege
    
'注意這裏不能馬上把句柄關閉掉
    glngSystemHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, GetSystemProcessId)
    
If glngSystemHandle = 0 Then
        
MsgBox "獲取系統進程句柄出錯!!", vbCritical, "錯誤"
        
Exit Sub
    
End If
    
Set gclsHookNtCreateProcess = New clsHookInfo
    
Set gclsHookNtCreateProcessEx = New clsHookInfo
    glngProcess 
= OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId)
    gclsHookNtCreateProcessEx.HookApi 
"ntdll.dll""NtCreateProcessEx", GetFunAddr(AddressOf NtCreateProcessExCallback), glngProcess
    gclsHookNtCreateProcess.HookApi 
"ntdll.dll""NtCreateProcess", GetFunAddr(AddressOf NtCreateProcessCallback), glngProcess
End Sub

Private Sub Form_Unload(Cancel As Integer)
    
Set gclsHookNtCreateProcess = Nothing
    
Set gclsHookNtCreateProcessEx = Nothing
    CloseHandle glngSystemHandle
    CloseHandle glngProcess
End Sub


modEnablePrivilege.bas

Attribute VB_Name 
= "modEnablePrivilege"
Option Explicit

Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const TOKEN_ASSIGN_PRIMARY = &H1
Private Const TOKEN_DUPLICATE = (&H2)
Private Const TOKEN_IMPERSONATE = (&H4)
Private Const TOKEN_QUERY = (&H8)
Private Const TOKEN_QUERY_SOURCE = (&H10)
Private Const TOKEN_ADJUST_PRIVILEGES = (&H20)
Private Const TOKEN_ADJUST_GROUPS = (&H40)
Private Const TOKEN_ALL_ACCESS = 983551
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const SE_DEBUG_NAME = "SeDebugPrivilege"

Private Type LUID
    lowpart 
As Long
    highpart 
As Long
End Type

Private Type LUID_AND_ATTRIBUTES
    pLuid 
As LUID
    Attributes 
As Long
End Type

Private Type TOKEN_PRIVILEGES
    PrivilegeCount 
As Long
    Privileges(ANYSIZE_ARRAY) 
As LUID_AND_ATTRIBUTES
End Type

Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As LongAs Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPriv As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As LongAs Long                'Used to adjust your program's security privileges, can't restore without it!
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As Any, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long '獲取當前進程句柄

 

Public Function EnablePrivilege() As Boolean
    
Dim hdlProcessHandle As Long
    
Dim hdlTokenHandle As Long
    
Dim tmpLuid As LUID
    
Dim tkp As TOKEN_PRIVILEGES
    
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
    
Dim lBufferNeeded As Long
    
Dim lp As Long
    hdlProcessHandle 
= GetCurrentProcess()
    lp 
= OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hdlTokenHandle)
    lp 
= LookupPrivilegeValue(vbNullString, "SeDebugPrivilege", tmpLuid)
    tkp.PrivilegeCount 
= 1
    tkp.Privileges(
0).pLuid = tmpLuid
    tkp.Privileges(
0).Attributes = SE_PRIVILEGE_ENABLED
    EnablePrivilege 
= AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
End Function

 

modHook.bas

Attribute VB_Name 
= "modHook"
Private Declare Function NtCreateProcessEx Lib "NTDLL.DLL" (ByRef ProcessHandle As Long, ByVal AccessMask As Long, ByVal ObjectAttributes As Long, ByVal hParentProcess As Long, ByVal InheritHandles As Long, ByVal hSection As Long, ByVal hDebugPort As Long, ByVal hExceptionPort As Long, ByVal reserv As LongAs Long
Private Declare Function NtCreateProcess Lib "NTDLL.DLL" (ByRef ProcessHandle As Long, ByVal AccessMask As Long, ByVal ObjectAttributes As Long, ByVal hParentProcess As Long, ByVal InheritHandles As Long, ByVal hSection As Long, ByVal hDebugPort As Long, ByVal hExceptionPort As LongAs Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As LongAs Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As LongAs Long
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const SYNCHRONIZE As Long = &H100000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
Private Type OBJECT_ATTRIBUTES
    Length 
As Long
    RootDirectory 
As Long
    ObjectName 
As Long
    Attributes 
As Long
    SecurityDescriptor 
As Long
    SecurityQualityOfService 
As Long
End Type

Public gclsHookNtCreateProcessEx As clsHookInfo
Public gclsHookNtCreateProcess As clsHookInfo
Public glngProcess As Long
Public glngSystemHandle As Long

Public Function NtCreateProcessExCallback(ByRef ProcessHandle As Long, ByVal AccessMask As Long, ByVal ObjectAttributes As Long, ByVal hParentProcess As Long, ByVal InheritHandles As Long, ByVal hSection As Long, ByVal hDebugPort As Long, ByVal hExceptionPort As Long, ByVal reserv As LongAs Long
    
Dim hReturn As Long
    
    gclsHookNtCreateProcessEx.HookStatus 
False
    hReturn 
= NtCreateProcessEx(ProcessHandle, AccessMask, ObjectAttributes, glngSystemHandle, InheritHandles, hSection, hDebugPort, hExceptionPort, reserv)
    gclsHookNtCreateProcessEx.HookStatus 
True
    NtCreateProcessExCallback 
= hReturn
End Function

Public Function NtCreateProcessCallback(ByRef ProcessHandle As Long, ByVal AccessMask As Long, ByVal ObjectAttributes As Long, ByVal hParentProcess As Long, ByVal InheritHandles As Long, ByVal hSection As Long, ByVal hDebugPort As Long, ByVal hExceptionPort As LongAs Long
    
Dim hReturn As Long
    gclsHookNtCreateProcess.HookStatus 
False
    hReturn 
= NtCreateProcess(ProcessHandle, AccessMask, ObjectAttributes, glngSystemHandle, InheritHandles, hSection, hDebugPort, hExceptionPort)
    gclsHookNtCreateProcess.HookStatus 
True
    NtCreateProcessCallback 
= hReturn
End Function

Public Function GetFunAddr(lngFunAddr As LongAs Long
    GetFunAddr 
= lngFunAddr
End Function


modProcess.bas

Attribute VB_Name 
= "modProcess"
Option Explicit

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal Handle As LongAs Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As LongAs Long
Private Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As LongAs Long
Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As LongAs Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As LongAs Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As LongAs Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long '獲取當前進程句柄
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpBaseName As String, ByVal nSize As LongAs Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10

'Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const SYNCHRONIZE As Long = &H100000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)

Public Function GetSystemProcessId() As Long
    
Dim lngCbNeeded As Long
    
Dim lngNumElements As Long
    
Dim lngProcessIDArray() As Long
    
Dim lngCbNeeded2 As Long
    
Dim lngNumElements2 As Long
    
Dim Modules(0 To 1023As Long
    
Dim lngRet As Long
    
Dim lngSize As Long
    
Dim hProcess As Long
    
Dim i As Long, strModuleName As String
    
Dim lngModules As Long, hLen As Long
    
ReDim lngProcessIDArray(1024)
    lngRet 
= EnumProcesses(lngProcessIDArray(0), 4 * 1024, lngCbNeeded)
    lngNumElements 
= lngCbNeeded / 4
    
ReDim Preserve lngProcessIDArray(lngNumElements - 1)
    
On Error Resume Next
    
For i = 0 To lngNumElements - 1
        hProcess 
= OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, lngProcessIDArray(i))
        
If hProcess <> 0 And lngProcessIDArray(i) <> 4 Then
            lngRet 
= EnumProcessModules(hProcess, Modules(0), 1024, lngCbNeeded2)
            
If lngRet <> 0 Then
                strModuleName 
= String(260"*")
                lngRet 
= GetModuleFileNameExA(hProcess, Modules(0), strModuleName, 260)
                strModuleName 
= Left(strModuleName, lngRet)
            
End If
            
If InStr(LCase(strModuleName), "system32/smss.exe"Then
            
'If InStr(LCase(strModuleName), "system32/winlogon.exe") Then
                GetSystemProcessId = lngProcessIDArray(i)
                lngRet 
= CloseHandle(hProcess)
                
Exit Function
            
End If
        
End If
        lngRet 
= CloseHandle(hProcess)
    
Next
End Function

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章