Tutoriales

Funciones avanzadas de filtro/búsqueda en IDA Pro

encontrar función es un complemento de IDA Pro para encontrar funciones de código que contienen ensamblados específicos o patrones de bytes, hacen referencia a nombres o cadenas específicos, o se ajustan a varias otras restricciones. Este no es un competidor de herramientas como Diaphora o BinNavi, pero es ideal para encontrar funciones conocidas en nuevos binarios para casos en los que fallan los enlaces clásicos.

filtrar usando reglas

La función principal de FindFunc es permitir que el usuario especifique un conjunto de «reglas» o restricciones que deben cumplir las funciones de código en IDA Pro. FF luego encontrará y enumerará todas las funciones que satisfagan todas las reglas (por lo que todas las reglas actuales están en una conexión AND). Excepción: las reglas se pueden «invertir» a coincidencias negativas. Por lo tanto, tales reglas se ajustan a NAND.

FF organizará las reglas en un orden inteligente para minimizar el tiempo de procesamiento. Resumen funcional:

  • Actualmente hay 6 reglas disponibles, ver más abajo
  • La coincidencia de códigos respeta el prefijo de tamaño de direccionamiento y el prefijo de tamaño de operando
  • Más información sobre los bloques de funciones
  • Programación inteligente de reglas de rendimiento
  • Guardar/cargar reglas de/a archivo en formato ascii simple
  • Varias pestañas separadas para experimentos
  • Copie reglas entre pestañas a través del portapapeles (mismo formato que el archivo)
  • Guarde toda la sesión (todas las pestañas) en un archivo
  • Copia avanzada de bytes de instrucciones (todos, solo códigos de operación, todos excepto los inmediatos)

El botón «Función de búsqueda» borra los resultados existentes e inicia una nueva búsqueda, «Refinar resultados» solo considera los resultados de búsquedas anteriores.

Publicaciones relacionadas

Replicación binaria avanzada

Una segunda característica de FF es que la representación binaria de una instrucción se puede copiar con las siguientes opciones:

Para obtener más información, consulte la sección Copia avanzada a continuación. ¡Esta característica complementa muy bien las reglas del patrón de bytes!

Construcción e Instalación

FindFunc es un complemento de Python de IDA Pro sin dependencias de paquetes externos. Se puede instalar descargando el repositorio y copiando el archivo findfuncmain.py y la carpeta findfunc en el directorio de complementos de IDA Pro. No se requieren edificios.

Requisitos: entorno IDA Pro 7.x (7.6+) y python3. FindFunc solo funciona en arquitecturas x86/x64. Ha sido probado en Windows 10 con IDA 7.6/7.7, python 3.9 e IDAPython 7.4.0.

Las siguientes seis reglas están actualmente disponibles. En términos de impacto en el rendimiento, se ordenan aquí de pesados ​​a livianos. Para bases de datos grandes, es una buena idea reducir primero las funciones candidatas con reglas baratas antes de hacer muchas coincidencias, por ejemplo, con reglas de código. FF programa automáticamente las reglas de forma inteligente.

patrón de código

Reglas para filtrar funciones en función de las cuales contienen una determinada pieza de código ensamblador. Esta no es una búsqueda de texto representada por un desensamblado de texto IDA, sino una coincidencia avanzada que ejecuta instrucciones de bajo nivel. El fragmento puede contener muchas instrucciones consecutivas, una por línea. Los bloques de funciones son compatibles. Además del ensamblaje literal, se admite la coincidencia especial de comodines:

Más ejemplos:

mov r64, [r32 * 8 + 0x100]
Muevete, [r * 8 – 0x100]
mov r64, [r32 * 8 + imm]
atravesar
mov r, palabra [eax + r32 * 8 – 0x100]
Cualquier r64, r64
Empujarme
empujar cualquier

trampa: Tenga cuidado al copiar ensamblajes de IDA. IDA mezcla nombres de variables locales y otra información en la instrucción que hace que la coincidencia falle. Además, las etiquetas («call sub_123456») no son compatibles.

Tenga en cuenta que los patrones de código son las reglas más caras y, si solo existen reglas de código, FF no tiene más remedio que desmontar toda la base de datos. Para binarios muy grandes, esto puede tardar varios minutos. Consulte las notas de rendimiento a continuación.

valor inmediato (constante)

La función debe contener el valor inmediato dado al menos una vez en cualquier lugar. Los valores inmediatos son valores que se fijan en la representación binaria de la instrucción. Un ejemplo de una instrucción que coincide con el 0x100 inmediato:

eax móvil, 0x100
eax móvil, [0x100]
y también, [eax + ebx*8 + 0x100]
empuje 0x100

Nota: IDA hace una coincidencia amplia contra cualquier tamaño y cualquier posición de valor inmediato. El modo byte puede ser un poco más rápido si sabe que tiene un ancho específico de 4 u 8 bytes.

modo de bytes

La función debe contener el patrón de bytes dado al menos una vez. Este patrón tiene el mismo formato que la búsqueda binaria IDA, por lo que se admiten comodines: ¡una combinación perfecta para funciones de copia avanzadas!

ejemplo:

11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? puede ser cualquier byte

referencia de cadena

La función debe citar la cadena dada al menos una vez. La cadena se compara de acuerdo con el módulo ‘fnmatch’ de python, por lo que se admite la coincidencia similar a un comodín. La coincidencia no distingue entre mayúsculas y minúsculas. Considere una cadena del siguiente formato: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (Esto se puede cambiar en la clase Config).

ejemplo:

NOTA: ¡La coincidencia de cadenas es rápida y una buena opción para reducir candidatos rápidamente!

referencia de nombre

La función debe hacer referencia al nombre/etiqueta proporcionado al menos una vez. Los nombres/etiquetas se emparejan de acuerdo con el módulo ‘fnmatch’ de python, por lo que se admite la coincidencia similar a un comodín. La coincidencia no distingue entre mayúsculas y minúsculas.

ejemplo:

NOTA: La coincidencia de nombres es muy rápida, ¡excelente para reducir candidatos rápidamente!

tamaño de la función

El tamaño de la función debe estar dentro de los límites dados: «min <= functionsize <= max". Los datos se ingresan como una cadena de la forma "min, max". El tamaño de una función incluye todos sus bloques.

Nota: la coincidencia del tamaño de la función es muy rápida, ¡ideal para candidatos de corte rápido!

Métodos abreviados de teclado e interfaz gráfica de usuario

Para facilitar su uso, FF está disponible a través de los siguientes atajos de teclado:

Más uso de GUI

Replicación binaria avanzada

A menudo queremos buscar el modo binario del ensamblado, pero no hay direcciones ni valores codificados (valores inmediatos), ni siquiera el código de operación real de la instrucción. FindFunc facilita esto al agregar tres opciones de copia al menú emergente de desmontaje:

copiar todos los bytes

Copia todos los bytes de instrucción al portapapeles como una cadena hexadecimal para usar en reglas de patrones de bytes (o búsqueda binaria IDA).

B8 44332211 Móvil eax, 11223344
68 00000001 empuje 1000000
66:894424 70 mov palabra ptr ss:[esp+70],hacha

Copie solo bytes no inmediatos

Copia los bytes de instrucción de la instrucción dada, enmascarando cualquier valor inmediato. ejemplo:

B8 44332211 Móvil eax, 11223344
68 00000001 empuje 1000000
66:894424 70 mov palabra ptr ss:[esp+70],hacha

LEER  Use NIX para simplificar la implementación de la aplicación

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba