Elige la herramienta según tu pista
Para buscar cadenas en Ghidra, decide primero si buscas datos que Ghidra ya definió, texto visible en el modelo del programa, bytes sin interpretar en memoria cargada o una dirección exacta. Defined Strings sirve como inventario, pero no equivale a una búsqueda completa. Una cadena corta puede no estar definida, un valor Unicode puede usar otra codificación y un valor fuera de los bloques actuales quizá no aparezca en la misma ventana.
Una investigación fiable mantiene Listing como fuente de verdad a nivel de dirección. Usa Decompiler para explicar una función después de localizar la evidencia, no para sustituir la búsqueda. La documentación oficial para principiantes cubre el flujo general de CodeBrowser; esta página se concentra en las decisiones de búsqueda que suelen confundir a quien empieza.
Analiza únicamente software y sistemas que tengas permiso para revisar. Un resultado de búsqueda es evidencia sobre un archivo, no autorización para hacer ingeniería inversa ni una garantía de seguridad.
- Texto conocido: empieza con Defined Strings o Search for Strings y revisa las referencias.
- Etiqueta, símbolo, función o comentario: usa Search Program Text o Symbol Tree.
- Dirección exacta: usa Go To y confirma el bloque y la instrucción cargada.
- Secuencia de bytes o patrón: usa Search Memory con el ámbito correcto.
- Función que usa el resultado: sigue XREF y compara Listing, Function Graph y Decompiler.
Busca cadenas antes de adivinar desde el decompilador
Si conoces un mensaje, URL, ruta, comando o fragmento de error, busca el texto antes de leer cientos de funciones. Abre Defined Strings cuando quieras un inventario de las cadenas reconocidas. Si falta el valor, usa la acción de búsqueda de cadenas y revisa codificación, longitud mínima, alineación, terminación nula y bloques de memoria. Un resultado vacío suele indicar que la definición o el alcance son incorrectos, no que el texto no exista.
Un resultado solo es útil cuando verificas su dirección. Ábrelo en Listing, revisa bytes y datos cercanos y confirma que está dentro de un bloque cargado. Si Ghidra muestra texto como datos indefinidos, defínelo después de comprobar la alineación y las referencias próximas. Conserva el proyecto original o trabaja sobre una copia antes de aplicar muchas definiciones.
- 1
Empieza con una pista distintiva
Una URL completa, un fragmento distintivo o una extensión poco común produce menos falsos positivos que un término genérico o un nombre de inicialización.
Defined Strings / Search for Strings - 2
Comprueba codificación y alcance
Prueba ASCII, UTF-8, UTF-16 u otra codificación adecuada. Confirma si buscas en bloques cargados, todos los bloques o solo la selección.
Codificación + alcance de memoria - 3
Abre la dirección en Listing
Inspecciona bytes, tipo de dato, cadenas cercanas y referencias. Un resaltado no demuestra todavía cuál es la función relevante.
Open in Listing - 4
Sigue la primera referencia útil
Usa referencias o XREF para pasar del dato a una llamada, comparación, formateador o rama que explique su papel.
References / Show XRefs

Encuentra dónde se usa la cadena y por qué importa
Encontrar una URL o un mensaje suele ser el punto medio. Selecciona el dato y revisa sus referencias. Una URL puede llegar a una rutina de red, compararse con un valor local o quedar como recurso sin uso. Un mensaje puede pertenecer a un error, una comprobación de licencia, un menú o una rama de depuración. La dirección de referencia muestra dónde se consume el valor; el contexto de llamadas indica qué función cumple.
Cuando una referencia llega a una función compleja, alterna entre Listing y Decompiler. Listing muestra instrucciones y direcciones decodificadas; Decompiler propone un flujo y un modelo de variables. Renombra solo cuando la evidencia lo permita y separa lo observado de lo inferido. Así una coincidencia útil no se convierte en una explicación demasiado segura.
- Confirma que la referencia es real y no solo una coincidencia de dirección cercana.
- Lee el bloque básico e identifica comparación, llamada o formateo.
- Revisa llamadores y llamados antes de asignar un significado de negocio.
- Usa Function Graph cuando las ramas sean difíciles de seguir en Listing.
- Consulta la guía de Decompiler si el problema restante es interpretar pseudocódigo.
Encuentra una dirección de memoria, un valor o un patrón de bytes
Una pregunta como «¿dónde está 0x00421A3F?» es primero un problema de navegación. Usa Go To para saltar a la dirección y comprueba el programa, el bloque de memoria, el lenguaje y el espacio de direcciones que muestra Listing. Los offsets de archivo, las direcciones virtuales, la base de imagen y las direcciones reubicadas no son intercambiables. Si una dirección copiada no aparece, confirma si procede de un offset, una traza de depuración, un registro o un módulo reubicado.
Para datos crudos, Search Memory es más adecuado que una búsqueda de texto. Busca bytes en el orden correcto, considera el endianess y limita el bloque o la selección cuando haya demasiados resultados. Un valor puede estar en código, datos, relleno o una estructura sin relación. La búsqueda genera candidatos; los bytes cercanos y las referencias determinan cuál es útil.
Un depurador, un visor de archivos y Ghidra pueden usar coordenadas diferentes. Conserva el origen de la dirección y tradúcela de forma explícita en lugar de sumar una constante hasta que parezca correcta.
| Pista | Primera herramienta | Qué comprobar después |
|---|---|---|
| Dirección cargada exacta | Go To | Espacio, bloque e instrucción o dato de destino |
| Secuencia hexadecimal | Search Memory | Endianess, alineación, bloque y referencias cercanas |
| URL o mensaje | Búsqueda de cadenas | Codificación, definición, XREF y función consumidora |
| Nombre o etiqueta | Symbol Tree / Search Program Text | Espacio de nombres, tipo y llamadores |
| Valor de un registro o depurador | Go To + Listing | Rebase, base del módulo y offset frente a dirección |
Busca instrucciones y patrones de instrucciones
Buscar instrucciones exige una pregunta más precisa que «encuentra esta palabra». Puedes buscar un mnemónico, un registro, una constante, una secuencia o los bytes generados por un compilador. Search Program Text ayuda con el texto visible de Listing, mientras que Search Memory es mejor cuando conoces la codificación. La arquitectura y el lenguaje de importación determinan cómo se decodifican los mismos bytes, así que confirma esos valores antes de comparar resultados.
Para instrucciones Java u otros términos específicos, no mezcles vocabulario del lenguaje fuente con la sintaxis de desensamblado. Busca la representación que aparece realmente en Listing y valida una coincidencia leyendo operandos y flujo de control. Si necesitas repetir el patrón, documenta arquitectura, endianess, comodines y si buscas en memoria cargada o en una selección.
- 1
Define el patrón
Anota mnemónico, operandos, bytes, registros o constantes. Marca qué partes pueden variar entre compilaciones.
Patrón = mnemónico + operandos + comodines - 2
Elige texto o bytes
Usa búsqueda textual cuando la forma decodificada sea estable y bytes cuando la codificación sea la evidencia estable.
Search Program Text / Search Memory - 3
Valida la coincidencia
Abre el resultado, revisa toda la instrucción y el bloque, y compara referencias y llamadores.
Listing + XREF + Function Graph

