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

    [AIUTO] Ancora non va la writeprocessmemory

    Ciao a tutti mi dispiace rompere ancora nel forum, ma mi serve urgentemente una mano, sono arrivato a questo punto nel source, ma la writeprocessmemory continua a non funzionare, confido in qualche anima buona che mi dica come sbaglio, grazie in anticipo



    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, IntByReference refProcessId);
        }
              public interface Kernel32 extends Library {
    
            Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId );
            boolean WriteProcessMemory(Pointer hProcess,Pointer lpBaseAddress,Pointer lpBuffer,int nSize,IntByReference 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);
    
            IntByReference refProcessId = new IntByReference();
    
            MyUser32Lib.INSTANCE.GetWindowThreadProcessId(hwnd, refProcessId);
    
            System.out.println("ID processo: " + refProcessId.getValue());
    
          Pointer handleprocesso = kernel.OpenProcess(16, true, refProcessId.getValue());
          System.out.println("Handle processo: " + handleprocesso);
          long address= 0x010056a4;
    Pointer adr = new Pointer(address);
    Memory buf = new Memory(4);
    long assdd= 0;
    buf.setInt(assdd, 40);
    int size = 4;
    IntByReference asdd= new IntByReference ();
    boolean asd = kernel.WriteProcessMemory(handleprocesso,adr,buf,size,asdd);
    System.out.println(asdd.getValue());
    System.out.println(asd);
        }
    
       
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto non so dove hai preso quell'indirizzo 0x010056a4. Io ho fatto una ricerca in rete e ho trovato che ne parlano. E dicono di settare 1 byte a quell'indirizzo (non 4 byte!). Il tipo di dato a quell'indirizzo potrebbe anche essere un int (4 byte) ma io non lo posso sapere senza altre indicazioni ....

    A parte questo, se una funzione Win32 fallisce, generalmente un motivo c'è e lo si può scoprire in modo un po' più preciso con un'altra funzione Win32 che è GetLastError().

    Io ho provato a fare tutta la procedura (non con il tuo codice ma con del mio codice) ed effettivamente la WriteProcessMemory fallisce anche a me. Quindi ho mappato la GetLastError() e l'ho invocata dopo la WriteProcessMemory. Risultato: il codice di errore è 5 (ERROR_ACCESS_DENIED). Che è già più chiaro. L'accesso all'altro processo non è permesso.

    E il motivo l'ho anche trovato. Tu per dwDesiredAccess di OpenProcess hai specificato 16 (0x10) e così ho messo pure io (senza andare a vedere la documentazione .... male)!!

    Ma la documentazione per i diritti di accesso dice:

    PROCESS_VM_OPERATION (0x0008) Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
    PROCESS_VM_READ (0x0010) Required to read memory in a process using ReadProcessMemory.
    PROCESS_VM_WRITE (0x0020) Required to write to memory in a process using WriteProcessMemory.

    Quindi non è 16 (0x10) ma 40 (0x28, l'insieme di PROCESS_VM_WRITE e PROCESS_VM_OPERATION in pratica) se vuoi poter scrivere!!

    Morale: consultare sempre la documentazione (e questo vale anche per me che già leggo una quintalata di documentazione al giorno ).
    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
    Grazie non ci posso credere che era una cosa cosi semplice e stupida, grazie 1000 finalmente in output vedo
    4
    true
    XD
    Grazie 1000
    cmq quell'address è l'address del numero di fiori, giusto x fare una prova

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.