Получить параметры запуска запущенного стороннего процесса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
emlen
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 04.06.2006 (Вс) 19:36

Получить параметры запуска запущенного стороннего процесса

Сообщение emlen » 21.10.2014 (Вт) 23:31

Доброго времени суток! Подскажите пожалуйста, в vb6 есть возможность получить полную CommandLine, со всеми параметрами, которая была использована при запуске целевого процесса, как -то в ProcessExplorer're. Если да, то направьте плиз на путь истинный, желательно с пом-ю ф-ий win32api. Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить параметры запуска запущенного стороннего процес

Сообщение Хакер » 21.10.2014 (Вт) 23:37

Издеваешься?
Командную строку без argv[0] возвращает встроенная функция Command$.
Полностью — WinAPI-функция GetCommandLine.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Получить параметры запуска запущенного стороннего процес

Сообщение The trick » 21.10.2014 (Вт) 23:47

Параметры запуска стороннего процесса можно получить из PEB этого процесса. Только учти, для 64 разрядных процессов нужно использовать NtWow64QueryInformationProcess64
NtWow64ReadVirtualMemory64, если ты хочешь узнать из 32-разрядного, а также смещения полей структур будут другие в соответствии с PEB64.
Для 32-битного процесса:
Код: Выделить всё
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
Последний раз редактировалось The trick 22.10.2014 (Ср) 10:31, всего редактировалось 3 раз(а).
UA6527P

emlen
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 04.06.2006 (Вс) 19:36

Re: Получить параметры запуска запущенного стороннего процес

Сообщение emlen » 21.10.2014 (Вт) 23:48

Хакер писал(а):Издеваешься?
Командную строку без argv[0] возвращает встроенная функция Command$.
Полностью — WinAPI-функция GetCommandLine.

Эммм.. Спасибо за оперативность и извиняюсь, я наверное не совсем корректно процесс назвал целевым, надо было уточнить, что он сторонний.. Просто по окошку удается выявить процесс, а вот параметры с которыми он был запущен не выходит(

emlen
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 04.06.2006 (Вс) 19:36

Re: Получить параметры запуска запущенного стороннего процес

Сообщение emlen » 22.10.2014 (Ср) 10:26

The trick писал(а):Параметры запуска стороннего процесса можно получить из PEB этого процесса. Только учти, для 64 разрядных процессов нужно использовать NtWow64QueryInformationProcess64
NtWow64ReadVirtualMemory64, если ты хочешь узнать из 32-разрядного, а также смещения полей структур будут другие в соответствии с PEB64.

Уважаемый The trick, там код обрывается на самом вкусном, после объявления переменных в ключевой функции GetCommandLineFromPID. Не могли бы Вы, если не сложно, подкорректировать предыдущее сообщение. Спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 57

    TopList