2016-07-11 6 views
6

実行中の別のプロセスのスタートアップ情報を取得することは可能ですか?最小化/最大化を実行し、ディレクトリで起動し、管理者として実行する必要がある場合は、cmd行の引数を調べたいと思います。特定のプロセスでSTARTUPINFOを取得

+1

1.ターゲットプロセスにコードを注入します。 2.ターゲットプロセスのコンテキストから 'GetStartupInfo()'と 'GetCommandLine()'を呼び出します。 3.データを元のプロセスに戻します。 –

+0

@JonathanPotterご意見ありがとうございます。目的は、ボタンをクリックしてプロセスを起動する機能(正しい起動属性を持つ)をユーザーに提供することです。正しいスタートアップアトリビュートを得るためにコードを注入することは、アンチウィルスプログラムによって疑わしい/フラグが立てられるでしょうか? –

+3

@JakeM:プロセスのコマンドラインは、プロセスの 'PEB'構造を読む(http://stackoverflow.com/a/11042947/65863)か、[WMI](https ://blogs.msdn.microsoft.com/oldnewthing/20091125-00/?p = 15923)。 –

答えて

2

リモートプロセスからRTL_USER_PROCESS_PARAMETERSを読み込む必要があります。これはこのようにすることができます

NTSTATUS GetProcessParameters(PCLIENT_ID pcid, PUNICODE_STRING CommandLine) 
{ 
    HANDLE hProcess; 
    NTSTATUS status; 

    static OBJECT_ATTRIBUTES zoa = { sizeof(zoa)}; 

    if (0 <= (status = ZwOpenProcess(&hProcess, PROCESS_VM_READ|PROCESS_QUERY_INFORMATION, &zoa, pcid))) 
    { 
     PROCESS_BASIC_INFORMATION pbi; 
     _RTL_USER_PROCESS_PARAMETERS ProcessParameters, *pv; 
     if (0 <= (status = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), 0))) 
     { 
      if (
       (0 <= (status = ZwReadVirtualMemory(hProcess, (_PEB*)&pbi.PebBaseAddress->ProcessParameters, &pv, sizeof(pv), 0))) 
       && 
       (0 <= (status = ZwReadVirtualMemory(hProcess, pv, &ProcessParameters, sizeof(ProcessParameters), 0))) 
       ) 
      { 
       if (ProcessParameters.CommandLine.Length) 
       { 
        if (CommandLine->Buffer = (PWSTR)LocalAlloc(0, ProcessParameters.CommandLine.Length + sizeof(WCHAR))) 
        { 
         if (0 > (status = ZwReadVirtualMemory(hProcess, ProcessParameters.CommandLine.Buffer, CommandLine->Buffer, ProcessParameters.CommandLine.Length, 0))) 
         { 
          LocalFree(CommandLine->Buffer); 
         } 
         else 
         { 
          CommandLine->MaximumLength = (CommandLine->Length = ProcessParameters.CommandLine.Length) + sizeof(WCHAR); 
          *(PWSTR)RtlOffsetToPointer(CommandLine->Buffer, ProcessParameters.CommandLine.Length) = 0; 
         } 
        } 
        else 
        { 
         status = STATUS_INSUFFICIENT_RESOURCES; 
        } 
       } 
      } 
     } 
     ZwClose(hProcess); 
    } 
    return status; 
} 
    UNICODE_STRING CommandLine; 
    if (0 <= GetProcessParameters(&cid, &CommandLine)) 
    { 
     DbgPrint("CommandLine=%wZ\n", &CommandLine); 
     LocalFree(CommandLine.Buffer); 
    } 
+0

これは、実際の質問があったものである「STARTUPINFO」を得るのに役立たない。 –

+0

STARTUPINFOフィールドとRTL_USER_PROCESS_PARAMETERSフィールドを探してください。これはほぼ同じです。本当にSTARTUPINFOはRTL_USER_PROCESS_PARAMETERSから埋められます – RbMm

+1

ドキュメンテーションには「ZwQueryInformationProcess関数とそれが返す構造体はオペレーティングシステムの内部にあり、Windowsのリリースから別のリリースに変更されることになっています。代わりにProcessInformationClassパラメータの説明に記載されているパブリック関数を使用する方がよい」 – theB

関連する問題