Option Explicit
Private Type PROCESS_BASIC_INFORMATION
ExitStatus As Long
PebBaseAddress As Long
AffinityMask As Long
BasePriority As Long
UniqueProcessId As Long
InheritedFromUniqueProcessId As Long
End Type
Private Type UNICODE_STRING
Length As Integer
MaxLength As Integer
lpBuffer As Long
End Type
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function NtQueryInformationProcess Lib "ntdll" (ByVal ProcessHandle As Long, ByVal InformationClass As Long, ByRef ProcessInformation As Any, ByVal ProcessInformationLength As Long, ByRef ReturnLength As Any) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Const PROCESS_QUERY_INFORMATION As Long = &H400&
Private Const PROCESS_VM_READ As Long = &H10&
Private Sub Form_Load()
MsgBox GetCommandLineFromPID(2956)
End Sub
Private Function GetCommandLineFromPID(PID As Long) As String
Dim hProcess As Long
Dim pbi As PROCESS_BASIC_INFORMATION
Dim lpPP As Long ' Указатель на параметры процесса
Dim cmd As UNICODE_STRING ' Структура для хранения юникодной строки
' Получаем хендл
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, PID)
If hProcess Then
' Получаем указатель на PEB
If NtQueryInformationProcess(hProcess, 0, pbi, Len(pbi), ByVal 0) Then Exit Function
' Получаем указатель на параметры процесса
If ReadProcessMemory(hProcess, ByVal pbi.PebBaseAddress + &H10, lpPP, 4, 0) = 0 Then Exit Function
' Получаем структуру UNICODE_STRING содержащую коммандную строку
If ReadProcessMemory(hProcess, ByVal lpPP + &H40, cmd, Len(cmd), 0) = 0 Then Exit Function
' Читаем строку
GetCommandLineFromPID = Space(cmd.Length \ 2) ' Выделяем буфер достаточной длины
If ReadProcessMemory(hProcess, ByVal cmd.lpBuffer, ByVal StrPtr(GetCommandLineFromPID), cmd.Length, 0) = 0 Then Exit Function
CloseHandle hProcess
End If
End Function
Хакер писал(а):Издеваешься?
Командную строку без argv[0] возвращает встроенная функция Command$.
Полностью — WinAPI-функция GetCommandLine.
The trick писал(а):Параметры запуска стороннего процесса можно получить из PEB этого процесса. Только учти, для 64 разрядных процессов нужно использовать NtWow64QueryInformationProcess64
NtWow64ReadVirtualMemory64, если ты хочешь узнать из 32-разрядного, а также смещения полей структур будут другие в соответствии с PEB64.
Сейчас этот форум просматривают: Yandex-бот и гости: 60