Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Параметры коммандной строки чужего процесса [D2, D3, D4, D5, D6, NT4, Win2k, WinXP]


Страницы:   1 2

iptower ©   (2002-08-30 12:47:00) 

Как узнать параметры коммандной строки чужего процесса под WIN NT


Ученик   (2002-08-30 19:31:00) [21]

Вариант в Delphi

function AdjustDebugPriviliges : Bool;
var
hTok : THandle;
tp : TTokenPrivileges;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hTok) then try
if LookupPrivilegeValue(nil, "SeDebugPrivilege", tp.Privileges[0].Luid) then begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(hTok, False, tp, 0, PTokenPrivileges(nil)^, PDWord(nil)^)
end
finally
CloseHandle(hTok)
end
end;

function GetProcessCommandLine(dwProcessID : DWord; szBuffer : PChar; cbBuffer : DWORD) : Bool;
var
hProcess, hThread : THandle;
pGetCommandLine : Pointer;
pCommandLine : PChar;
dwRead, dwTID : DWord;
begin
Result := FALSE;
hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_READ or PROCESS_VM_OPERATION,
FALSE, dwProcessID);
if (hProcess <> 0) then try
pGetCommandLine := GetProcAddress(GetModuleHandle("kernel32.dll"), "GetCommandLineA");
if (pGetCommandLine <> nil) then begin
hThread := CreateRemoteThread(hProcess, NIL, 0, pGetCommandLine, nil, 0, dwTID);
if (hThread <> 0) then try
if WAIT_OBJECT_0 = WaitForSingleObject(hThread, 10000) then begin
if GetExitCodeThread(hThread, PDWord(@pCommandLine)^) then begin
if ReadProcessMemory(hProcess, pCommandLine, szBuffer, cbBuffer, dwRead) then begin
szBuffer[dwRead] := #0;
Result := TRUE
end
end
end
finally
CloseHandle(hThread)
end
end
finally
CloseHandle(hProcess)
end
end;

procedure TForm1.Button1Click(Sender: TObject);
var
szBuffer : array[0..255] of Char;
begin
AdjustDebugPriviliges;
if GetProcessCommandLine(StrToInt(Edit1.Text), szBuffer, 255) then
ShowMessage(szBuffer)
end;


paul_shmakov   (2002-08-30 18:56:00) [22]

а если самостоятельно программно, то вот я набросал пример (сорри, что на C):

//
// rcmdline.cpp
// Get process command line NT/W2K/XP
// Paul Shmakov
//
#include
#include
#include

BOOL GetProcessCommandLine(DWORD dwProcessID, LPTSTR szBuffer, DWORD cbBuffer)
{
BOOL bRes = FALSE;

HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_READ | PROCESS_VM_OPERATION,
/*PROCESS_ALL_ACCESS,*/ FALSE, dwProcessID);

if(hProcess)
{
#ifndef UNICODE
#define GETCOMMANDLINE "GetCommandLineA"
#else
#define GETCOMMANDLINE "GetCommandLineW"
#endif // UNICODE

LPVOID pGetCommandLine = GetProcAddress(GetModuleHandle(_T("kernel32.dll")),
GETCOMMANDLINE);

if(pGetCommandLine)
{
DWORD dwTID;

HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)pGetCommandLine, 0, 0, &dwTID);

if(hThread)
{
if(WAIT_OBJECT_0 == WaitForSingleObject(hThread, 10000))
{
LPCSTR pCommandLine = 0;
if(GetExitCodeThread(hThread, (LPDWORD)&pCommandLine))
{
DWORD dwRead;
if(ReadProcessMemory(hProcess, pCommandLine, szBuffer,
cbBuffer, &dwRead))
{
szBuffer[dwRead] = 0;
bRes = TRUE;
}
}
}

CloseHandle(hThread);
}
}

CloseHandle(hProcess);
}

return bRes;
}

BOOL AdjustDebugPriviliges(void)
{
BOOL bRes = FALSE;

HANDLE hTok;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hTok))
{
LUID luid;
TOKEN_PRIVILEGES tp;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bRes = AdjustTokenPrivileges(hTok, FALSE, &tp, NULL, NULL, NULL);

CloseHandle(hTok);
}

return bRes;
}

int _tmain(int argc, char* argv[])
{
if(argc > 1)
{
DWORD dwPID = atoi(argv[1]);
char szCmdLine[1000];

// Needed only to obtain command line of system processes
AdjustDebugPriviliges();

if(GetProcessCommandLine(dwPID, szCmdLine, sizeof(szCmdLine) / sizeof(szCmdLine[0])))
{
printf("Process %d command line: %s\n", dwPID, szCmdLine);
}
else
printf("Failed to obtain command line of process %d\n", dwPID);
}
else
printf("Usage: rcmdline \n");

return 0;
}

работать будет только под nt/2k/xp, т.к. использует CreateRemoteThread. если нужно решение для всех версий, то без dll дополнительной не обойтись.
пишите dll, которая во время своей инициализации вызывает GetCommandLine и выводит его куда-нибудь или в вызывающий процесс передает.
из своего процесса внедряете эту dll в чужой процесс тем или иным способом.


Игорь Шевченко   (2002-08-30 14:05:00) [23]

It"s top secret :-)

www.sysinternals.com - Process Explorer


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо