Ghidra Downloadguida indipendente al download e all’installazione
Italiano
GUIDA ALLA RICERCA IN GHIDRA

Cercare stringhe in Ghidra: trovare indirizzi, istruzioni e funzioni

Il modo più rapido per analizzare un programma è trasformare un indizio generico in un obiettivo di ricerca preciso. Questa guida spiega quando usare Defined Strings, Search Program Text, Search Memory, Go To, Symbol Tree e i riferimenti incrociati per passare da una stringa o da un indirizzo alla funzione che lo utilizza.

Apri la documentazione ufficiale di ricerca di Ghidra
Attività principaleTrovare prove nel programma
Punto di partenzaStringa o indirizzo noto
Viste utiliListing + XREF + Decompiler
Versione verificataGhidra 12.1.3
RISPOSTA RAPIDA

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.

Usa file di pratica autorizzati

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.
PASSO 1

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. 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. 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. 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. 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
Listing ufficiale di Ghidra CodeBrowser con indirizzi, albero del programma, byte e dati decodificati
Screenshot ufficiale di Ghidra CodeBrowser: verifica il risultato nel Listing prima di interpretarlo.
PASSO 2

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.
PASSO 3

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.

Perché lo stesso indirizzo può apparire diverso

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.

IndizioPrimo strumentoCosa verificare dopo
Indirizzo caricato esattoGo ToSpazio, blocco, istruzione o dato di destinazione
Sequenza esadecimaleSearch MemoryEndianness, allineamento, intervallo, riferimenti
URL o messaggioRicerca stringheCodifica, definizione, XREF, funzione utilizzatrice
Nome o etichettaSymbol Tree / Search Program TextNamespace, tipo, chiamanti e chiamati
Valore di log o debuggerGo To + ListingRebase, base del modulo, offset rispetto all'indirizzo
PASSO 4

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. 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. 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. 3

    Validare la corrispondenza

    Apri il risultato, leggi l'istruzione e il blocco completo e confronta riferimenti e chiamanti.

    Listing + XREF + Function Graph
Function Graph ufficiale di Ghidra con blocchi base e archi del flusso di controllo
Screenshot ufficiale di Function Graph: verifica il flusso attorno a un risultato di ricerca istruzioni.
PASSO 5

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.

RisultatoInterpretazioneProssimo passo sicuro
Funzione con nomeEsiste un confine simbolicoControlla chiamanti, chiamati, firma e riferimenti
FUN_... o funzione senza nomeLa funzione esiste ma il ruolo è ignotoUsa stringhe, chiamate e flusso prima di rinominare
Indirizzo non definitoNon esiste ancora un confine affidabileControlla codice/dati e analizza una copia
Risultato dentro un bloccoL'indizio è vicino a codice o datiLeggi il blocco completo e segui gli XREF
Nessun riferimentoUso indiretto o definizione incompletaControlla tabelle di puntatori, relocation e intervallo
FAQ DI RICERCA

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.