
Un plugin de Ghidra para localizar límites de archivos de objeto.
Plugin de Ghidra para la GUI de DeepCut / CodeCut
CodeCut permite al usuario asignar funciones a archivos objeto en Ghidra y, a continuación, interactuar con el binario a nivel de archivo objeto. Las funciones se asignan a archivos objeto estableciendo el campo Namespace en la base de datos de Ghidra. DeepCut intenta establecer los límites iniciales de los archivos objeto, que el usuario puede ajustar después mediante la ventana de la tabla CodeCut.
La mayoría de los binarios se originan a partir de múltiples archivos de código fuente. Al realizar ingeniería inversa, los analistas de RE a menudo desarrollan una idea de qué funciones están relacionadas y, por lo tanto, probablemente pertenecían al mismo archivo de código fuente. CodeCut permite al analista formular una hipótesis como "Creo que este bloque de funciones son funciones del OS." Ahora bien, si hay funciones sin explorar en esa región, aparecerán en el desensamblado y la descompilación como OS::FUN_XXXXXXXX en lugar de simplemente FUN_XXXXXXXX. Esto permite comprender más rápidamente para qué podrían utilizarse las funciones cuando se ven en contexto.
Siga los procedimientos normales de instalación de extensiones de Ghidra. Copie el zip de las extensiones CodeCut y DeepCut en $GHIDRA_INSTALL_DIR/Extensions y, a continuación, en la ventana principal de Ghidra seleccione File -> Install Extensions y marque las casillas CodeCut y DeepCut. Ghidra le indicará que necesita reiniciarse. Dado que Ghidra ahora solo exige que los plugins coincidan con la versión major/minor de la versión base y no con las versiones patch, esperamos publicar únicamente versiones major/minor pares.
NOTA: Después de reiniciar y cargar una ventana CodeBrowser, Ghidra le indicará que ha encontrado nuevos plugins y le preguntará si desea configurarlos. Solo CodeCut aparece en esta ventana. Esto se debe a que DeepCut es un analizador "one-shot" (aunque sigue instalado).
Tanto CodeCut como DeepCut dependen de la extensión PyGhidra nativa y no son compatibles con Jython. CodeCut utiliza Python nativo para adivinar los nombres de los módulos. La inferencia del modelo de DeepCut se ejecuta en Python nativo.
CodeCut:
DeepCut:
Para instalar las dependencias, ejecute:
pip install nltk
pip install torch torch-geometric networkx scipy
usando la instalación de Python vinculada a su PyGhidra.
DeepCut se ejecuta mejor como un analizador one-shot después del autoanálisis inicial. Seleccione Analysis -> One Shot -> Deepcut. Después de que DeepCut se ejecute, puede ver los resultados consultando el campo Namespace en la vista Symbol Table.

Después de que DeepCut se ejecute, puede interactuar a nivel de archivo objeto con la vista CodeCut Table. Seleccione Window -> CodeCut Table para mostrar la tabla. La tabla CodeCut es esencialmente un conjunto combinado de tablas de símbolos, una para cada módulo.
Puede hacer que CodeCut adivine los nombres de los módulos (basándose en referencias de cadenas) eligiendo Analysis -> Guess Module Names en la ventana de la tabla CodeCut. Esto es útil si su ejecutable objetivo tiene muchas cadenas de depuración. El script de adivinación de nombres intenta encontrar primero los nombres de archivos de código fuente y luego recurre a cadenas (incluidos bigramas y trigramas) que se repiten varias veces.
Puede dividir/combinar archivos objeto haciendo clic derecho en un objeto y eligiendo Split Namespace Here / Combine Namespaces. Puede mover funciones entre archivos objeto (cambiando los límites de los archivos objeto) arrastrándolas y soltándolas.
CodeCut contiene dos opciones para exportar un módulo completo o un subrango de un módulo como C recompilable en el menú Export al hacer clic derecho en un módulo de la tabla CodeCut. Esta característica está marcada como EXPERIMENTAL y no está bien probada.

CodeCut ahora tiene una opción de gráfico para ver las interacciones / la jerarquía de los módulos dentro de un binario. Agregue namespaces a la vista de gráfico haciendo clic derecho en una función de la tabla CodeCut y eligiendo Add Namespace to Graph. Puede eliminar módulos del gráfico haciendo clic derecho y eligiendo Show Namespaces in Graph Filter.
Aunque parezca que puede hacer clic derecho en los nombres de los módulos del lado derecho, CodeCut en realidad presta atención a qué función está resaltada en la tabla. Así, por ejemplo, si tiene una función resaltada en object3 y hace clic derecho en el recuadro gris de object2 a la izquierda y hace clic en Combine/Split o Rename Namespaces, CodeCut realizará la operación sobre la función que tiene resaltada en object3.
CodeCut intenta ordenar los namespaces por su dirección de inicio. CodeCut puede parecer que lista los módulos en desorden; sin embargo, esto suele deberse a irregularidades del desensamblado de Ghidra. Por ejemplo, supongamos que tenemos un mapa de memoria como este:
object2: 0x00010000 - 0x00018000
object3: 0x00018004 - 0x00020000
...
object50: 0x00480000 - 0x00480a00
Supongamos que la función en 0x00480000 hace una bifurcación o salto a una dirección 0x00016008. Debería ser un nuevo punto de entrada de función, pero si solo una función lo utiliza, Ghidra podría no etiquetarlo como punto de entrada de función y simplemente considerarlo parte de FUN_00480000. Esto significa que el rango real de object50 es 0x00016008 - 0x00480a00. Y, por lo tanto, object50 aparecerá entre object2 y object3 en la tabla. CodeCut envía los rangos de los módulos al registro de aplicación de Ghidra para ayudar a depurar este tipo de problemas. En este caso, definir 0x00016008 como función hará que los límites de object50 sean los valores correctos y object50 aparecerá en el lugar correcto de la tabla.
Las funciones que se definen después de haber ejecutado el análisis DeepCut se agregan por defecto al namespace Global. En el futuro planeamos añadir una función que las agregue automáticamente al namespace más cercano, o proporcionar un mecanismo para asignar más fácilmente funciones individuales directamente a un namespace específico.
Las instrucciones específicas de compilación se proporcionan en las subcarpetas DeepCut y CodeCut.