Esto es extraño. Anteriormente, al ejecutar Windows 7 x64, tuve problemas para llamar al Win32 OpenProcess contra los procesos de 64 bits. Busqué un poco en Google y llegué a la conclusión de que esto no iba a suceder.OpenProcess en imágenes x64 desde la aplicación Win32
Luego sucedió algo gracioso. Lo intenté contra la identificación del proceso para explorer.exe, y holy carp, ¡funcionó! Comencé a arrojar otros ID de proceso en él, y es solo un zurrón maldito.
Como resultado, puedo llamar OpenProcess contra un buen número de procesos x64 - explorador, tipoi, ipoint, taskhost, cmd, mstsc, ..., etc.
Y otros pop a 5 (Acceso denegado) - winlogon, csrss, servicios, svchost, mdm, ...
Estoy confirmando el "bitness" y el ID del proceso usando Process Explorer. Además, llamar a GetModuleFileNameEx en procesos de 64 bits siempre falla, por lo que ofrece una doble verificación para 32/64.
Este es el código:
' Get a handle to the process.
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
If hProcess Then
' Grab the filename for base module.
nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer))
' If running in x64, http://winprogger.com/?p=26
If Err.LastDllError = ERROR_PARTIAL_COPY Then
nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer))
End If
' Truncate and return buffer.
If nChars Then
GetProcessFileName = Left$(Buffer, nChars)
End If
Call CloseHandle(hProcess)
Else
Debug.Print "LastDllError:"; Err.LastDllError
End If
No es nada especial. Solo quiero consultar los procesos para cosas como nombre de archivo o tiempos de proceso. Alguien tiene alguna idea de lo que diferencia entre los que puedo abrir y los que no puedo?
Información adicional: proceso en ejecución como administrador. UAC apagado. Sí, es una aplicación de 32 bits. No obtuve mejores resultados con PROCESS_QUERY_LIMITED_INFORMATION.
Gracias ... Karl
Ouch. Sí, eso fue todo, está bien. Eso también permitió GetProcessTimes veces. Veo que Process Explorer se está ejecutando con esa configuración, también. Entonces, si tuviera que ejecutar eso en una cuenta de usuario menos privilegiada, ¿no podría estar haciendo esto tampoco? De todos modos, gracias! :-) –
Pocos grupos tienen SeDebugPrivilege por defecto, básicamente solo SYSTEM y el grupo de administradores. Los usuarios menos privilegiados definitivamente no lo hacen. Si lo hicieran, elevar a privilegio total sería trivial ya que puede inyectar el código que desea ejecutar en un proceso privilegiado. – Michael
Antes de llegar a esta publicación, pensé que tendría que hacer compilaciones por separado en mi escenario pero gracias a SeDebugPrivilege, ahora puedo llamar a openprocess desde un proceso de 32 bits y cargar un proceso de 64 bits en mi caso sin poder cargar lsass. – Syler