-1

我一直在尝试通过枚举所有进程来获取可执行路径。我同时使用了GetModuleFileNameExAQueryFullProcessImageNameA来获取可执行文件的路径。

它适用于几乎所有东西,除了少数像ntoskrnl.exe(系统,进程 ID:4)。当我使用这些方法时,获得的HANDLE不是 NULL但函数失败

GetLastError 结果是31

代码是否有任何问题或必须采取任何解决方法?注意:我的 EXE 是 32 位 EXE,我有 64 位操作系统。这有什么关系吗?

INT32 GetFileNameAndPath(DWORD processId,string &filePath,string &fileName)
{
CHAR path[MAX_PATH];
DWORD size=MAX_PATH;
smatch match;

HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,FALSE,processId);

if(hProcess != NULL)
{
    regex regx("[^\\\\]+$");

    if(GetModuleFileNameExA(hProcess,NULL,path,size) != 0)
    {
        filePath = path;

        if(regex_search(filePath,match,regx))
            fileName = match.str();
    }
    else if(QueryFullProcessImageNameA(hProcess,0,path,&size) != 0)
    {
        filePath = path;

        if(regex_search(filePath,match,regx))
            fileName = match.str();
    }
    else
    {
        cout<<GetLastError();
    }
}

CloseHandle(hProcess);

return SUCCESS;
}
4

1 回答 1

0

是的!答案是无法获取ntoskrnl.exe的路径。我想知道任务管理器是如何做到的。经过几个小时的检查,我找到了它!:P(不应该采取那么多)。

任务管理器截图

如果您看到该屏幕截图,您可以看到进程系统的图像路径名称C:\WINDOWS,而对于 conhost.exe,它是 C:\Windows。

甚至 Windows 也为该 Exe 进行了硬编码。他们将其硬编码为%Systemroot%\system32\ntoskrnl.exe。只有当您展开 Systemroot 时,您才会获得C:\WINDOWS的值。当您使用诸如 GetModuleFileNameEx 之类的 API 时,您将获得路径为C:\Windows。所以技术上没有办法。根据我的假设,由于安全原因,他们不允许任何用户获取 Exe 的路径。

于 2018-08-23T14:01:38.287 回答