Получение парамтеров запуска зная Pid

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 3 Oct 2007.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Сталкнулся с такой проблемой. Вот к примеру я знаю Pid процесса, как можно узнать параметры переданные этому процессу при запуске. Вообще в какую сторону копать?
     
  2. a1ex

    a1ex Banned

    Joined:
    11 Oct 2006
    Messages:
    517
    Likes Received:
    130
    Reputations:
    -13
    У мну де-то программка была, которая узнавала параметры переданные процессу ну и не только...
    Вообщем покопаюсь, если найду то выложу.;)
     
    1 person likes this.
  3. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    перехватывать нужно CreateProcessW, внутри нее параметр - lpCommandLine считывай, это параметры ком.строки

    Code:
    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
    );
     
  4. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    гыгыгы люблю античатовских кодеров

    "как показать месагбокс?" - "перехватывай swapcontext, находи там потоки explorer, по нему explorer.exe, потом таблицу импорта, выдирай оттуда адрес MessageBoxA, копируй через IoAllocateMdl драйвером в свой процесс и запускай..."

    если посмотреть на GetCommandLineA, можно заметить
    инфа хранится в PEB, открывай процесс по PID и читай оттуда все что хочешь, включая его STARTUPINFO и command line
     
    2 people like this.
  5. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Вообще, по хорошему, надо использовать
    ZwQueryInformationProcess(), но т.к. вам это все равно не обьяснишь, придется сделать так:
    (наверное для всех WinNT)

    Code:
    #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 );