Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
FindFunc — Plugin de IDA Pro para filtrar funciones por patrones de ensamblador, secuencias de bytes, referencias a cadenas/nombres y restricciones de tamaño, con búsqueda basada en reglas y copia binaria avanzada. | Kitploit
Herramientas/GitHubGitHub/felixber/findfunc
Análisis EstáticoAnálisis de CódigoIngeniería InversaDepuradoresAnálisis de Binarios
GitHubfelixber/findfunc

FindFunc

Plugin de IDA Pro para filtrar funciones por patrones de ensamblador, secuencias de bytes, referencias a cadenas/nombres y restricciones de tamaño, con búsqueda basada en reglas y copia binaria avanzada.

Ver Repositorio
36236hace 9 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

FindFunc: Filtrado/Búsqueda Avanzada de Funciones en IDA Pro

FindFunc es un plugin de IDA Pro para encontrar funciones de código que contienen un cierto patrón de ensamblador o bytes, referencian un cierto nombre o cadena, o cumplen con varias otras restricciones.

FindFunc obtuvo el tercer lugar en el Concurso de Plugins de IDA Pro de HexRays 2022!

ffmain

Filtrado con Reglas

La funcionalidad principal de FindFunc es permitir al usuario especificar un conjunto de 'Reglas' o restricciones que una función de código en IDA Pro debe cumplir. FF entonces encontrará y listará todas las funciones que cumplan TODAS las reglas (por lo que actualmente todas las Reglas están en una conjunción AND). Excepción: las Reglas pueden ser 'invertidas' para ser coincidencias negativas. Dichas reglas se ajustan a 'AND NOT'.

FF programará las reglas en un orden inteligente para minimizar el tiempo de procesamiento. Resumen de características:

  • Actualmente hay 6 Reglas disponibles, ver más abajo
  • Conocimiento de fragmentos de función
  • Programación inteligente de reglas para rendimiento
  • Guardar/Cargar reglas desde/a archivo en formato ascii simple
  • Varias pestañas independientes para experimentación
  • Copiar reglas entre pestañas mediante portapapeles (mismo formato que el formato de archivo)
  • Guardar toda la sesión (todas las pestañas) en un archivo
  • Copia avanzada de bytes de instrucción (todos, solo opcodes, todos excepto inmediatos, ...)
  • Clonar pestañas para experimentos rápidos con refinamiento de resultados
  • La coincidencia de código respeta el Prefijo de Tamaño de Direccionamiento y el Prefijo de Tamaño de Operando

El botón 'Find Functions' (Buscar funciones) borra los resultados existentes e inicia una búsqueda nueva, 'Refine Results' (Refinar resultados) considera solo los resultados de la búsqueda anterior.

Copia Binaria Avanzada

Una característica secundaria de FF es la opción de copiar la representación binaria de instrucciones con las siguientes opciones:

  • copiar todo -> copiar todos los bytes al portapapeles
  • copiar sin inmediatos -> enmascarar (AA ?? BB) cualquier valor inmediato en los bytes de la instrucción
  • solo opcode -> enmascarará todo excepto el/los opcode(s) real(es) de la instrucción (y prefijos)
  • ...

Consulte la sección 'copia avanzada' a continuación para más detalles. ¡Esta característica complementa muy bien la regla de Patrón de Bytes!

Compilación e Instalación

FindFunc es un plugin de Python para IDA Pro sin dependencias de paquetes externos. Se puede instalar descargando el repositorio y copiando el archivo 'findfuncmain.py' y la carpeta 'findfunc' a su directorio de plugins de IDA Pro. Para IDA 9.0+, el repositorio también se puede clonar directamente en el directorio de plugins. De cualquier manera, no se requiere compilación.

Requisitos: IDA Pro 8.x (8.3+) con entorno python3. FindFunc está diseñado solo para arquitectura x86/x64. Ha sido probado con IDA 8.3 - 9.2, python 3.11 en Windows 10 + 11

Reglas Disponibles

Actualmente, las siguientes seis reglas están disponibles. Están ordenadas de pesada a ligera en cuanto a impacto en el rendimiento. Con bases de datos grandes, es buena idea reducir primero las funciones candidatas con una regla barata, antes de realizar coincidencias pesadas mediante, por ejemplo, Reglas de Código. FF programará las reglas automáticamente de manera inteligente.

Patrón de Código

Regla para filtrar funciones basándose en que contengan un fragmento de código ensamblador dado. Esto NO es una búsqueda de texto de la representación textual de desensamblado de IDA, sino que realiza una coincidencia avanzada de la instrucción subyacente. El fragmento puede contener muchas instrucciones consecutivas, una por línea. Se soportan fragmentos de función. Soporta coincidencia con comodines especiales, además del ensamblador literal:

  • "pass" -> coincide con cualquier instrucción con cualquier operando
  • "mov* any,any" -> coincide con instrucciones con nemónico "mov*" (ej. mov, movzx, ...) y cualquier par de argumentos.
  • "mov eax, r32" -> coincide con cualquier instrucción con nemónico "mov", primer operando registro eax y segundo operando cualquier registro de 32 bits.
    • Análogo: r para cualquier registro, r8/r16/r32/r64 para registro de un ancho específico, "imm" para cualquier inmediato
  • "mov r64, imm" -> coincide con cualquier movimiento de una constante a un registro de 64 bits
  • "any r64,r64" -> coincide con cualquier operación entre dos registros de 64 bits
  • mov -> coincide con cualquier instrucción del nemónico mov

