Scegliere lo strumento in base all'indizio
Per cercare stringhe in Ghidra, stabilisci prima se stai cercando dati già definiti da Ghidra, testo visibile nel modello del programma, byte grezzi nella memoria caricata oppure un indirizzo esatto. Defined Strings è un buon inventario, ma non equivale a una ricerca completa. Una stringa breve può non essere definita, un valore Unicode può avere un'altra codifica e un blocco fuori dall'intervallo corrente può non comparire nella stessa finestra.
Per gli indirizzi, considera Listing la fonte principale. Usa Decompiler per spiegare una funzione dopo aver trovato la prova, non per sostituire la ricerca. La documentazione ufficiale per principianti presenta il flusso CodeBrowser generale; questa pagina si concentra sulle decisioni di ricerca che spesso confondono all'inizio.
Analizza solo software e sistemi per i quali hai l'autorizzazione. Un risultato di ricerca è una prova sul file, non un permesso di reverse engineering né una garanzia di sicurezza.
- Testo noto: inizia con Defined Strings o Search for Strings e controlla i riferimenti.
- Nome, simbolo, funzione o commento: usa Search Program Text o Symbol Tree.
- Indirizzo preciso: usa Go To e conferma blocco caricato e istruzione.
- Sequenza di byte o pattern: usa Search Memory con l'intervallo corretto.
- Funzione che usa il risultato: segui gli XREF e confronta Listing, Function Graph e Decompiler.
Cercare le stringhe prima di indovinare nel decompilatore
Se conosci un messaggio, un URL, un percorso, un comando o un frammento di errore, cerca il testo prima di leggere centinaia di funzioni. Apri Defined Strings per ottenere l'elenco delle stringhe già riconosciute. Se il valore manca, usa la ricerca di stringhe e controlla codifica, lunghezza minima, allineamento, terminazione nulla e blocchi di memoria. Un risultato vuoto spesso indica che definizione o intervallo non sono corretti.
Un risultato diventa utile solo dopo aver verificato l'indirizzo. Aprilo in Listing, controlla byte e dati vicini e conferma che sia dentro un blocco caricato. Se Ghidra mostra dati non definiti, verifica allineamento e riferimenti vicini prima di definirli. Prima di applicare molte definizioni conserva una copia del progetto.
- 1
Partire da un indizio distintivo
Un URL completo, un frammento distintivo o un'estensione insolita genera meno falsi positivi di un termine comune o di un nome di inizializzazione.
Defined Strings / Search for Strings - 2
Controllare codifica e intervallo
Prova ASCII, UTF-8, UTF-16 o la codifica adatta e stabilisci se cercare nei blocchi caricati, in tutti i blocchi o solo nella selezione.
Codifica + intervallo memoria - 3
Aprire l'indirizzo in Listing
Controlla byte, tipo di dato, stringhe vicine e riferimenti. Un'evidenziazione non prova ancora quale sia la funzione corretta.
Open in Listing - 4
Seguire un riferimento utile
Usa References o XREF per passare a confronto, chiamata, formattazione o ramo che chiarisce il ruolo della stringa.
References / Show XRefs

