Форум: "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 Thenif hProcess = 0 then
> if not ReadProcessMemory(..., ..., @wBuf, ..., ...) thenif not ReadProcessMemory(..., ..., wBuf, ..., ...) then
> Var
> wstr:WideChar;
> begin
> if GetProcessCmdLine(2972,wstr,1) then
> ShowMessage(wstr);
> endvar
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