2014-09-29 65 views
0

我會盡我所能解釋我的問題。
我正試圖訪問受內存保護的進程內存(掃雷)。
我會先寫我的代碼,然後我會解釋我想要做什麼。 (如果您閱讀所有內容並瞭解其他方式,請將其發佈)。

首先,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()沒有執行一樣。
感謝您閱讀所有文字,如果有其他方法可以做到這一點,請告訴我,我正在努力學習。

+0

嘗試OpenThreadToken並回退到OpenProcessToken是正確的。一旦你用這種方式更新了代碼,你說特權()仍然失敗,但你沒有說如何。我認爲它現在還沒有得到ERROR_NO_TOKEN。它在做什麼? – lordjeb 2014-09-29 22:22:11

+0

「受內存保護的進程」是什麼意思?當你嘗試訪問這樣一個過程時,什麼不起作用? – 2014-09-29 22:24:11

+0

也許問題是您的代碼在64位操作系統上運行在32位進程中?根據文檔,32位進程無法枚舉64位進程的模塊。 – 2014-09-29 22:26:24

回答

0

documentation for EnumProcessModulesEx說:

This function is intended primarily for 64-bit applications. If the function is called by a 32-bit application running under WOW64, the dwFilterFlag option is ignored and the function provides the same results as the EnumProcessModules function.

要去documentation for EnumProcessModules,我們發現:

If this function is called from a 32-bit application running on WOW64, it can only enumerate the modules of a 32-bit process.

所以要在64位進程的工作,你的代碼必須是64位本身。

的文件繼續說:

If the process is a 64-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299).

看來,這可能是不正確的,因爲你接受訪問衝突異常代替。

+0

是的,這很奇怪,但現在它完美地工作,即使沒有特權func。感謝隊友 – Norwelian 2014-09-30 04:59:59

+0

@Norwelian:是的,這是預期的。您只需要調試權限即可訪問其他用戶的進程,而不是您自己的進程。 (更確切地說,如果目標進程的權限不會爲您提供所需的訪問權限,則需要調試權限。) – 2014-10-01 00:19:45

相關問題