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

Вниз

Командная строка процесса   Найти похожие ветки 

 
FireHack ©   (2003-10-08 12:35) [0]

Усем привет!!!

Возможно ли узнать с какой командной строкой был создан тот или иной процесс - ессесно, НЕ свой собственный.

Всем спасибо.


 
Игорь Шевченко ©   (2003-10-08 12:58) [1]

Возможно.
Я думаю, не составит труда убрать HWnd а вместо него поставить нужные параметры


{ Получение командной строки для процесса выбранного окна }
function HSGetWindowCommandLine (AWindowHandle : HWND) : String;
const
PEBAddress = $7FFDF000;
var
AProcessID : DWORD;
AProcessHandle : THandle;
ATargetProcessParametersPointer : Ptr32;
ATargetProcessParameters : TRTL_USER_PROCESS_PARAMETERS;
ATargetCommandLine : array[0..MAX_PATH] of WideChar;
AReturned : DWORD;
APathBytes : WORD;
begin
Result := "";
{ Алгоритм пригоден только для NT-платформ }
if Win32Platfrom = VER_PLATFORM_WIN32_NT then begin
{ PID для процесса, создавшего окно }
{$IFDEF VER140}
GetWindowThreadProcessID(AWindowHandle, AProcessID);
{$ELSE}
GetWindowThreadProcessID(AWindowHandle, @AProcessID);
{$ENDIF}
{ handle этого процесса }
AProcessHandle := OpenProcess(PROCESS_VM_READ, false, AProcessID);
if AProcessHandle = 0 then
RaiseLastWin32Error();
try
{ Получение адреса структуры параметров процесса }
if NOT ReadProcessMemory(AProcessHandle,
{ Этот оператор нужен для подсчета смещения в блоке
PEB на указатель на параметры процесса }
@PPEB(PEBAddress)^.ProcessParameters,
@ATargetProcessParametersPointer, SizeOf(Ptr32),
AReturned) then
RaiseLastWin32Error();
{ Проверка избыточна, но вставлена для пущей надежности. }
if AReturned <> SizeOf(Pointer) then
raise Exception.CreateFmt(
"ReadProcessMemory прочитала неверное количество данных, ожидалось %d, получено %d",
[SizeOf(Ptr32), AReturned]);
{ Получение структуры параметров процесса }
if not ReadProcessMemory(AProcessHandle, ATargetProcessParametersPointer,
@ATargetProcessParameters,
SizeOf(ATargetProcessParameters),
AReturned) then
RaiseLastWin32Error();
{ Проверка избыточна, но вставлена для пущей надежности. }
if AReturned <> SizeOf(ATargetProcessParameters) then
raise Exception.CreateFmt(
"ReadProcessMemory прочитала неверное количество данных, ожидалось %d, получено %d",
[SizeOf(ATargetProcessParameters), AReturned]);
{ размер командной строки в байтах }
APathBytes := ATargetProcessParameters.CommandLine.Length;
if APathBytes > MAX_PATH * SizeOf(WideChar) then
APathBytes := MAX_PATH * SizeOf(WideChar);
{ Получение командной строки для указанного процесса }
if not ReadProcessMemory(AProcessHandle,
ATargetProcessParameters.CommandLine.Buffer,
@ATargetCommandLine,
APathBytes,
AReturned) then
RaiseLastWin32Error();
{ Для преобразования в Ansi подсчитывается число символов Unicode без
завершающего нуля. lstrlenW почему-то дала неверный результат. Странно.}
Result := WideCharLenToString(ATargetCommandLine,
Pred(AReturned div SizeOf(WideChar)));
finally
CloseHandle(AProcessHandle);
end;
end;
end;


 
Игорь Шевченко ©   (2003-10-08 12:59) [2]

И описание структур:
{ Структура UNICODE_STRING - Передача строковых параметров для Native API и
хранение строк во внутренних структурах Windows }
type
TUNICODE_STRING = packed record
Length : WORD;
MaximumLength : WORD;
Buffer : PWideChar;
end;

type
{ Переопределение типов }
UChar = Byte;
Ptr32 = Pointer;
Uint4B = Cardinal;
{ Текущий каталог }
type
TCURDIR = packed record
DosPath : TUNICODE_STRING;
Handle : Ptr32;
end;
{ User Process Parameters - пользовательские параметры процесса }
type
TRTL_USER_PROCESS_PARAMETERS = packed record
MaximumLength : Uint4B;
Length : Uint4B;
Flags : Uint4B;
DebugFlags : Uint4B;
ConsoleHandle : Ptr32;
ConsoleFlags : Uint4B;
StandardInput : Ptr32;
StandardOutput : Ptr32;
StandardError : Ptr32;
CurrentDirectory : TCURDIR;
DllPath : TUNICODE_STRING;
ImagePathName : TUNICODE_STRING;
CommandLine : TUNICODE_STRING;
Environment : Ptr32;
StartingX : Uint4B;
StartingY : Uint4B;
CountX : Uint4B;
CountY : Uint4B;
CountCharsX : Uint4B;
CountCharsY : Uint4B;
FillAttribute : Uint4B;
WindowFlags : Uint4B;
ShowWindowFlags : Uint4B;
WindowTitle : TUNICODE_STRING;
DesktopInfo : TUNICODE_STRING;
ShellInfo : TUNICODE_STRING;
RuntimeData : TUNICODE_STRING;
end;

PRTL_USER_PROCESS_PARAMETERS = ^TRTL_USER_PROCESS_PARAMETERS;
{ Process Environment Block - блок окружения процесса }
type
TPEB = packed record
InheritedAddressSpace : UChar;
ReadImageFileExecOptions : UChar;
BeingDebugged : UChar;
SpareBool : UChar;
Mutant : Ptr32;
ImageBaseAddress : Ptr32;
Ldr : Ptr32;
ProcessParameters : PRTL_USER_PROCESS_PARAMETERS;
SubSystemData : Ptr32;
ProcessHeap : Ptr32;
{ Остальные данные опущены }
end;

PPEB = ^TPEB;



 
FireHack ©   (2003-10-08 14:11) [3]

Ну что ж, в который раз - спасибо!



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
8-11635
Darlock
2003-08-06 17:22
2003.12.04
Текст с белой каемочкой


6-11692
Виноградов Алексей
2003-10-03 19:14
2003.12.04
Сервер на TServersocket и несколько клиентов.Многопоточность (+)


6-11652
undersun
2003-10-07 12:36
2003.12.04
Подсчёт трафика


6-11656
ИМХО
2003-10-07 23:56
2003.12.04
Достучаться до заголовков письма в MS Outlook?


4-11739
Pavels
2003-10-11 13:57
2003.12.04
проблема с создание окна