Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.065 c
15-1147368073
ArtemESC
2006-05-11 21:21
2006.06.04
FAR


3-1144674511
kyn66
2006-04-10 17:08
2006.06.04
Вложенный Select


2-1147699621
Ironman83
2006-05-15 17:27
2006.06.04
Выборки через TIBDataset


2-1147603293
Andrey235
2006-05-14 14:41
2006.06.04
как заменить вайл используемый Виндой


1-1146450343
Nikolaich
2006-05-01 06:25
2006.06.04
проблема с порядком окон после активации подсказки