![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Параметры коммандной строки чужего процесса [D2, D3, D4, D5, D6, NT4, Win2k, WinXP]
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