2016-05-17 79 views
-1

我在使用PowerShell直接从PEB读取指定进程的命令行时遇到了麻烦。我正在使用NtQueryInformationProcess获取PROCESS_BASIC_INFORMATION数据。没有WMI的进程命令行

# $proc - process handle 
if ($NtQueryInformationProcess(
    $proc, 0, $PROCESS_BASIC_INFORMATION, [Runtime.InteropServices.Marshal]::SizeOf(
    $PROCESS_BASIC_INFORMATION 
), [IntPtr]::Zero 
))) -eq 0) { 
    # pointer to RTL_USER_PROCESS_PARAMETERS 
    $ptr = [Runtime.InteropServices.Marshal]::ReadIntPtr($PROCESS_BASIC_INFORMATION.PebBaseAddress, 0x10) 
    # pointer to CommandLine field of structure above 
    $ptr = [Runtime.InteropServices.Marshal]::ReadIntPtr($ptr, 0x40) 
    # how to get CommandLine field (UNICODE_STRING structure)? 
} 

所有的指针是正确的,但我不知道如何阅读带有元帅类型的CommandLine字段。有任何想法吗?

+0

此示例感觉不完整。什么是'$ NtQuerInformationProcess'? '$'是用于变量而'()'用于方法? –

+0

阅读http://stackoverflow.com/help/mcve –

+0

如果您还没有回答有问题,请不要发布,请。 – kate

回答

0

尽管标题中显示“没有WMI”,但我仍然推荐使用WMI,因为它更容易使用。防爆。通过使用Win32_Process WMI类。

Get-WmiObject -Class Win32_Process -Filter "ProcessID = '10708'" | Format-List ProcessID, Name, Path, Commandline 

ProcessID : 10708 
Name  : powershell.exe 
Path  : C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe 
Commandline : "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -version 2 
+0

有标题:**没有WMI **。 **我知道**如何在WMI中找到进程的CommandLine,但我想用WinAPI得到相同的结果。 – kate

+0

对不起,我没有注意到它。我不明白为什么当WMI能为你简化它时你会想要WinAPI。 WMI也可以在本地和远程使用(如果需要)。如果您不想要WMI的开销,那么您应该避免使用PowerShell并使用编译语言。 –

+0

首先,我没有看到使用哪种语言的根本区别。 – kate