VB6 時代遠端執行緒注入代碼在 XP 正常,移植至 VB.NET 2008 在 Vista 多核心環境失效。重寫基類解決相容性與記憶體對齊問題。
RemoteProcess = Process.GetProcessById(PID)
AllocBaseAddress = VirtualAllocEx(RemoteProcess.Handle, 0, &H1000,
MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
' 代碼區寫入輔助方法
Protected Sub AddInt2Code(val As Integer)
Dim bytes = BitConverter.GetBytes(val)
Add2Memory(bytes, PtrAddressOffset)
PtrAddressOffset += 4
End Sub
Protected Sub AddByte2Code(val As Byte) ...
Protected Sub AddBytes2Code(bytes As Byte()) ...
' 資料區寫入並記錄位址/長度 (4 位元組對齊)
Protected Function AddData(bytes As Byte()) As Integer
Add2Memory(bytes, ObjAddressOffset)
Dim odata As New mData With {.prt = ObjAddressOffset + AllocBaseAddress, .len = bytes.Length}
DataArraylist.Add(odata)
ObjAddressOffset += bytes.Length + (ObjAddressOffset Mod 4)
Return ObjAddressOffset
End Function
Function Run() As Integer
Dim hThread = CreateRemoteThread(RemoteProcess.Handle, 0, 0, AllocBaseAddress, 0, 0, 0)
WaitForSingleObject(hThread, INFINITE)
GetExitCodeThread(hThread, lngRet)
Return lngRet
End Function
Protected Overrides Sub Finalize()
VirtualFreeEx(RemoteProcess.Handle, AllocBaseAddress, MEM_AUTOFREE, MEM_RELEASE)
MyBase.Finalize()
End Sub
Imports System.Runtime.InteropServices
Public Class RunRemoteASMCode
Private Const MEM_SIZE = &H1000
Private Const INFINITE = -1
Private Const MEM_COMMIT = &H1000, MEM_RESERVE = &H2000, MEM_RELEASE = &H8000
Private Const PAGE_EXECUTE_READWRITE = &H40
Protected AllocBaseAddress As Integer
Protected RemoteProcess As Process
Protected PtrAddressOffset As Integer = 0
Protected ObjAddressOffset As Integer = 512
Protected DataArraylist As New ArrayList
Sub New(PID As Integer)
RemoteProcess = Process.GetProcessById(PID)
AllocBaseAddress = VirtualAllocEx(RemoteProcess.Handle, 0, MEM_SIZE,
MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
ClearCodeAndData()
End Sub
Protected Sub Add2Memory(bytes As Byte(), offset As Integer)
WriteProcessMemory(RemoteProcess.Handle, AllocBaseAddress + offset, bytes, bytes.Length, 0)
End Sub
' ... AddInt2Code, AddByte2Code, AddBytes2Code, AddData, Run, ClearCodeAndData, Finalize
Protected Class mData
Public prt As Integer
Public len As Integer
End Class
End Class
表單按鈕點擊:
api = New RunRemoteAPI(PID)
TextBox3.Text = Hex(api.CallRemoteAPIByName("kernel32", "LoadLibraryA", _
New mFuncParam(Encoding.ASCII.GetBytes("c:\test.dll"))))
TextBox2.Text = Hex(api.BaseAddress)
' 列舉模組驗證 DLL 已注入
api.CallRemoteAPIByName("kernel32", "FreeLibrary", New mFuncParam(CInt("&H" & TextBox3.Text)))
' 再次列舉確認已卸載

