在.NET中查找“隐藏”的Windows进程

时间:2011-10-31 03:47:42

标签: c# .net process

我正在尝试枚举在我的机器上运行的所有进程:

public int EnumProcesses()
{   
    Process[] ProList = Process.GetProcesses();
    Proc.iProcessNum = ProList.Length;
    for (int i = 0; i < ProList.Length; i++)
    {
        PrintProcess(ProList[i]);
    }          
    return 0;
}

Process.GetProcesses()找不到某些进程(例如使用XTrap运行的游戏)。但是,任务管理器可以看到它们。我怎样才能找到这些“隐藏”的过程?


现在我已经选择了它的processID,但是processName是“鬼”(真正的名字是ge.exe,但我得到chrome.exe或其他任何东西)。我试过

GetModuleFileName()
GetModuleHandle()
GetModuleHandleEx()

为什么任务管理器和ProcessExplorer显示为true,Any给我一个解决方案。

1 个答案:

答案 0 :(得分:2)

您的程序很可能没有足够的权限来获取有关其他进程的信息。

只有通过执行SYSTEM才能获得每个进程名称,但对于其他进程名称,您可以请求运行具有管理权限(通常通过在应用程序清单中指定UAC级别),(您可能还需要启用SeDebugPrivilege)在进程访问令牌中)这应该允许你看到它们中的大部分。

除此之外,调用本机API会使事情变得更清晰,因为已经有大量示例代码用于执行这些确切的任务。

EDIT ::

GetModuleFileName仅用于进程模块(即DLL),即使这样,它们也必须由当前进程加载。你所追求的是:

GetProcessImageFileName

只要您可以使用所需的访问权限打开流程句柄,它就可以正常工作。这是GetProcessImageFileName的msdn文档的链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683217%28v=vs.85%29.aspx

请注意,ProcessExplorer会加载一个驱动程序,从而可以完全访问系统,因此它可以找到几乎所有内容。 TaskManager使用一些臭名昭着的API来检索数据。虽然他们有点太多进入这里。