Encuentra funciones, funciones indefinidas y límites útiles
Cuando una coincidencia apunta a código, usa Symbol Tree, Function Window o el contexto de Listing para comprobar si Ghidra reconoció una función. «Undefined» puede significar que el análisis aún no creó el límite, que la dirección es un dato o que la arquitectura importada necesita revisión. No crees una función solo porque una secuencia cercana parezca familiar: confirma punto de entrada, referencias, convención de llamada y retorno cuando sea posible.
En un flujo guiado por búsquedas, la función organiza la evidencia, pero no demuestra el comportamiento por sí sola. Registra dirección, dato o instrucción coincidente, referencia que los conecta y siguiente función consumidora. El tutorial para principiantes cubre Auto Analysis y Function Graph con más amplitud.
| Resultado | Interpretación | Siguiente paso seguro |
|---|---|---|
| Función con nombre | Existe un límite simbólico | Revisa llamadores, llamados, firma y referencias |
| FUN_... o función sin nombre | Existe una función, pero se desconoce su papel | Usa cadenas, llamadas y flujo antes de renombrar |
| Dirección indefinida | Aún no hay un límite fiable | Comprueba clasificación código/datos y analiza una copia |
| Coincidencia en un bloque | La pista está cerca de código o datos | Lee el bloque completo y sigue XREF |
| Sin referencias | Uso indirecto o definición incompleta | Revisa tablas de punteros, relocación y alcance |
Corrige los casos sin resultados o con demasiados resultados
El fallo más común es que la pista no coincide con su representación en el programa. Una URL puede estar dividida, codificada, comprimida, almacenada como UTF-16 o construida en tiempo de ejecución. Una dirección puede pertenecer a otra base de módulo. Un patrón puede cambiar porque el compilador eligió otro registro. Cambia una sola variable cada vez y conserva la pista junto con la configuración de búsqueda.
Si hay demasiados resultados, limita bloque, selección, tipo de dato, longitud mínima, lenguaje o rango de direcciones. Si no hay resultados, amplía una restricción, revisa bytes contiguos, prueba otra codificación y comprueba que la memoria se haya cargado. Para diferencias entre versiones, revisa la ayuda oficial actual en lugar de copiar una ruta de menú de una captura antigua.
| Síntoma | Causa probable | Siguiente comprobación |
|---|---|---|
| No aparece la cadena | Codificación, longitud o dato indefinido | Prueba la codificación correcta y revisa bytes |
| Demasiadas coincidencias | Palabra común o alcance amplio | Usa un fragmento distintivo y limita el bloque |
| No se abre la dirección | Offset, rebase o espacio incorrecto | Identifica el sistema de coordenadas y la base |
| La cadena no tiene XREF | Uso indirecto o tabla de punteros | Revisa punteros cercanos y análisis focalizado |
| No aparecen instrucciones | Sintaxis, arquitectura o compilador distinto | Busca bytes o un operando estable |
| Decompiler no coincide | El pseudocódigo es una interpretación | Vuelve a Listing, bytes, referencias y Function Graph |
Preguntas frecuentes sobre buscar en Ghidra
¿Cuál es la forma más sencilla de buscar cadenas en Ghidra?
Empieza con Defined Strings como inventario y usa la acción de búsqueda cuando falte el valor o no conozcas la codificación. Abre el resultado en Listing y sigue XREF antes de interpretar la función.
¿Cómo encuentro una dirección URL en Ghidra?
Busca un fragmento distintivo de la URL, confirma su codificación y dirección en Listing y revisa las referencias hasta la función que la lee o compara. La URL puede estar dividida o construirse en tiempo de ejecución.
¿Cómo busco una dirección de memoria concreta en Ghidra?
Usa Go To y comprueba espacio de direcciones, bloque y contenido decodificado. Traduce offsets de archivo o direcciones del depurador antes de usarlos como direcciones cargadas.
¿Cómo busco instrucciones concretas en Ghidra?
Usa Search Program Text para texto decodificado estable o Search Memory para bytes estables. Confirma arquitectura y endianess y valida cada resultado en Listing y Function Graph.
¿Por qué una búsqueda de cadenas en Ghidra no devuelve nada?
Revisa codificación, longitud mínima, alineación, bloques cargados y si el valor está dividido o se crea en tiempo de ejecución. Amplía una sola condición cada vez.
¿Debo usar Decompiler para buscar una cadena?
Normalmente busca primero la cadena o los bytes y usa Decompiler para entender la función que referencia el resultado. Listing y los bytes son la evidencia más directa de la coincidencia.