J'essaie de créer une application qui lit la mémoire d'une autre application (non Java et 32 ​​bits) à l'aide de JNA. Jusqu'à présent, je sais comment trouver process ID et base address de modules. Et juste avant de lire la mémoire, je dois ouvrir le processus et la fonction OpenProcess renvoie simplement null. De plus, j'utilise Windows 10.

    // process id (pid) is known

    final int PROCESS_VM_READ=0x0010;
    final int PROCESS_QUERY_INFORMATION=0x0400;
      
    WinNT.HANDLE processHandle = Kernel32.INSTANCE.OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, true, pid);

Comment puis-je obtenir un descripteur de processus ?

1
Miłosz Tomkiel 4 oct. 2020 à 17:01

1 réponse

Meilleure réponse

Vous devez activer le privilège de débogage pour votre processus en cours afin de demander des informations sur les processus appartenant à toute personne autre que l'utilisateur actuel. Le lien montre le code en C, mais vous pouvez porter ce code vers JNA.

Il s'agit d'un appel de méthode unique au démarrage de votre programme.

Voici comment je procède (conseil de chapeau à @RbMm pour des améliorations) :

/**
 * Enables debug privileges for this process, required for OpenProcess() to get
 * processes other than the current user
 *
 * @return {@code true} if debug privileges were successfully enabled.
 */
private static boolean enableDebugPrivilege() {
    HANDLEByReference hToken = new HANDLEByReference();
    boolean success = Advapi32.INSTANCE.OpenProcessToken(Kernel32.INSTANCE.GetCurrentProcess(),
            WinNT.TOKEN_QUERY | WinNT.TOKEN_ADJUST_PRIVILEGES, hToken);
    if (!success) {
        LOG.error("OpenProcessToken failed. Error: {}", Native.getLastError());
        return false;
    }
    try {
        WinNT.LUID luid = new WinNT.LUID();
        success = Advapi32.INSTANCE.LookupPrivilegeValue(null, WinNT.SE_DEBUG_NAME, luid);
        if (!success) {
            LOG.error("LookupPrivilegeValue failed. Error: {}", Native.getLastError());
            return false;
        }
        WinNT.TOKEN_PRIVILEGES tkp = new WinNT.TOKEN_PRIVILEGES(1);
        tkp.Privileges[0] = new WinNT.LUID_AND_ATTRIBUTES(luid, new DWORD(WinNT.SE_PRIVILEGE_ENABLED));
        success = Advapi32.INSTANCE.AdjustTokenPrivileges(hToken.getValue(), false, tkp, 0, null, null);
        int err = Native.getLastError();
        if (!success) {
            LOG.error("AdjustTokenPrivileges failed. Error: {}", err);
            return false;
        } else if (err == WinError.ERROR_NOT_ALL_ASSIGNED) {
            LOG.debug("Debug privileges not enabled.");
            return false;
        }
    } finally {
        Kernel32.INSTANCE.CloseHandle(hToken.getValue());
    }
    return true;
}
2
Daniel Widdis 24 oct. 2020 à 19:07