Trovare dove viene usata la stringa e perché
Trovare un URL o un messaggio è di solito solo il punto centrale dell'indagine. Seleziona l'elemento e controlla i riferimenti. Un URL può essere passato a una routine di rete, confrontato con un valore locale o rimanere una risorsa inutilizzata. Un messaggio può appartenere a un percorso di errore, a un controllo di licenza, a un menu o a un ramo di debug. L'indirizzo del riferimento indica dove il valore viene consumato; chiamanti e chiamati ne chiariscono il ruolo.
Quando un riferimento porta a una funzione complessa, alterna Listing e Decompiler. Listing mostra le istruzioni e gli indirizzi decodificati; Decompiler propone un flusso di controllo e un modello delle variabili. Rinomina solo dopo aver raccolto prove sufficienti e separa ciò che osservi da ciò che deduci.
- Conferma che sia un riferimento reale a codice o dati, non solo un indirizzo vicino.
- Leggi il blocco di base e individua confronto, chiamata o formattazione.
- Controlla chiamanti e chiamati prima di attribuire un significato funzionale.
- Usa Function Graph quando i rami sono difficili da seguire nel Listing.
- Consulta la guida al Decompiler se il problema è il pseudocodice.
Trovare un indirizzo di memoria, un valore o un pattern di byte
Una domanda come «dove si trova 0x00421A3F?» è prima di tutto un problema di navigazione. Usa Go To e poi controlla programma, blocco di memoria, linguaggio e spazio degli indirizzi mostrati nel Listing. Offset del file, indirizzi virtuali, basi dell'immagine e indirizzi rilocati non sono intercambiabili. Se un indirizzo copiato non si apre, verifica se proviene da un offset, da una traccia del debugger, da un log o da un modulo rilocato.
Per i dati grezzi, Search Memory è più adatto di una ricerca testuale. Cerca i byte nell'ordine corretto, considera endianness e allineamento e restringi blocco o selezione se i risultati sono molti. Un valore può trovarsi in codice, dati, padding o una struttura non correlata. La ricerca crea candidati; byte e riferimenti vicini forniscono il contesto.
Debugger, visualizzatore di file e Ghidra possono usare sistemi di coordinate diversi. Conserva l'origine dell'indirizzo e convertilo consapevolmente invece di aggiungere una costante finché il valore sembra plausibile.
| Indizio | Primo strumento | Cosa verificare dopo |
|---|---|---|
| Indirizzo caricato esatto | Go To | Spazio, blocco, istruzione o dato di destinazione |
| Sequenza esadecimale | Search Memory | Endianness, allineamento, intervallo, riferimenti |
| URL o messaggio | Ricerca stringhe | Codifica, definizione, XREF, funzione utilizzatrice |
| Nome o etichetta | Symbol Tree / Search Program Text | Namespace, tipo, chiamanti e chiamati |
| Valore di log o debugger | Go To + Listing | Rebase, base del modulo, offset rispetto all'indirizzo |
Cercare istruzioni e pattern di istruzioni
Una ricerca di istruzioni richiede una domanda più precisa di «trova questa parola». Puoi cercare un mnemonic, un registro, una costante, una sequenza o i byte prodotti dal compilatore. Search Program Text aiuta quando il testo decodificato nel Listing è stabile; Search Memory è preferibile quando l'encoding dei byte è l'indizio stabile. Architettura e linguaggio scelti durante l'importazione determinano la decodifica degli stessi byte.
Per istruzioni Java o termini legati a una piattaforma, non mischiare il vocabolario del linguaggio sorgente con la sintassi del disassembly. Cerca la forma che appare davvero nel Listing e valida un risultato osservando operandi e flusso di controllo. Per pattern ripetibili annota architettura, endianness, wildcard e intervallo di memoria.
- 1
Definire il pattern
Annota mnemonic, operandi, byte, registri o costanti e separa le parti che possono cambiare tra build.
Pattern = mnemonic + operands + optional wildcards - 2
Scegliere testo o byte
Usa il testo quando la forma decodificata è stabile e la ricerca memoria quando lo è la codifica dei byte.
Search Program Text / Search Memory - 3
Validare la corrispondenza
Apri il risultato, leggi l'istruzione e il blocco completo e confronta riferimenti e chiamanti.
Listing + XREF + Function Graph

