我会尽我所能解释我的问题。
我正试图访问受内存保护的进程内存(扫雷)。
我会先写我的代码,然后我会解释我想要做什么。 (如果您阅读所有内容并了解其他方式,请将其发布)。
首先,getProcessHandle是一个函数,它返回名称为procName的进程的打开句柄。
它完美的工作,我可以列出所有的进程。写/读一个内存保护进程的内存
HANDLE getProcessHandle(const wchar_t *procName){
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 procEnt;
procEnt.dwSize = sizeof(PROCESSENTRY32);
Process32First(snap, &procEnt);
printf("--Listando procesos...\n");
do{
printf("Process name: %S \n", procEnt.szExeFile);
if (!wcscmp(procName, procEnt.szExeFile)){
printf("Encontrado %S.\n\n", procName);
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, procEnt.th32ProcessID);
}
} while (Process32Next(snap, &procEnt));
printf("No se ha encontrado el proceso.");
CloseHandle(snap);
return NULL;
二,getModule函数。其工作应该是查找并列举作为HANDLE处理过程中的所有模块。
HMODULE getHModule(HANDLE procHandle, const wchar_t *procName){
HMODULE moduleHandle[1024];
DWORD bytesNeeded;
unsigned int i = 0;
if (EnumProcessModulesEx(procHandle, moduleHandle, sizeof(moduleHandle), &bytesNeeded, LIST_MODULES_ALL)){
printf("--Modulos del proceso:\n");
for (i = 0; i < (bytesNeeded/sizeof(HMODULE)); i++){
TCHAR pathModule[1024];
GetModuleBaseName(procHandle, moduleHandle[i], pathModule, sizeof(pathModule)/sizeof(TCHAR));
if (!wcscmp(procName, pathModule)){
printf("Encontrado modulo %S.", procName);
return moduleHandle[i];
}
printf("Module %d: %S \n", i + 1, pathModule);
}
printf("No se ha encontrado el modulo.");
return NULL;
}
else {
printf("Error en EnumProcessModulesEx n: %ls", GetLastError());
}
return NULL;
问题来了。当我尝试枚举进程中的所有模块时,如果进程是一个正常进程,我的意思是,一个不受内存保护的进程,它完美地工作。
问题是当进程受内存保护时。
在这一点上,我决定搜索,我发现了特权令牌。有人说,如果我得到的SE_DEBUG_NAME令牌激活,我的过程可能超过保护,所以,我已经做了功能:
int privileges(){
HANDLE token;
TOKEN_PRIVILEGES tp;
DWORD siz = sizeof(TOKEN_PRIVILEGES);
if (OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &token) != 0){
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (AdjustTokenPrivileges(token, 0, &tp, siz, NULL ,NULL) != 0){
cout << "--Conseguido acceso debug.\n";
return TRUE;
}
else {
cout << "fail adjust\n";
return FALSE;
}
}
else {
cout << "fail if: " << GetLastError() << endl;
cin.get();
return FALSE;
}
与“主要”功能:
int _tmain(int argc, _TCHAR* argv[])
{
privileges();
wchar_t *processName = _T("calc.exe");
HANDLE hProc = getProcessHandle(processName);
if (hProc){
HMODULE hMod = getHModule(hProc, processName);
cout << hMod;
}
cin.get();
return 0;
}
我现在遇到的问题是,当我执行这个功能时,它返回ERROR_NO_TOKEN代码号。
有人在这里说我改变OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &token)
为OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)
,这不会造成任何问题,既不会导致这个问题,我也有同样的问题,就好像privileges()
没有执行一样。
感谢您阅读所有文字,如果有其他方法可以做到这一点,请告诉我,我正在努力学习。
尝试OpenThreadToken并回退到OpenProcessToken是正确的。一旦你用这种方式更新了代码,你说特权()仍然失败,但你没有说如何。我认为它现在还没有得到ERROR_NO_TOKEN。它在做什么? – lordjeb 2014-09-29 22:22:11
“受内存保护的进程”是什么意思?当你尝试访问这样一个过程时,什么不起作用? – 2014-09-29 22:24:11
也许问题是您的代码在64位操作系统上运行在32位进程中?根据文档,32位进程无法枚举64位进程的模块。 – 2014-09-29 22:26:24