Complemento de generador de firma IDA Pro mejorado.
Copie IDA_SigMaker32.dLL y IDA_SigMaker64.dLL a su directorio plugins IDA.
La clave IDA Hot predeterminada es "Ctrl-Alt-S", pero se puede configurar en otra usando la clave de su IDA "plugins.cfg". Dado que "Ctrl-Alt-S" ahora combina en conflicto con un IDA predeterminado, para evitar obtener mensajes de advertencia, edite su "Idagui.cfg" y haga que la entrada "StackTrace" como: "StackTrace" = 0 // "Ctrl-Alt-S" // open stack trace window (el '0' deshabilita la clave).
Requiere IDA Pro Versión 7.6'ish.
Invoca el complemento a través de su tecla de acceso rápido o a través del menú Editar/complemento IDA.

Hay tres operaciones de generación de firma:
Función : se utiliza para crear un punto de entrada de función único, una firma de función mínima con compensación o una firma de cuerpo entero dependiendo de la configuración de opciones (ver más abajo).
Primero seleccione cualquier dirección dentro de la función de destino. Si la función seleccionada no es única (para el punto de entrada, o para la opción mínima), entonces se intentará una firma para un escaneo de referencia cruzada de la función única.
Casos de uso típicos: firmas para ubicar funciones en el tiempo de ejecución en la memoria de destino, para ubicar las funciones en IDA después de las actualizaciones ejecutables o para ayudar a localizar bibliotecas conocidas por firma, etc.
Ejemplo de salida de firma: 
Los resultados de la firma se empujan al portapapeles de Windows para una fácil pegado Ctrl+V en el código fuente, etc.