más ejemplos:

root@kitploit:~
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any

Precauciones: Tenga cuidado al copiar ensamblador desde IDA. IDA mezcla nombres de variables locales y otra información en la instrucción, lo que lleva a fallos de coincidencia. Además, las etiquetas no son compatibles ("call sub_123456").

Tenga en cuenta que los Patrones de Código son la Regla más costosa, y si solo hay Reglas de Código presentes, FF no tiene más opción que desensamblar toda la base de datos. Esto puede llevar hasta varios minutos para binarios muy grandes. Consulte las notas sobre rendimiento más abajo.

Valor Inmediato (Constante)

La función debe contener el inmediato dado al menos una vez en cualquier posición. Un valor inmediato es un valor fijo en la representación binaria de la instrucción. Ejemplos de instrucciones que coinciden con el valor inmediato 0x100:

root@kitploit:~
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100

Los inmediatos se pueden pegar directamente desde el portapapeles en la lista de reglas. Nota: IDA realiza una coincidencia exhaustiva de cualquier tamaño y cualquier posición del inmediato. Si sabe que es de un ancho específico de 4 u 8 bytes, un patrón de bytes puede ser más rápido (pero puede producir falsos positivos).

Patrón de Bytes

La función debe contener el patrón de bytes dado al menos una vez. El patrón tiene el mismo formato que la búsqueda binaria de IDA y, por lo tanto, admite comodines: ¡la combinación perfecta para la función de copia avanzada!

Ejemplos:

root@kitploit:~
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? puede ser cualquier byte

Los patrones de bytes se pueden pegar directamente desde el portapapeles en la lista de reglas. Nota: La coincidencia de patrones es bastante rápida y una buena opción para reducir rápidamente las coincidencias.

Referencia a Cadena

La función debe referenciar la cadena dada al menos una vez. La cadena se compara según el módulo 'fnmatch' de Python y, por lo tanto, admite coincidencias tipo comodín. La comparación se realiza sin distinción de mayúsculas y minúsculas. Se consideran cadenas de los siguientes formatos: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (esto se puede cambiar en la clase Config).

Ejemplos:

  • "TestString" -> la función debe referenciar la cadena exacta (ignorando mayúsculas) al menos una vez
  • "TestStr*" -> la función debe referenciar una cadena que comience con 'TestStr' (ej. TestString, TestStrong) al menos una vez (ignorando mayúsculas)

Nota: La coincidencia de cadenas es rápida y una buena opción para reducir rápidamente los candidatos.

Referencia a Nombre

La función debe referenciar el nombre/etiqueta dado al menos una vez. El nombre/etiqueta se compara según el módulo 'fnmatch' de Python y, por lo tanto, admite coincidencias tipo comodín. La comparación se realiza sin distinción de mayúsculas y minúsculas.

Ejemplos:

  • "memset" -> la función debe referenciar un nombre "memset" al menos una vez
  • "mem*" -> la función debe referenciar un nombre que comience con "mem" (memset, memcpy, memcmp) al menos una vez

Nota: La coincidencia de nombres es muy rápida e ideal para reducir rápidamente los candidatos.

Tamaño de Función

El tamaño de la función debe estar dentro del límite dado: "min <= tamaño_funcion <= max". Los datos se ingresan como una cadena de la forma "min,max". El tamaño de una función incluye todos sus fragmentos.

Nota: La coincidencia por tamaño de función es muy rápida e ideal para reducir rápidamente los candidatos.

Atajos de Teclado e Interfaz Gráfica

Para facilitar su uso, FF se puede utilizar mediante los siguientes atajos de teclado:

  • Ctrl+Alt+F -> iniciar/mostrar TabWidget (GUI principal)
    • O Ver->FindFunc
  • Ctrl+F -> iniciar búsqueda con las reglas actualmente habilitadas
  • Ctrl+R -> refinar resultados existentes con las reglas actualmente habilitadas
  • Reglas
    • Ctrl+C -> copiar reglas seleccionadas al portapapeles
    • Ctrl+V -> pegar reglas desde el portapapeles en la pestaña actual (agrega)
    • Ctrl+S -> guardar reglas seleccionadas en un archivo
    • Ctrl+L -> cargar reglas seleccionadas desde un archivo (agrega)
    • Ctrl+A -> seleccionar todas las reglas
    • Supr -> eliminar reglas seleccionadas
  • Guardar Sesión
    • Ctrl+Mayús+S -> Guardar sesión en un archivo
    • Ctrl+Mayús+L -> Cargar sesión desde un archivo

