无法获取进程 ID 4 (ntoskrnl.exe) 的可执行路径



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

它几乎适用于所有内容,除了像ntoskrnl.exe(系统,进程 ID:4(这样的少数几个。 当我使用这些方法时,获得的句柄不是 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;
}

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

任务管理器屏幕截图

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

甚至窗口也为该 Exe 进行了硬编码。他们将其硬编码为 %Systemroot%\system32toskrnl.exe。仅当您展开 Systemroot 时,您才会获得值C:\WINDOWS。当你使用像GetModuleFileNameEx这样的API时,你会得到C:\Windows的路径。所以从技术上讲没有办法。根据我的假设,出于安全原因,他们不允许任何用户获取 Exe 的路径。

相关内容

  • 没有找到相关文章

最新更新