Plugin générateur de signature IDA amélioré.
Copiez IDA_SigMaker32.dLL et IDA_SigMaker64.dLL à votre répertoire plugins IDA.
La touche de chaleur IDA par défaut est "Ctrl-ALT-S", mais peut être définie sur une autre en utilisant la clé de votre ida "plugins.cfg". Étant donné que "Ctrl-ALT-S" combo entrepose désormais avec une valeur par défaut d'IDA, pour éviter d'obtenir des messages d'avertissement, modifiez votre "idagui.cfg" et faites l'entrée "StackTrace" comme: "StackTrace" = 0 // "Ctrl-Alt-S" // open stack trace window (le '0' désactive la touche).
Nécessite IDA Pro version 7.6'ish.
Invoquez le plugin via son hot-est ou via le menu IDA Edit / Plugin.

Il y a trois opérations de génération de signature:
Fonction : Utilisé pour créer un point d'entrée de fonction unique, une signature de fonction minimale avec décalage ou une signature du corps entier en fonction de la configuration des options (voir ci-dessous).
Sélectionnez d'abord n'importe quelle adresse à l'intérieur de la fonction cible. Si la fonction sélectionnée n'est pas unique (pour le point d'entrée, ou l'option minimale), une signature pour une fonction de référence de fonction de fonction unique sera tentée.
Cas d'utilisation typiques: signatures pour localiser les fonctions au moment de l'exécution dans la mémoire cible, pour localiser les fonctions dans IDA après les mises à jour exécutables, ou pour aider à localiser les bibliothèques connues par signature, etc.
Exemple de sortie de signature: 
Les résultats de la signature sont poussés vers le presse-papiers Windows pour la collation facile de Ctrl + V dans le code source, etc.

