実行中の別のプロセスのスタートアップ情報を取得することは可能ですか?最小化/最大化を実行し、ディレクトリで起動し、管理者として実行する必要がある場合は、cmd行の引数を調べたいと思います。特定のプロセスでSTARTUPINFOを取得
答えて
リモートプロセスから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);
}
これは、実際の質問があったものである「STARTUPINFO」を得るのに役立たない。 –
STARTUPINFOフィールドとRTL_USER_PROCESS_PARAMETERSフィールドを探してください。これはほぼ同じです。本当にSTARTUPINFOはRTL_USER_PROCESS_PARAMETERSから埋められます – RbMm
ドキュメンテーションには「ZwQueryInformationProcess関数とそれが返す構造体はオペレーティングシステムの内部にあり、Windowsのリリースから別のリリースに変更されることになっています。代わりにProcessInformationClassパラメータの説明に記載されているパブリック関数を使用する方がよい」 – theB
- 1. 実行中のプロセスのリストを取得し、特定のプロセス
- 2. C#特定のプロセス(パフォーマンスカウンター)からCPUとRAMを取得
- 3. コンテナの特定のプロセスでRAM、CPU、ネットワークの使用方法を取得する
- 4. C#で特定の子プロセスからのみキーボードストロークを取得する方法
- 5. Javaで特定のプロセスのRAM/CPU使用率を取得する
- 6. powershellを使用して特定のプロセスのCPU%を取得する
- 7. 特定のプロセスが実行されているプロセッサの数を取得
- 8. 特定のタイムゾーンでunixタイムスタンプを取得
- 9. AciTreeプラグインで特定のノードデータを取得
- 10. process.Totalprocessortimeを使用して特定のプロセスのプロセス時間を取得する方法
- 11. Bash/ps:特定のプロセスの実行中の "myscript.sh"子プロセスのPIDを取得する
- 12. 特定のドキュメントで特定のプロセスを閉じる方法C#
- 13. htopで特定のプロセス名を検索
- 14. 特定のデスクトップでプロセスを開始
- 15. Powershell Windows 2008で特定のプロセスをエクスポート
- 16. PowerShellプロセスのプロセスIDを取得する
- 17. Silverlightで特定ノードを取得Telerikツリービュー
- 18. 特定のデータセットのシードを取得
- 19. Java - 特定のクラスのオブジェクトを取得
- 20. 特定のDBpediaカテゴリのプロパティを取得
- 21. 特定のインスタンスのModelMetadataを取得
- 22. json内の特定のパラメータを取得
- 23. 特定のファイルの親ディレクトリを取得
- 24. 特定のアドレスの値を取得
- 25. ハッシュセットの特定の整数を取得
- 26. Pythonの特定の行を取得
- 27. Javaで特定のプロセスのCPU使用量を取得するための適切なコマンドラインは何ですか
- 28. C#で特定のサービスの子プロセスのリストを取得するにはどうすればよいですか?
- 29. XML、特定の値を取得
- 30. Google Charts - 特定の値を取得
1.ターゲットプロセスにコードを注入します。 2.ターゲットプロセスのコンテキストから 'GetStartupInfo()'と 'GetCommandLine()'を呼び出します。 3.データを元のプロセスに戻します。 –
@JonathanPotterご意見ありがとうございます。目的は、ボタンをクリックしてプロセスを起動する機能(正しい起動属性を持つ)をユーザーに提供することです。正しいスタートアップアトリビュートを得るためにコードを注入することは、アンチウィルスプログラムによって疑わしい/フラグが立てられるでしょうか? –
@JakeM:プロセスのコマンドラインは、プロセスの 'PEB'構造を読む(http://stackoverflow.com/a/11042947/65863)か、[WMI](https ://blogs.msdn.microsoft.com/oldnewthing/20091125-00/?p = 15923)。 –