Uso adicional de la GUI

  • Clic derecho en pestaña: opción para clonar pestaña
  • Las reglas se pueden editar haciendo doble clic en la columna Data
  • Las reglas se pueden invertir (coincidencia negativa) haciendo doble clic en la columna de coincidencia inversa
  • Las reglas se pueden habilitar/deshabilitar haciendo doble clic en la columna de habilitación
  • Clic con rueda en cualquier celda de Reglas o Resultados copia la celda al portapapeles
  • Los patrones de bytes e inmediatos se pueden pegar directamente desde el portapapeles en la tabla de Reglas
  • Las pestañas se pueden renombrar haciendo doble clic en ellas
  • Se admite ordenamiento tanto para la lista de Reglas como para la lista de Resultados
  • Hacer doble clic en un elemento de Resultado para saltar a él en IDA
    • nombre de función: saltar al inicio de la función
    • cualquier otra columna: saltar a la coincidencia de la última regla coincidente
  • Casilla Profile: Muestra información de perfilado para la búsqueda
  • Casilla Debug: Vuelca información de depuración detallada para la coincidencia de reglas de código - solo úselo si pocas funciones llegan a la regla de verificación de código, de lo contrario podría llevar mucho tiempo.

Copia Binaria Avanzada

Frecuentemente queremos buscar patrones binarios de ensamblador, pero sin direcciones y valores codificados (inmediatos), o incluso solo los opcodes reales de la instrucción. FindFunc facilita esto agregando tres opciones de copia al menú emergente de desensamblado:

Copiar todos los bytes

Copia todos los bytes de la instrucción como cadena hexadecimal al portapapeles, para usar en una Regla de Patrón de Bytes (o en la búsqueda binaria de IDA).

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

se copiará como

root@kitploit:~
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70

Copiar solo bytes no inmediatos

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

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

se copiará como

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??

Copiar solo opcodes

Copia todos los bytes de la instrucción como cadena hexadecimal al portapapeles, enmascarando cualquier byte que no sea el opcode real (incluyendo sib, modrm, pero manteniendo los prefijos heredados).

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

se copiará como

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??

Copiar opcodes + inmediatos

Una combinación que mantiene el opcode y los inmediatos, pero enmascara, por ejemplo, mod r/m. Note que esto mantiene los opcodes incluso si mandan registros específicos, por ejemplo

root@kitploit:~
B8 44332211      mov eax,11223344

mantendrá el opcode B8.

Nota: Esto es un 'mejor esfuerzo' usando la API de IDA, por lo que puede haber algunos casos en los que solo funcione parcialmente. Para una solución 100% correcta necesitaríamos incluir una biblioteca de desensamblado x86 dedicada.

Se pueden lograr resultados similares con Reglas de Patrón de Código, pero esto puede ser más rápido, tanto para la interacción del usuario como para la búsqueda real.

Copiar desensamblado

Copia el desensamblado seleccionado al portapapeles, tal como aparece en IDA.

Rendimiento

Un breve comentario sobre el rendimiento:

  1. nombre, cadena, tamaño de función son casi gratuitos en todos los casos
  2. patrón de bytes es casi gratuito para patrones de longitud > 2
  3. inmediato es difícil: Podemos usar la búsqueda de idaapi, o podemos desensamblar toda la base de datos y buscar nosotros mismos; tendríamos que hacer esto de todas formas si estamos buscando patrones de código. PERO: escanear patrones de código es en realidad mucho más barato que escanear un inmediato. Una búsqueda por API para todas las coincidencias es relativamente costosa: aproximadamente 1/8 del costo de desensamblar toda la base de datos. Por lo tanto: si reducimos las coincidencias con reglas baratas primero, entonces nos beneficiamos enormemente al desensamblar las funciones restantes y buscar el inmediato nosotros mismos, especialmente si de todas formas hay una regla de código presente. Sin embargo: si no existen opciones baratas y tenemos que desensamblar grandes partes de la base de datos de todas formas (debido a la presencia de reglas de patrón de código), entonces usar una regla de inmediato como prefiltro puede dar grandes frutos. Buscar por API UN inmediato es aproximadamente equivalente a 1/8 de buscar cualquier número de reglas de patrón de código, aunque esto también depende de muchos factores diferentes...
  4. los patrones de código son, con mucho, los más costosos, sin embargo, verificar un patrón vs verificar muchos es muy similar.

Por hacer (sin orden):

  • nemónico pseudo jcc
  • Permitir ubicaciones nombradas en CodeRules ('call memset')
  • agregar regla xref entrada/salida
  • deshacer/rehacer
  • barra de progreso
  • clic central para cerrar pestañas
  • menú de pestaña: cerrar todas excepto esta
  • opción 'ignorar todos los operandos siguientes'
  • Regla para parámetros de llamadas API dentro de la función
  • Regla para requisitos de función padre/lugar de llamada/hija
  • Regla para parámetros de función
  • Regla de expresión regular
  • cadena/nombre: opción de mayúsculas/minúsculas
  • ¿convertir automáticamente reglas de inmediato a patrón de bytes si corresponde?
  • configuración: sensibilidad a mayúsculas, tipos de cadena, rango, ...
  • ¿reglas de Hexrays?
  • combinación OR de reglas
  • Pythonización del código ;)
  • Paralelización
  • ¿Generación automática de reglas para identificar una función?
Descargar herramienta