Domanda

Leggi alcuni dati da un processo (Indirizzo: 0x58F03C) utilizzando la funzione WinAPI ReadProcessMemory:

DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
int value=0;

while (1)
{
    ReadProcessMemory(hProcess, (LPVOID)0x58F03C, &value, sizeof(value), 0);
    cout << "val: " << value << endl;
}
.

Dal momento che l'indirizzo cambia ogni volta che riavvio il processo che mi chiedevo se c'è un modo per ottenere sempre lo stesso indirizzo?Ci deve essere uno perché vedo molti "istruttori-programmi" che sono in grado di farlo.Come ottengono il valore dell'indirizzo giusto da leggere da / scrivere a?

Attualmente lo ottengo scansionando per un valore con CheatEngine ed esegui una scansione successiva per il valore modificato.

Grazie.

È stato utile?

Soluzione

Si incontra l'assegnazione dinamica della memoria. Nel mondo del Cheagine, questi sono chiamati "puntatori".

Considera alcuni dati (ad esempio un uint32_t / DWORD) all'interno della memoria che era malloc'd. Se trovi l'indirizzo dei dati, non vi è alcuna garanzia che la prossima volta che avvia il processo, l'indirizzo sarà lo stesso. Questo perché la memoria restituita da malloc potrebbe essere basata su un punto diverso nella memoria.

Il trucco utilizzato per sconfiggere l'allocazione dinamica della memoria è trovare un indirizzo di mucchio statico che può portarti all'indirizzo del valore che ti interessa. Il tutorial cheagine ti mostra come è fatto. Lo stesso vale per i puntatori multilivello. Ad un livello più alto, ciò corrisponde alla memoria assegnata dinamicamente che contiene un puntatore ad un'altra memoria dinamicamente assegnata, e così via.

Il metodo utilizzato in Cheagine per ottenere puntatori funziona approssimativamente in questo modo:

    .
  • Imposta un interruzione hardware di accesso all'indirizzo del valore dei dati che ti interessa
  • Quando il codice accede, il punto di interruzione dell'hardware ti mostrerà qual è il codice

    Il codice ti guarderà in genere qualcosa del genere:

    mov eax, 0x1234ABCD 
    dec dword ptr ds:[eax+0x85]
    
    .

    Potrebbe corrispondere a un codice che decrementa il tuo HP quando è stato colpito da un nemico. 0x1234ABCD è il puntatore in questo caso e 0x85 l'offset. Nel codice C, questo potrebbe essere successo:

    struct some_struct* blah = malloc(...);
    ...
    blah->HP--;
    
    .

    0x1234ABCD sarebbe l'indirizzo di blah. Il valore HP vive da qualche parte all'interno del blocco indicato da blah. L'offset nel blocco di memoria è 0x85. Quindi, se stavi scrivendo un allenatore, leggerebbe il DWORD (QWORD se 64 bit) a 0x1234abcd e aggiungi 0x85 al valore. Questo ti fornirebbe l'indirizzo del valore HP.

Altri suggerimenti

Ciò funzionerà se l'indirizzo è nella parte dell'eseguibile della sezione dei dati in cui le variabili preallocate vivono (non adatte per mucchio e pila) ...

Dai un'occhiata a "Enuumerando tutti i moduli per un processo" Esempio su MSDN .

Utilizza enumprocessmodules () per ottenere maniglie del modulo.Quelli sono indirizzi base dell'immagine.

È possibile ottenere l'indirizzo di base dell'immagine per l'eseguibile e regolare il tuo indirizzo da esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top