Format de sortie: IDA : le format de recherche binaire hexadécimal par défaut qu'Ida et certains autres outils prennent en charge, en utilisant des octets hexadécimaux espacés et "??" les caractères génériques. Exemple: C1 6C E8 ?? ?? ?? ?? 8B 50 08 Style de code C1 6C E8 ?? ?? ?? ?? 8B 50 08 : chaîne hexagonale codée d'échappement et une chaîne de masque séparée où «x» sont des octets de gardien, et «? sont des octets génériques. Exemple: "xC1x6CxE8xCCxCCxCCxCCx8Bx50x08", "xxx????xxx" octet en ligne : un tableau de style C minimaliste des octets avec des octets sauvages inclus. Exemple: {0xC1,0x6C,0xE8,0xAE,0xAE,0xAE,0xAE,0x8B,0x50,0x08}; Utilisez la boîte d'édition "Mask Byte" pour modifier le byte de masque en ligne par défaut ". L'octet de masque par défaut est 0xAE , l'un des octets de code les moins utilisés (voir "Byte de masque idéal" ci-dessous).
Les critères de génération de signature "fonction". Point d'entrée : tentera de générer une signature de point d'entrée de fonction de taille d'octets minimale lorsque cela est possible. Taille minimale des octets : tentera de générer une signature minimale, avec moindre les caractères génériques, de taille d'octets (cinq est plus grande), une signature alignée sur les limites de l'instruction à l'intérieur du corps de fonction sélectionné. Corps complet de la fonction : tentera de générer une signature de corps complète unique.
Pour l'une de ces trois options, si la fonction n'est pas unique, une tentative sera faite pour localiser la plus petite signature transversale unique à la place. Si vous souhaitez faire une signature de fonction complète ou partielle pour une fonction non unique, utilisez à la place l'option "From Address Range".
Niveau de message : défini sur "Verbose" pour la sortie du message de génération de signature interne dans la fenêtre de journal IDA.
MAX Function Scan Refs : Limit le nombre de références croisées de fonction à rechercher lorsqu'une signature d'action directe "fonction" ne peut pas être trouvée. Normalement, cela devrait être `` 0 '' pour la recherche illimitée, mais pour les cas de problèmes où il y a tellement de références que cela provoque un ralentissement, cela peut être fixé à une limite raisonnable comme 16 ou 100 pour augmenter la vitesse de numérisation.
Pour le cas relativement rare de fonctions qui ont leurs morceaux répartis sur plusieurs gammes d'adresses, l'outil tentera d'utiliser juste le premier morceau. Si vous souhaitez faire une signature dans l'un des morceaux décousus, essayez d'utiliser la méthode "AT ADRESS". Si tout le reste échoue, essayez une SIG "de la gamme d'adresses" (qui pourrait prendre une recherche manuelle pour la recherche).
MAX Fonction Point Point Signature octets : Lors de l'utilisation de l'option "Fonction" et les critères "Point de saisie" sont configurés, limitez éventuellement la taille d'octets de signature du point d'entrée maximum. La valeur par défaut est «0», pour illimité (qui peut être à la hauteur de la taille de l'octet du corps de la fonction sélectionnée). Si cette limite est dépassée, une signature de référence croisée sera à la place.
Situé sur une limite pratique comme «16» ou «32», pour les signatures XREF généralement plus petites, par rapport aux signatures de point d'entrée potentiellement très grandes.
Sigmakerex ("ex") génère globalement des signatures de fonction plus petites et plus strictes en utilisant une meilleure analyse d'instructions. Exemple: Sigmaker ("SM") Wildcards les octets d'opérands de l'instruction sub esp, 90h (comme "81 EC ?? ?? ?? ?? ), jetant les quatre derniers octets inutilement. Tandis que Ex considère comme une valeur immédiate et maintient l'ensemble de la séquence 81 EC 90 00 00 00 .
EX est mieux concentré sur les cas d'utilisation de la signature du corps de la fonction normative. Pour SM, il n'y a qu'une seule option contrôlable. Il tentera de faire une signature unique à partout où vous sélectionnez dans la fonction. S'il ne peut pas en trouver un, il cherchera à la place un sig de référence croisée unique. Pour ex, comme le cas d'utilisation typique identifié est de localiser les points d'entrée de la fonction, la plus petite signature de point d'entrée sera générée lorsque l'option de critère "Point de saisie" sera configurée. Pour que l'option "taille minimale d'octets" soit sélectionnée, il recherchera la signature unique du nombre de jacquage les plus petites et les moins génériques (de cinq octets minimum) dans l'ensemble du corps de la fonction.
SM a plus de critères de sortie Contrôle sur le nombre d'octets par rapport aux jilèges, etc., dans sa boîte de dialogue Options. Ex suppose que vous voulez le meilleur des deux (moins de caractères génériques et la plus petite taille d'octets).
Ex omet la fonctionnalité "conversion" et la "recherche individuelle" que SM a sur une préférence pour une interface utilisateur plus simple et moins encombrée.
Pour la recherche, puisque EX émet toujours la sortie du format IDA en plus des signatures de format de sortie sélectionnées, utilisez l'option IDA Binary Search "Hex" avec la chaîne IDA SIG.
EX est généralement plus rapide, lorsqu'il fait même des recherches plus étendues, en raison d'une technique de clonage de la BID dans la RAM et de l'utilisation d'un scanner de motif optimisé AVX2 par rapport à la fonction de recherche d'IDA lente pour la numérisation.
Dans mes propres projets pour trouver des modèles dynamiquement, je préfère le format "octet en ligne" (faute d'un meilleur nom). C'est la plus simple, la plus compacte, et elle ne nécessite pas de transformation d'exécution d'une chaîne hexagonale ASCII. J'ai utilisé ce format pour de nombreux projets et je n'ai pas encore rencontré de collision de signature ou de problèmes de match redondants.
Pour minimiser les problèmes de redondance potentiels, il est prudent d'utiliser l'une des valeurs d'octets de code les moins utilisées pour l'octet générique / masque. Pour trouver les candidats idéaux, j'ai rassemblé la fréquence d'octet de code de trois de grands segments de code 32 bits et 64 bits, puis tabulé et trié les résultats. Le script "ida_get_byte_frequency.py" IDA est utilisé le dictionnaire de fréquence d'octets de collecte et l'enregistre sur une base de base JSON. Le script "byte_frequency_tabulate.py" tabule et trie dans l'ordre ascendant un ensemble de ces DB JSON enregistrés. Il est évident que la fréquence d'octets pour 32 bits n'est pas la même que celle de 64 bits et a tabulé indépendamment. Voir "32bit.txt" et "64bit.txt". Dans une corrélation visuelle des deux, 0xa2 est en fait le dénominateur le moins commun, puis suivi de 0xae. 0xae a été choisi sur 0xa2 comme octet de masque par défaut car il est subjectivement plus facile à choisir visuellement hexadécial.
Construit à l'aide de Visual Studio 2019, sur Windows 10, la seule dépendance étant le SDK officiel IDA Pro C / C ++. Configuration dans le fichier du projet, il recherche une variable d'environnement _IDADIR à partir de laquelle il prévoit de trouver un dossier "idasdk / include" et un dossier "idasdk / lib" où se trouve le SDK IDA. Ne pas utiliser IDADIR puisque IDA le cherche lui-même et peut provoquer un conflit si vous essayez d'utiliser plus d'une version IDA installée.
Python 3.7'ish ou mieux pour exécuter le script "byte_frequency_tabulate.py".
Grâce au créateur de l'outil Sigmaker original de la GameDeception.net Days jusqu'à les auteurs actuels de C / C ++ et Python: P4tr! CK, Bobbysing, Xero | Hawk, Ajkhoury et Zoomgod et al. Merci à Wojciech Mula pour ses ressources de programmation SIMD.
Libéré sous MIT © 2022 par Kevin Weatherman