Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

Как узнать командную строку чужого процесса   Найти похожие ветки 

 
Arazel ©   (2006-03-12 06:59) [0]

зная PID или Handel


 
begin...end ©   (2006-03-12 09:52) [1]

Вызвать GetCommandLine в чужом процессе и скопировать строку, указатель на которую она возвратит, в свой процесс.

Можно также воспользоваться функцией NtQueryInformationProcess, которая возвратит, в том числе, и адрес структуры Process Environment Block (PEB) -- в этом блоке, помимо прочего, находится и командная строка. Читать её оттуда, разумеется, нужно с помощью ReadProcessMemory.

Есть и другие способы: http://rsdn.ru/Forum/?mid=18652


 
Arazel ©   (2006-03-12 10:43) [2]

Супер!!! Мне больше всего понравилось
Process Environment Block (PEB) :)

Ну, я пока с этим всем разбирусь, вы отвечайте :)))


 
Arazel ©   (2006-03-12 15:50) [3]

Вообщем не фига не получается... :(

Вот что я смог:

unit CmdLine2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

CONST ProcessBasicInformation = 0;

TYPE
PUNICODE_STRING = ^UNICODE_STRING;
UNICODE_STRING = packed record
   Length: Word;
   MaximumLength: Word;
   Buffer: PWideChar;
end;

PPROCESS_BASIC_INFORMATION = ^PROCESS_BASIC_INFORMATION;
PROCESS_BASIC_INFORMATION = packed record
  ExitStatus: BOOL;
  PebBaseAddress: pointer;
  AffinityMask: PULONG;
  BasePriority: dword;
  UniqueProcessId: ULONG;
  InheritedFromUniqueProcessId: ULONG;
 end;

PPROCESS_PARAMETERS = ^PROCESS_PARAMETERS;
PROCESS_PARAMETERS = packed record
       AllocationSize          :ULONG;
       ActualSize              :ULONG;
       Flags                   :ULONG;
       Unknown1                :ULONG;
       Unknown2:    UNICODE_STRING ;
       InputHandle:    THANDLE         ;
       OutputHandle:    THANDLE         ;
       ErrorHandle:    THANDLE         ;
       CurrentDirectory:    UNICODE_STRING ;
       CurrentDirectoryHandle:    THANDLE         ;
       SearchPaths:    UNICODE_STRING ;
       ApplicationName:    UNICODE_STRING ;
       CommandLine:    UNICODE_STRING ;
       EnvironmentBlock:    PWORD          ;
       X: DWORD;
       Y: DWORD;
       XSize: DWORD;
       YSize: DWORD;
       XCountChars: DWORD;
       YCountChars: DWORD;
       FillAttribute: DWORD;
       Flags2: DWORD;
       ShowWindow: WORD;
       Reserved2: WORD;
       Title: UNICODE_STRING;
       Desktop: UNICODE_STRING;
       Reserved3: UNICODE_STRING;
       Reserved4: UNICODE_STRING;
END;
TPEB=packed record
AllocationSize:ULONG;
Unknown1:ULONG;
ProcessHinstance:DWORD;
ListDlls:PWORD;
ProcessParameters:PPROCESS_PARAMETERS ;
SubSystemData: ULONG;
Heap:THANDLE;
END;

Function NtQueryInformationProcess(
                               ProcessHandle:THANDLE;
                               ProcessInformationClass:DWORD;
                               ProcessInformation:pointer;
                               ProcessInformationLength:ULONG;
                               ReturnLength: PULONG):DWORD;stdcall;
                               external "ntdll.dll";

VAR
   status                    : DWORD;
   hProcess                  : DWORD;
   pbi                       : PROCESS_BASIC_INFORMATION;
   PEB                       : TPEB;
   ProcParam                 : PROCESS_PARAMETERS;
   dwDummy                   : DWORD;
   dwSize                    : DWORD;
   lpAddress                 : PWideChar;
   bRet                      : BOOL;

Function GetProcessCmdLine(dwProcessId:DWORD;  wBuf:WideChar; dwBufLen:DWORD):Boolean;
Label cleanup;
Begin
 hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE,dwProcessId);
 if hProcess <> 0 Then
  status := NtQueryInformationProcess( hProcess,0,
                                       @pbi,
                                       sizeof(PROCESS_BASIC_INFORMATION),
                                       0
                                       );