Trovare funzioni, funzioni non definite e confini utili
Quando un risultato punta al codice, usa Symbol Tree, Function Window o il contesto corrente del Listing per verificare se Ghidra ha già riconosciuto una funzione. “Undefined” può significare che l'analisi non ha ancora creato il confine, che l'indirizzo è un dato o che l'architettura importata deve essere controllata. Non creare una funzione solo perché una sequenza sembra familiare: verifica punto d'ingresso, riferimenti, calling convention e ritorno quando possibile.
In un flusso guidato dalla ricerca, la funzione organizza le prove ma non dimostra da sola il comportamento. Registra indirizzo, dato o istruzione trovata, riferimento che li collega e funzione successiva che usa il valore. Il tutorial per principianti descrive più ampiamente Auto Analysis e Function Graph.
| Risultato | Interpretazione | Prossimo passo sicuro |
|---|---|---|
| Funzione con nome | Esiste un confine simbolico | Controlla chiamanti, chiamati, firma e riferimenti |
| FUN_... o funzione senza nome | La funzione esiste ma il ruolo è ignoto | Usa stringhe, chiamate e flusso prima di rinominare |
| Indirizzo non definito | Non esiste ancora un confine affidabile | Controlla codice/dati e analizza una copia |
| Risultato dentro un blocco | L'indizio è vicino a codice o dati | Leggi il blocco completo e segui gli XREF |
| Nessun riferimento | Uso indiretto o definizione incompleta | Controlla tabelle di puntatori, relocation e intervallo |
Risolvere ricerche senza risultati o troppo ampie
Il problema più comune è una differenza tra l'indizio e la sua rappresentazione nel programma. Un URL può essere diviso, codificato, compresso, salvato come UTF-16 o costruito a runtime. Un indirizzo può appartenere a un'altra base di modulo. Un pattern di istruzioni può cambiare se il compilatore sceglie un altro registro. Cambia una sola variabile alla volta e conserva l'indizio insieme alle impostazioni.
Se i risultati sono troppi, restringi blocco, selezione, tipo di dato, lunghezza minima, linguaggio o intervallo di indirizzi. Se non c'è alcun risultato, allarga una condizione, controlla i byte vicini, prova un'altra codifica e verifica che la memoria sia caricata. Per le differenze tra versioni usa l'aiuto ufficiale attuale, non un vecchio screenshot.
| Sintomo | Causa probabile | Controllo successivo |
|---|---|---|
| Nessuna stringa | Codifica, stringa breve o dato non definito | Prova la codifica corretta e controlla i byte |
| Troppi risultati | Parola comune o intervallo ampio | Usa un frammento distintivo e limita i blocchi |
| Indirizzo non raggiungibile | Offset, rebase o spazio errato | Identifica coordinate e base del modulo |
| Stringa senza XREF | Uso indiretto o tabella di puntatori | Controlla i puntatori vicini e l'analisi mirata |
| Istruzione mancante | Sintassi, architettura o compilatore diverso | Cerca byte o operando stabile |
| Decompiler diverso | Il pseudocodice è un'interpretazione | Torna a Listing, byte, riferimenti e Function Graph |
Domande sulla ricerca in Ghidra
Qual è il modo più semplice per cercare stringhe in Ghidra?
Inizia con Defined Strings per l'inventario e usa la ricerca di stringhe quando il valore manca o la codifica è incerta. Verifica l'indirizzo nel Listing e segui gli XREF.
Come trovo un indirizzo URL in Ghidra?
Cerca una parte distintiva dell'URL, conferma codifica e indirizzo nel Listing e segui i riferimenti fino alla funzione che legge, confronta, formatta o invia il valore. L'URL può essere costruito a runtime.
Come cerco un indirizzo di memoria specifico in Ghidra?
Usa Go To e verifica spazio degli indirizzi, blocco e contenuto decodificato. Converti offset di file o indirizzi del debugger prima di usarli come indirizzi caricati.
Come cerco istruzioni specifiche in Ghidra?
Usa Search Program Text per testo decodificato stabile o Search Memory per byte stabili. Conferma architettura ed endianness e valida i risultati in Listing e Function Graph.
Perché la ricerca di stringhe in Ghidra non trova nulla?
Controlla codifica, lunghezza minima, allineamento, blocchi caricati e la possibilità che il valore sia diviso o costruito a runtime. Allarga una condizione alla volta.
Devo usare Decompiler per cercare una stringa?
Di solito cerca prima la stringa o i byte e usa Decompiler per capire la funzione che fa riferimento al risultato. Listing e byte sono la prova più diretta della corrispondenza.