
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.
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:
- Copiar todo -> Copiar todos los bytes al portapapeles
- Copiar no inmediato -> en blanco (AA ?? BB) cualquier bytes de instrucción inmediatos
- Solo códigos de operación -> borrará todo excepto el código de operación real (y el prefijo) de la instrucción
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:
- «pasar» -> coincide con cualquier instrucción con cualquier operando
- «mov* any,any» -> coincide con una instrucción con el mnemotécnico «mov*» (por ejemplo, mov, movzx, …) y dos argumentos cualesquiera.
- «mov eax, r32» -> coincide con cualquier instrucción con el mnemotécnico «mov», el primer operando registra eax y el segundo operando cualquier registro de 32 bits.
- Analogía: r significa cualquier registro, r8/r16/r32/r64 significa un registro de ancho específico, «imm» significa cualquier valor inmediato
- «mov r64, imm» -> coincide con cualquier movimiento de la constante en un registro de 64 bits
- «any r64,r64» -> coincide con cualquier operación entre dos registros de 64 bits
- mov -> cualquier instrucción que coincida con mov mnemónico
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:
- «TestString» -> la función debe citar la cadena exacta al menos una vez (ignorando mayúsculas y minúsculas)
- «TestStr*» -> la función debe hacer referencia a una cadena que comience con ‘TestStr (por ejemplo, TestString, TestStrong) al menos una vez (ignorando mayúsculas y minúsculas)
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:
- «memset» -> la función debe hacer referencia a una ubicación llamada «memset» al menos una vez
- «mem*» -> la función debe hacer referencia a una ubicación que comience con «mem» (memset, memcpy, memcmp) al menos una vez
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:
- Ctrl+Alt+F -> Iniciar/Mostrar TabWidget (GUI principal)
- Ctrl+F -> iniciar la búsqueda con las reglas habilitadas actualmente
- Ctrl+R -> Refinar los resultados existentes con las reglas habilitadas actualmente
- regla
- Ctrl+C -> Copiar la regla seleccionada al portapapeles
- Ctrl+V -> Pegar las reglas del portapapeles a la pestaña actual (añadir)
- Ctrl+S -> guardar las reglas seleccionadas en el archivo
- Ctrl+L -> Cargar reglas seleccionadas del archivo (adjuntar)
- Ctrl+A -> seleccionar todas las reglas
- Supr -> eliminar la regla seleccionada
- guardar la sesión
- Ctrl+Shift+S -> guardar sesión en archivo
- Ctrl+Shift+L -> Cargar sesión desde archivo
Más uso de GUI
- Las reglas se pueden editar haciendo doble clic en la columna de datos
- Las reglas se pueden invertir (coincidencias negativas) haciendo doble clic en la columna de coincidencia inversa
- Las reglas se pueden habilitar/deshabilitar haciendo doble clic en la columna habilitada
- Las pestañas se pueden renombrar haciendo doble clic
- Tanto Rule-List como Result-List admiten la clasificación
- Haga doble clic en el elemento Resultado en IDA para saltar a él
- nombre de la función: salta al principio de la función
- Cualquier otra columna: salta a la coincidencia de la última regla coincidente
- Perfil de casilla de verificación: información de perfil de salida para la búsqueda
- Depuración de casilla de verificación: vuelque la salida de depuración detallada de las coincidencias de reglas de código; utilícela solo cuando pocas funciones coincidan con las reglas de inspección de código; de lo contrario, ¡puede llevar mucho tiempo!
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