UPGRD

Tutte le ultime notizie tech e non

tecnologia

Scopri come monitorare la memoria in DOOM con Frida!

By ,

Monitoraggio della Memoria in DOOM con Frida

In alcune situazioni, potrebbe capitare di imbattersi in dati di memoria intriganti e desiderare di identificare il codice che li gestisce. L'API MemoryAccessMonitor di Frida può risultare complicata a causa della granularità delle pagine, specialmente su sistemi moderni con pagine da 16K. Questo rende difficile raccogliere campioni sufficienti per catturare il codice che accede a specifici byte.

Nuove Funzionalità di Frida

Per migliorare questa esperienza, @hsorbo e un altro sviluppatore hanno implementato il supporto per breakpoint hardware e watchpoint. Ora, gli oggetti thread restituiti da Process.enumerateThreads() dispongono di metodi come setHardwareBreakpoint() e setHardwareWatchpoint(), oltre a metodi per disattivarli successivamente. Questi possono essere combinati con Process.setExceptionHandler() per gestire le eccezioni e riprendere l'esecuzione del codice.

Esempio Pratico: DOOM + DOOM II

Per testare queste nuove API, si è scelto di analizzare la recente riedizione del 2024 di DOOM + DOOM II. La prima operazione consiste nel localizzare in memoria il numero di proiettili disponibili. Si può creare un piccolo agente per facilitare questa operazione:

Scopri come monitorare la memoria in DOOM con Frida!

Caricando l'agente nel gioco, si sa che attualmente ci sono 50 proiettili. Si procede quindi a cercare tutte le allocazioni di heap contenenti il valore 50, codificato come un uint32 nativo.

Filtraggio dei Risultati

Dopo aver trovato molte allocazioni, si può restringere il campo sparando un proiettile e verificando quali posizioni ora contengono il valore 49.

Risultato: Si identifica con successo dove è memorizzato il numero di proiettili. Il passo successivo è trovare il codice che aggiorna questo numero quando un proiettile viene sparato. Si aggiunge quindi una funzione di supporto all'agente:

Scopri come monitorare la memoria in DOOM con Frida!

Dopo aver sparato un altro proiettile, si può simbolizzare l'indirizzo ottenuto. Utilizzando r2, si può osservare che il contatore del programma si trova sull'istruzione immediatamente successiva a quella che ha attivato il watchpoint.

Creazione di Hook e Cheat

Da qui, è possibile impostare un hook inline che si attiva ogni volta che un proiettile viene sparato. Inoltre, si può facilmente creare un cheat per avere munizioni infinite. È importante notare che si sarebbe potuto ottenere lo stesso risultato utilizzando Memory.patchCode() per sostituire l'istruzione con un NOP di 3 byte, ma l'hook dell'Interceptor ha il vantaggio di essere automaticamente annullato quando lo script viene scaricato.

Supporto per Windows su ARM

Un'altra novità significativa di questa versione è il supporto per Windows su ARM. Ciò significa che una versione arm64 di Frida può iniettarsi in processi nativi arm64, oltre a processi emulati x86_64 e x86. Tuttavia, non sono ancora disponibili i binari, poiché si attende che GitHub fornisca runner arm64 per progetti OSS, attualmente limitati ai clienti Team e Enterprise Cloud.

Altre Novità

Ci sono anche molte altre modifiche interessanti, tra cui:

  • linux: Gestione dei processi chiusi durante il distacco. Grazie a @ajwerner!
  • java: Gestione dei gestori del ciclo GC di Android non esportati. Grazie a @thinhbuzz!
  • java: Supporto preliminare per OpenJDK 17 su Windows. Grazie a @FrankSpierings!
  • meson: Aggiunta di frida-netif al frida-core pubblico, affinché i devkit di frida-core includano tutti i simboli necessari.

FAQ

Che cos'è Frida?

Frida è uno strumento di reverse engineering che consente di iniettare codice in applicazioni in esecuzione, permettendo di analizzare e modificare il comportamento delle applicazioni.

Cosa sono i breakpoint hardware e i watchpoint in Frida?

I breakpoint hardware sono punti di interruzione che si attivano quando viene eseguita una specifica istruzione, mentre i watchpoint monitorano l'accesso a una specifica area di memoria, attivandosi quando i dati in quella posizione vengono letti o scritti.

Come posso monitorare la memoria in DOOM con Frida?

Puoi monitorare la memoria in DOOM creando un agente Frida che localizza e analizza le allocazioni di memoria, come il numero di proiettili disponibili, e utilizzando breakpoint e watchpoint per identificare il codice che gestisce questi dati.

Qual è il vantaggio di utilizzare gli hook inline in Frida?

Gli hook inline consentono di modificare il comportamento di un'applicazione in tempo reale, come attivare un'azione ogni volta che un proiettile viene sparato, e vengono automaticamente annullati quando lo script viene scaricato.

Cosa significa 'munizioni infinite' in DOOM?

Significa che il giocatore può sparare proiettili senza mai esaurire le munizioni, un cheat che può essere creato utilizzando Frida per modificare il comportamento del gioco.

Quali sono le nuove funzionalità di Frida per Windows su ARM?

Frida ora supporta Windows su ARM, consentendo l'iniezione di codice in processi nativi arm64 e in processi emulati x86_64 e x86, anche se i binari non sono ancora disponibili.

Come posso filtrare i risultati durante il monitoraggio della memoria?

Puoi filtrare i risultati sparando un proiettile e verificando quali posizioni di memoria ora contengono un valore diverso, come 49, per restringere il campo e identificare la posizione corretta.

Qual è l'importanza di Process.enumerateThreads() in Frida?

Process.enumerateThreads() consente di ottenere un elenco di tutti i thread attivi in un processo, permettendo di impostare breakpoint e watchpoint su thread specifici per monitorare il loro comportamento.

Cosa sono le allocazioni di heap in memoria?

Le allocazioni di heap sono porzioni di memoria allocate dinamicamente durante l'esecuzione di un programma, utilizzate per memorizzare dati come variabili e oggetti.

Quali altre novità sono state introdotte in questa versione di Frida?

Altre novità includono la gestione dei processi chiusi su Linux, il supporto per OpenJDK 17 su Windows e miglioramenti nella gestione del ciclo GC di Android.