if status = 0 Then
goto cleanup;
  if not ReadProcessMemory( hProcess,
                           pbi.PebBaseAddress,
                           @Peb,
                           sizeof(PEB),
                           dwDummy) then
      goto cleanup;

   if not ReadProcessMemory( hProcess,
                           Peb.ProcessParameters,
                           @ProcParam,
                           sizeof(PROCESS_PARAMETERS),
                           dwDummy) then
      goto cleanup;

   lpAddress := ProcParam.CommandLine.Buffer;
   dwSize := ProcParam.CommandLine.Length;

   if (dwBufLen < dwSize) then
      goto cleanup;

   if not ReadProcessMemory( hProcess,
                           lpAddress,
                           @wBuf,
                           dwSize,
                           dwDummy
                         )  then
      goto cleanup;
   bRet := TRUE;

cleanup:
   CloseHandle (hProcess);
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
wstr:WideChar;
begin
if GetProcessCmdLine(2972,wstr,1) then
ShowMessage(wstr);
end;

end.


 
n0name   (2006-03-12 16:58) [4]


program GetProcCmdLine;

uses
Windows;

function NtQueryInformationProcess(hProcess: THandle; ProcessInfoClass: Integer; ProcessInfoBuffer: Pointer;
ProcessInfoBufferLength: Cardinal; BytesReturned: PCardinal): integer; stdcall; external "ntdll.dll";

function GetCommandLine(pID: DWORD): PWChar;
label err;
var
pbi: array [0..5] of DWORD;
hProc: THandle;
pProcParams: DWORD;
wCmdLen: WORD;
pCmdLine: DWORD;
br: DWORD;
begin
result := nil;
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, pID);
if NtQueryInformationProcess(hProc, 0, @pbi, $18, nil) <> 0 then goto err;
if not ReadProcessMemory(hProc, Pointer(pbi[1] + $10), @pProcParams, 4, br) then goto err;
if not ReadProcessMemory(hProc, Pointer(pProcParams + $40), @wCmdLen, 2, br) then goto err;
if not ReadProcessMemory(hProc, Pointer(pProcParams + $44), @pCmdLine, 4, br) then goto err;
result := GetMemory(wCmdLen);
if result = nil then goto err;
if not ReadProcessMemory(hProc, Pointer(pCmdLine), result, wCmdLen, br) then
 begin
  FreeMemory(result);
  result := nil;
 end;
err:
CloseHandle(hProc);
end;

begin
MessageBoxW(0, GetCommandLine(1028), "Command line is:", 0);
end.


У меня получился такой код.


 
begin...end ©   (2006-03-12 17:39) [5]

> Arazel ©   (12.03.06 15:50) [3]

> Function GetProcessCmdLine(...; wBuf:WideChar; ...)
function GetProcessCmdLine(...; wBuf: PWideChar; ...)

> if hProcess <> 0 Then
if hProcess = 0 then

> if not ReadProcessMemory(..., ..., @wBuf, ..., ...) then
if not ReadProcessMemory(..., ..., wBuf, ..., ...) then

> Var
> wstr:WideChar;
> begin
> if GetProcessCmdLine(2972,wstr,1) then
> ShowMessage(wstr);
> end

var
 pWStr: PWideChar;
begin
 GetMem(pWStr, (MAX_PATH + 1) * 2);
 try
   if GetProcessCmdLine(..., pWStr, (MAX_PATH + 1) * 2) then
     ShowMessage(pWStr)
 finally
   FreeMem(pWStr)
 end
end


А после последнего вызова ReadProcessMemory надо, похоже, добавить wBuf[dwSize div 2 - 1] := #0.

И это только то, что заметно сразу.
Стоило ли в таком случае заниматься кулхацкерством, или лучше было использовать более простые методы?


 
n0name   (2006-03-12 18:59) [6]


> if hProcess = 0 then

нет.

В остальном true.


 
Arazel ©   (2006-03-12 20:11) [7]

ok.

А как узнать в какое время был запущен процесс?


 
begin...end ©   (2006-03-12 20:46) [8]

> n0name   (12.03.06 18:59) [6]

Да, я ошибся, конечно. Хотел написать про status: в [3] if status = 0 нужно заменить на if status <> 0.


 
birt   (2006-03-13 23:21) [9]

http://forum.vingrad.ru/index.php?showtopic=38334&view=findpost&p=289762



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.049 c
2-1148034482
VEZ
2006-05-19 14:28
2006.06.04
raise in Constructor


15-1147345875
Slava812
2006-05-11 15:11
2006.06.04
Цвета в Delphi


15-1147070109
Nic
2006-05-08 10:35
2006.06.04
Задача со строками


2-1148049001
GanibalLector
2006-05-19 18:30
2006.06.04
Grids.pas


2-1148115210
DesperadO666
2006-05-20 12:53
2006.06.04
DBComboBox или ComboBox что поможет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский