Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    24

    [AIUTO]Writeprocessmemory

    Salve a tutti, se va questa ho finito.. mi serve come impostare la writeprocessmemory xkè come l'ho impostata io restituisce false, questo è il codice che ho fatto io grazie all'aiuto di andbin

    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /**
     *
     * @author Andrea94
     */
    import com.sun.jna.*;
    import com.sun.jna.examples.win32.Kernel32;
    import com.sun.jna.ptr.*;
    import com.sun.jna.win32.*;
    
    public class Main {
          public interface MyUser32Lib extends StdCallLibrary {
            MyUser32Lib INSTANCE = (MyUser32Lib) Native.loadLibrary("user32", MyUser32Lib.class);
    
            Pointer FindWindowA(String winClass, String title);
            int GetWindowThreadProcessId(Pointer hwnd, PointerByReference refProcessId);
        }
              public interface Kernel32 extends Library {
    
            Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer dwProcessId );
            boolean WriteProcessMemory(Pointer hProcess,Pointer lpBaseAddress,Pointer lpBuffer,Pointer nSize,int lpNumberOfBytesWritten);
    
            public boolean WriteProcessMemory(Pointer handleprocesso, Pointer adr, int i, int i0, int i1);
    
        }
        public static void main(String[] args) {
            Kernel32 kernel = (Kernel32)
               Native.loadLibrary("kernel32", Kernel32.class);
            Pointer hwnd = MyUser32Lib.INSTANCE.FindWindowA(null, "Prato fiorito");
    
            System.out.println("Handle finestra: " + hwnd);
    
            PointerByReference refProcessId = new PointerByReference();
    
            MyUser32Lib.INSTANCE.GetWindowThreadProcessId(hwnd, refProcessId);
    
            System.out.println("ID processo: " + refProcessId.getValue());
    
          Pointer handleprocesso = kernel.OpenProcess(16, false, refProcessId.getValue());
          System.out.println("Handle finestra: " + handleprocesso);
          long address= 0x010056a4;
    Pointer adr = new Pointer(address);
    Pointer buf = new Pointer (5);
    Pointer size = new Pointer (4);
    boolean asd = kernel.WriteProcessMemory(handleprocesso,adr,buf,size,4);
    System.out.println(asd);
        }
    
       
    }

    E l'output è questo


    codice:
    Handle finestra: native@0x606c2
    ID processo: native@0x9b0
    Handle finestra: native@0x1634
    false
    Ringrazio anticipatamente in attesa di risposte

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto nell'altra discussione avevo fatto una correzione: il secondo parametro di GetWindowThreadProcessId dovrebbe essere un IntByReference.

    Poi nella OpenProcess l'ultimo parametro dovrebbe essere un int.

    E la WriteProcessMemory a livello "nativo" è dichiarata come:

    BOOL WINAPI WriteProcessMemory(
    __in HANDLE hProcess,
    __in LPVOID lpBaseAddress,
    __in LPCVOID lpBuffer,
    __in SIZE_T nSize,
    __out SIZE_T *lpNumberOfBytesWritten
    );

    Quindi i parametri dovrebbero essere:
    Pointer per hProcess
    Pointer per lpBaseAddress

    Per lpBuffer la questione è particolare. lpBuffer dovrebbe "puntare" ad un'area di memoria nel processo corrente in cui sono presenti un "tot" di dati (quantità indicata da nSize) che saranno poi copiati (attraverso la WriteProcessMemory) nell'altro processo referenziato da hProcess.
    Quindi lpBuffer dovrebbe essere un Pointer ma che punti .... dove? Appunto: deve essere un Pointer a della memoria allocata, quindi non puoi "sparare" tu un valore per il Pointer!!

    Da quello che ho visto, devi usare una sottoclasse di Pointer che è Memory (com.sun.jna.Memory). Un Memory lo istanzi con il solo costruttore pubblico che riceve un numero che indica quanti byte allocare, es:

    Pointer buf = new Memory(10); // 10 byte da allocare

    In questa "area" di memoria ci scrivi con i setXXX() o i write() (vedere javadoc di Pointer/Memory).

    Per nSize dovrebbe andare bene un int mentre per lpNumberOfBytesWritten dovrebbe andare bene un IntByReference. Dopo la invocazione di WriteProcessMemory potrai usare getValue() su questo IntByReference per sapere quanti byte sono stati effettivamente copiati nell'altro processo. La documentazione dice che si può anche passare un NULL (se non si ha bisogno di questa informazione).

    Tutto questo comunque non mi pare difficile .... è solo questione di avere qualche base sulle API Win32 e sapere come lavorare con gli indirizzi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    24
    Sinceramente non ho capito bene..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.