Просмотр полной версии : Получение парамтеров запуска зная Pid
Сталкнулся с такой проблемой. Вот к примеру я знаю Pid процесса, как можно узнать параметры переданные этому процессу при запуске. Вообще в какую сторону копать?
У мну де-то программка была, которая узнавала параметры переданные процессу ну и не только...
Вообщем покопаюсь, если найду то выложу.;)
перехватывать нужно CreateProcessW, внутри нее параметр - lpCommandLine считывай, это параметры ком.строки
BOOL WINAPI CreateProcess(
__in LPCTSTR lpApplicationName,
__in_out LPTSTR lpCommandLine,
__in LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in LPVOID lpEnvironment,
__in LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
гыгыгы люблю античатовских кодеров
"как показать месагбокс?" - "перехватывай swapcontext, находи там потоки explorer, по нему explorer.exe, потом таблицу импорта, выдирай оттуда адрес MessageBoxA, копируй через IoAllocateMdl драйвером в свой процесс и запускай..."
если посмотреть на GetCommandLineA, можно заметить
7C812C8D > A1 F435887C MOV EAX,DWORD PTR DS:[7C8835F4]
7C812C92 C3 RETN
инфа хранится в PEB, открывай процесс по PID и читай оттуда все что хочешь, включая его STARTUPINFO и command line
Вообще, по хорошему, надо использовать
ZwQueryInformationProcess(), но т.к. вам это все равно не обьяснишь, придется сделать так:
(наверное для всех WinNT)
#define PID 1072 // PID of target process
static LPSTR szGetCommandLineA = "GetCommandLineA";
static LPSTR szKernel32 = "kernel32.dll";
static ULONG uRead;
static ULONG uCmdLineAddr;
LPSTR __declspec(naked) __stdcall getCommandLineProcess( ULONG uPid ) {
__asm {
push ebp
mov ebp, esp
call dword ptr [GetProcessHeap]
push MAX_PATH
push HEAP_ZERO_MEMORY
push eax
call dword ptr [HeapAlloc] // allocate heap
mov edi, eax
push dword ptr [uPid]
push 0
push PROCESS_VM_READ
call dword ptr [OpenProcess] // open process
test eax, eax
jz err
mov ebx, eax
push szKernel32
call dword ptr [GetModuleHandle]
push szGetCommandLineA
push eax
call dword ptr [GetProcAddress] // get addr of GetCommandLineA
mov eax, dword ptr [eax+1] // get operand of [GetCommandLineA] first instruction (mov eax, [...])
push offset uRead
push 4
push offset uCmdLineAddr
push eax
push ebx
call dword ptr [ReadProcessMemory] // read address of command line string
push offset uRead
push MAX_PATH
push edi
push dword ptr [uCmdLineAddr]
push ebx
call dword ptr [ReadProcessMemory] // read command line
pop ebp
jmp e
err:
and eax, 0 // error
e:
mov eax, edi // ok
retn 4
}
}
LPSTR szCmdLine = getCommandLineProcess( PID );
MessageBox( 0,
szCmdLine,
"Cmd line of process",
MB_ICONINFORMATION );
HeapFree( GetProcessHeap(), 0, szCmdLine );
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot