
r2frida v6.2.0
Radare2 e Frida meglio insieme.
r2frida
Radare2 e Frida meglio insieme
Descrizione
Plugin autonomo per radare2 che include frida e permette di strumentare processi locali o remoti usando comandi r2 (ma non solo) al posto degli script Frida.
Il progetto radare fornisce una toolchain completa per il reverse engineering, è mantenuto attivamente e offre funzionalità ben consolidate, estendendo le sue caratteristiche con altri linguaggi di programmazione e strumenti.
Frida è un toolkit di strumentazione dinamica che semplifica l'ispezione e la manipolazione di processi in esecuzione, iniettando il tuo JavaScript e, opzionalmente, comunicando con i tuoi script.
Funzionalità
- Esecuzione di script Frida non modificati (usa il comando
:.) - Esecuzione di snippet in C, JavaScript o TypeScript in qualsiasi processo
- Possibilità di attaccare, spawnare o lanciare processi in sistemi locali o remoti
- Elenco di sezioni, simboli, esportazioni, protocolli, classi, metodi
- Ricerca di valori in memoria dall'agente o dall'host
- Sostituzione di implementazioni di metodi o creazione di hook con comandi brevi
- Caricamento di librerie e framework nel processo target
- Supporto per interfacce Dalvik, Java, ObjC, Swift e C
- Manipolazione di descrittori di file e variabili d'ambiente
- Invio di segnali al processo, continuazione, breakpoint
- Il plugin IO di r2frida è anche un backend fs (filesystem) e debug
- Automazione di r2 e frida tramite r2pipe
- Lettura/scrittura della memoria di processo
- Chiamata a funzioni, syscall e snippet di codice raw
- Connessione a frida-server via USB o TCP/IP
- Enumerazione di app e processi
- Tracciamento di registri, argomenti di funzioni
- Testato su x64, arm32 e arm64 per Linux, Windows, macOS, iOS e Android
- Non richiede frida installato nell'host (nessuna necessità di frida-tools)
- Estensione dei comandi r2frida con plugin che girano nell'agente
- Modifica dei permessi delle pagine, patching di codice e dati
- Risoluzione di simboli per nome o indirizzo e loro importazione come flag in r2
- Esecuzione di comandi r2 nell'host dall'agente
- Utilizzo delle API di r2 ed esecuzione di comandi r2 all'interno del processo target remoto
- Breakpoint nativi tramite l'API
:db - Accesso a filesystem remoti tramite l'API
r_fs
Installazione
Il metodo consigliato per installare r2frida è tramite r2pm:
$ r2pm -ci r2frida
Le build binarie che non richiedono compilazione saranno presto supportate in
r2pm e r2env. Nel frattempo, sentiti libero di scaricare le ultime build
dalla pagina delle Release.
Compilazione
Dipendenze
- radare2
- pkg-config (non richiesto su Windows)
- curl o wget
- make, gcc
- npm, nodejs (sarà presto rimosso)
Su GNU/Debian dovrai installare i seguenti pacchetti:
$ sudo apt install -y make gcc libzip-dev nodejs npm curl pkg-config git
Istruzioni
$ git clone https://github.com/nowsecure/r2frida.git
$ cd r2frida
$ make
$ make user-install
Windows
- Installa meson e Visual Studio
- Decomprimi l'ultimo zip di radare2 nella directory principale di r2frida
- Rinominalo in
radare2(invece di radare2-x.y.z) - Per rendere disponibile il compilatore VS nel PATH (
preconfigure.bat) - Esegui
configure.bate poimake.bat
Utilizzo
Per test, usa r2 frida://0, poiché collegarsi al pid0 in frida è una sessione
speciale che gira in locale. Ora puoi eseguire il comando :? per ottenere l'elenco
dei comandi disponibili.
$ r2 'frida://?'
r2 frida://[action]/[link]/[device]/[target]
* action = list | apps | attach | spawn | launch
* link = local | usb | remote host:port
* device = '' | host:port | device-id
* target = pid | appname | process-name | program-in-path | abspath
Local:
* frida://? # mostra questo aiuto
* frida:// # elenca i processi locali
* frida://0 # collega a frida-helper (nessuno spawn necessario)
* frida:///usr/local/bin/rax2 # percorso assoluto per spawn
* frida://rax2 # come sopra, considerando che local/bin è nel PATH
* frida://spawn/$(program) # spawna un nuovo processo nel sistema corrente
* frida://attach/(target) # collega al PID target nell'host corrente
USB:
* frida://list/usb// # elenca i processi nel primo dispositivo USB
* frida://apps/usb// # elenca le app nel primo dispositivo USB
* frida://attach/usb//12345 # collega al PID indicato nel primo dispositivo USB
* frida://spawn/usb//appname # spawna un'app nel primo dispositivo USB trovato
* frida://launch/usb//appname # spawna + riprende un'app nel primo dispositivo USB
Remoto:
* frida://attach/remote/10.0.0.3:9999/558 # collega al PID 558 su frida-server remoto TCP
Ambiente: (usa il comando `%` per cambiare l'ambiente a runtime)
R2FRIDA_SAFE_IO=0|1 # Workaround per un bug di Frida su Android/thumb
R2FRIDA_DEBUG=0|1 # Usato per debug del comportamento di parsing degli argomenti
R2FRIDA_COMPILER_DISABLE=0|1 # Disabilita il nuovo compilatore TypeScript di frida (`:. foo.ts`)
R2FRIDA_AGENT_SCRIPT=[file] # Percorso del file dell'agente r2frida
Esempi
$ r2 frida://0 # come frida -p 0, si collega a una sessione locale
Puoi attaccare, spawnare o lanciare qualsiasi programma per nome o PID. La riga seguente si collega al primo processo chiamato rax2 (esegui rax2 - in un altro terminale per testare questa riga)
$ r2 frida://rax2 # collega al primo processo chiamato `rax2`
$ r2 frida://1234 # collega al PID indicato
Usando il percorso assoluto di un binario per spawnare, verrà avviato il processo:
$ r2 frida:///bin/ls
[0x00000000]> :dc # continua l'esecuzione del programma target
Funziona anche con argomenti:
$ r2 frida://"/bin/ls -al"
Per il debugging USB di app iOS/Android usa queste azioni. Nota che spawn
può essere sostituito con launch o attach, e il nome del processo può
essere il bundleid o il PID.
$ r2 frida://spawn/usb/ # enumera i dispositivi
$ r2 frida://spawn/usb// # enumera le app nel primo dispositivo iOS
$ r2 frida://spawn/usb//Weather # esegue l'app Meteo
Comandi
Questi sono i comandi più frequenti: imparali e aggiungi ? per ottenere l'aiuto dei sottocomandi.
:i # ottiene informazioni sul target (pid, nome, home, arch, bits, ...)
.:i* # importa i dettagli del processo target in r2 locale
:? # mostra tutti i comandi disponibili
:dm # elenca le mappe. Usa ':dm|head' e cerca l'indirizzo base del programma
:iE # elenca le esportazioni del binario corrente (seek)
:dt fread # traccia la funzione 'fread'
:dt-* # cancella tutte le tracce
Plugin
I plugin di r2frida girano lato agente e vengono registrati con l'API r2frida.pluginRegister.
Vedi la directory plugins/ per alcuni script di esempio aggiuntivi.
[0x00000000]> cat example.js
r2frida.pluginRegister('test', function(name) {
if (name === 'test') {
return function(args) {
console.log('Hello Args From r2frida plugin', args);
return 'Things Happen';
}
}
});
[0x00000000]> :. example.js # carica lo script del plugin
Il comando :. funziona come il comando . di r2, ma viene eseguito all'interno dell'agente.
:. a.js # esegue lo script che registra un plugin
:. # elenca i plugin
:.-test # scarica un plugin per nome
:.. a.js # eternalizza lo script (rimane in esecuzione dopo il distacco)
Termux
Se intendi installare e usare r2frida nativamente su Android tramite Termux, ci sono alcune limitazioni con le dipendenze delle librerie a causa di risoluzioni di simboli. Il modo per farlo funzionare è estendere la variabile d'ambiente LD_LIBRARY_PATH in modo che punti alla directory di sistema prima della libdir di Termux.
$ LD_LIBRARY_PATH=/system/lib64:$LD_LIBRARY_PATH r2 frida://...
Risoluzione dei problemi
Assicurati di usare una versione moderna di r2 (preferibilmente l'ultima release o git).
Esegui r2 -L | grep frida per verificare se il plugin è caricato; se non viene stampato nulla, usa la variabile d'ambiente R2_DEBUG=1 per ottenere messaggi di debug che ti aiutino a trovare la causa.
Se hai problemi a compilare r2frida, puoi usare r2env o scaricare le build di release dalla pagina delle Release di GitHub. Tieni presente che solo la versione MAJOR.MINOR deve corrispondere: ad esempio, r2-5.7.6 può caricare qualsiasi plugin compilato su qualsiasi versione tra 5.7.0 e 5.7.8.
Design
+---------+
| radare2 | Lo strumento radare2, sopra tutto il resto
+---------+
:
+----------+
| io_frida | Plugin IO di r2frida
+----------+
:
+---------+
| frida | API host di Frida e logica per interagire con il target
+---------+
:
+-------+
| app | Processo target strumentato da Frida con JavaScript
+-------+
Crediti
Questo plugin è stato sviluppato da pancake aka Sergi Alvarez (l'autore di radare2) per NowSecure.
Vorrei ringraziare Ole André per aver scritto e mantenuto Frida, oltre ad essere stato così gentile da correggere bug in modo proattivo e discutere dettagli tecnici su tutto ciò che era necessario per far funzionare questa unione. Kudos