Formato de salida: IDA : el formato de búsqueda binaria hexadecimal predeterminado que IDA y otras herramientas admiten, utilizando bytes hexadecimales espaciados y "??" comodines. Ejemplo: C1 6C E8 ?? ?? ?? ?? 8B 50 08 estilo de código : cadena hexadecimal codificada de escape y una cadena de máscara separada donde 'x' son bytes de guardianes y '?' son bytes comodín. Ejemplo: "xC1x6CxE8xCCxCCxCCxCCx8Bx50x08", "xxx????xxx" byte en línea : una matriz de estilo m minimalista de bytes con bytes de cartas salvajes incluidos format. Ejemplo: {0xC1,0x6C,0xE8,0xAE,0xAE,0xAE,0xAE,0x8B,0x50,0x08}; Use el cuadro de edición "Byte de máscara" para cambiar el byte de máscara predeterminado "Byte en línea". El byte de máscara predeterminado es 0xAE , uno de los bytes de código menos utilizados (ver "Byte de máscara ideal" a continuación).
Los criterios para la generación de firma "función". Punto de entrada : intentará generar una firma de punto de entrada de función de tamaño de bytes mínimo cuando sea posible. Tamaño mínimo de bytes : intentará generar un conteo mínimo, con menos comodines, el tamaño de los bytes (cinco son mayores) de la firma alineada de límites dentro del cuerpo de la función seleccionada. Cuerpo de función completa : intentará generar una firma de cuerpo de función completa única.
Para cualquiera de estas tres opciones, si la función no es única, se intentará ubicar la firma de referencia cruzada única más pequeña. Si desea hacer una firma de función completa o parcial para una función no unique, use la opción "Desde el rango de direcciones" en su lugar.
Nivel de mensaje : Establezca en "Levantamiento" para la salida de mensaje de generación de firma interna en la ventana de registro de IDA.
Refs de escaneo de funciones máximas : limite cuántas funciones de referencias cruzadas para buscar cuando no se puede encontrar una firma de acción directa de "función". Normalmente, esto debería ser '0' para una búsqueda ilimitada, pero para casos problemáticos en los que hay tantas referencias que causa una desaceleración, esto se puede establecer en algún límite razonable como 16 o 100 para aumentar la velocidad de escaneo.
Para el caso relativamente raro de las funciones que tienen sus trozos extendidos sobre múltiples rangos de dirección, la herramienta intentará usar solo la primera fragmentación. Si desea hacer una firma en uno de los trozos desarticulados, intente usar el método "AT Dirección". Si todo lo demás falla, intente un SIG "desde el rango de direcciones" (que podría tomar una búsqueda manual de singularidad).
Bytes de firma de punto de entrada de la función máxima : cuando se usa la opción "función", y se configuran los criterios del "punto de entrada", limitan opcionalmente el tamaño máximo de byte de la firma del punto de entrada. El valor predeterminado es '0', para ilimitado (que puede estar a la altura de todo el tamaño del byte del cuerpo de la función seleccionada). Si se excede este límite, se buscará una firma de referencia cruzada.
Establecer en un límite práctico como '16' o '32', para firmas Xref típicamente más pequeñas vs firmas de puntos de entrada potencialmente muy grandes.
Sigmakerex ("ex") en general genera firmas de funciones más pequeñas y más estrictas mediante el uso de un mejor análisis de instrucciones. Ejemplo: Sigmaker ("SM") comodines Los bytes de operando de instrucción sub esp, 90h (como "81 EC ?? ?? ?? ?? ), tirando los últimos cuatro bytes innecesariamente. Mientras que EX lo ve como un valor inmediato y mantiene toda la secuencia 81 EC 90 00 00 00 .
EX se centra mejor en los casos de uso de la firma del cuerpo de la función normativa. Para SM solo hay una opción controlable. Intentará hacer una firma única en donde sea la dirección que seleccione en la función. Si no puede encontrar uno allí, buscará un SIG de referencia cruzada única en su lugar. Para EX, dado que el caso de uso típico identificado es localizar los puntos de entrada de la función, la firma del punto de entrada más pequeña se generará cuando se confiera la opción de criterio "Punto de entrada". Para cuando se selecciona la opción "Tamaño de byte mínimo", buscará la firma única de los comodines más pequeños y menos salvajes (de mínimo cinco bytes) dentro de todo el cuerpo de la función.
SM tiene más control de criterios de salida sobre el recuento de bytes vs comodines, etc., en su diálogo de opciones. EX supone que desea lo mejor de ambos (al menos comodines y un tamaño de byte más pequeño).
EX omite la "conversión" y la funcionalidad individual de "búsqueda" que SM tiene por preferencia por una interfaz de usuario más simple y menos abarrotada.
Para buscar, dado que EX siempre emite una salida de formato IDA además de las firmas de formato de salida seleccionadas, use la opción Binary Binary "Hex" de IDA con la cadena IDA SIG.
EX es generalmente más rápido, cuando incluso realiza búsquedas más extensas, debido a una técnica de clonación del BID en RAM y utilizando un escáner de patrón optimizado AVX2 frente a la confianza en la función de búsqueda de IDA lenta para el escaneo.
En mis propios proyectos para encontrar patrones dinámicamente, prefiero el formato "byte en línea" (por falta de mejor nombre). Es el más simple, más compacto, y no requiere una transformación de tiempo de ejecución de una cadena hexadecimal ASCII. He usado este formato para muchos proyectos y aún no he encontrado problemas de colisión de firma o de partidos redundantes.
Para minimizar posibles problemas de redundancia, es prudente usar uno de los valores de bytes de código menos utilizados para el byte comodín/máscara. Para encontrar los candidatos ideales, reuní la frecuencia de bytes de código de tres segmentos de código grandes de 32 bits y 64 bits, luego tabulé y ordené los resultados. El script "Ida_Get_byte_Frequency.py" se usa el diccionario de frecuencia recurrir un byte y guárdelo a un DB JSON. El script "byte_frequency_tabulate.py" tabula y clasifica en orden ascendente un conjunto de estos JSON DBS guardados. Es evidente que la frecuencia de bytes para 32 bits no es la misma que la de 64 bits y se tabuló de forma independiente. Consulte "32bit.txt" y "64bit.txt". En una correlación visual de los dos, 0xa2 es en realidad el denominador menos común, luego seguido de 0xAE. 0xae se eligió más de 0xa2 como el byte de máscara predeterminado ya que es subjetivamente más fácil de elegir en Hex visualmente.
Construido usando Visual Studio 2019, en Windows 10, con la única dependencia de la IDA Pro C/C ++ SDK oficial. Configuración en el archivo del proyecto, busca una variable de entorno _IDADIR desde la cual espera encontrar una carpeta "IDASDK/incluido" y una carpeta "IDASDK/LIB" donde se encuentra el SDK IDA. No usa IDADIR ya que IDA lo busca en sí mismo y puede causar un conflicto si intenta usar más de una versión IDA instalada.
Python 3.7'ish o mejor para ejecutar el script "byte_frequency_tabulate.py".
Gracias al creador de la herramienta Sigmaker original de los días de iteración C/C ++ y Python de GamamedEception.net hasta los autores actuales de C/C ++ y Python: P4TR! CK, Bobbysing, Xero | Hawk, Ajkhoury y Zoomgod et al. Gracias a Wojciech Mula por sus recursos de programación SIMD.
Lanzado bajo MIT © 2022 por Kevin Weatherman