Главная страница
    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.036 c
15-1146655659
Александр Б.
2006-05-03 15:27
2006.06.04
Скрипты и дизайнер форм


2-1147861873
13
2006-05-17 14:31
2006.06.04
построение графика


15-1147352935
Alien1769
2006-05-11 17:08
2006.06.04
Вопросы по розрядной сортировке


2-1148150601
za4em
2006-05-20 22:43
2006.06.04
Координаты


4-1142103030
Handle
2006-03-11 21:50
2006.06.04
Процессы,окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский