【发布时间】:2018-03-26 13:41:47
【问题描述】:
我试图通过一个进程的模块进行枚举,以获取它运行的内存地址范围。这个函数可以很好地与其他进程一起使用。但是,在我打算分析的特定过程中,我得到错误代码 5,ERROR_ACCESS_DENIED。请注意,在位置 1 我得到错误代码 0,在位置 2 我得到错误代码 5。我知道可以保护一些内核对象,这可以解释这个错误代码。这是原因吗?如果是这样,是否有可能解决这个问题?
int PrintModules(DWORD processID)
{
HMODULE hMods[1024];
HANDLE hProcess;
DWORD cbNeeded;
unsigned int i;
// Print the process identifier.
printf("\nProcess ID: %u\n", processID);
// Get a handle to the process.
hProcess = OpenProcess(PROCESS_ALL_ACCESS,
FALSE, processID);
std::cout << "POSITION 1 : " << GetLastError() << std::endl;
if (NULL == hProcess)
{
return 1;
}
// Get a list of all the modules in this process.
if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
{
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
// Get the full path to the module's file.
if (GetModuleFileNameEx(hProcess, hMods[i], szModName,
sizeof(szModName) / sizeof(TCHAR)))
{
// Print the module name and handle value.
_tprintf(TEXT("\t%s (0x%08X)\n"), szModName, hMods[i]);
}
}
}
else {
std::cout << "POSITION 2 : " <<GetLastError() << std::endl;
}
// Release the handle to the process.
CloseHandle(hProcess);
return 0;
}
【问题讨论】:
-
在本地管理权限下运行您的应用程序或为您的进程设置正确的权限(
AdjustTokenPrivileges())是否没有选项? -
我尝试以管理员身份运行应用程序并遇到了同样的问题。
-
请使用 ProcessExplorer 或同等工具检查您的进程的安全信息。有些像防病毒程序或系统进程不允许读取其他进程。
-
进程浏览器显示进程不受保护,系统有读/写权限。我已经调整了令牌权限。
-
PROCESS_ALL_ACCESS 是一个很大的需求,它可以让你以任何可以想象的方式搞乱一个进程。当您枚举 所有 正在运行的进程时,您几乎总是会遇到一个您没有足够的访问权限来执行此操作的进程。你必须跳过它。请考虑降低您的需求,看来您不需要更多的 PROCESS_QUERY_INFORMATION。