Question:
Plug-in / script IDA pour générer des statistiques de signature (pour tous les sigs) pour une cible?
johnrl
2014-01-28 19:03:51 UTC
view on stackexchange narkive permalink

J'ai plus de 40 fichiers de signatures IDA différents (en plus des fichiers intégrés) et parfois je ne veux pas avoir à examiner quelles signatures peuvent être pertinentes pour une cible donnée. Au lieu de cela, je veux simplement appliquer toutes les signatures, une à la fois, et que l'IDA me dise lesquelles ont le plus de correspondances dans la cible. Faire cela manuellement est très fastidieux car

  1. IDA ne permet d'appliquer qu'une seule signature dans chaque opération d'application
  2. L'ordre d'application des signatures influence le nombre de correspondances qu'une signature donnée génère. Par exemple, lorsque sig A est appliqué, cela peut signifier que sig B manque des correspondances auxquelles A a correspondu avant lui.

J'imagine que le plugin / script ferait quelque chose comme ceci: appliquer sig A à la base de données cible, compter les correspondances, puis supprimer l'application de sig A et appliquer B, compter les correspondances, puis supprimer l'application et appliquer C et ainsi de suite.

Personne d'autre n'a jamais eu cette idée? Je n'ai pas pu trouver un plugin ou un script qui fasse cela, et je préfère ne pas écrire le mien s'il en existe déjà un.

Trois réponses:
Sirmabus
2014-02-03 11:29:15 UTC
view on stackexchange narkive permalink

Si vous parlez des signatures IDA FLIRT, malheureusement, tôt ou tard, vous atteindrez probablement leurs limites et, ou, vous serez frustré par les résultats si vous voulez une haute précision.

Tout d'abord, vous pouvez lire sur Le système IDA en détail ici: https://www.hex-rays.com/products/ida/tech/flirt/in_depth.shtml

Comme vous pouvez le voir, il ne correspond que les 32 premiers octets de fonctions. Et puis il utilise CRC16 donc il y a de bonnes chances de collision.

Le plus gros problème avec FLIRT est qu'il est assez ambigu.
Il est sujet aux fausses correspondances. Et, ou, si les 32 premiers octets d'une fonction correspondante n'ont pas changé mais que le reste a, il correspondra toujours. C'est souvent une bonne chose, mais le comportement est imprévisible. De plus, le système au sein de l'IDA n'a rien de plus qu'une interface utilisateur minimale. Ce serait bien, par exemple, si l'IDA suivait et vous montrait une liste de ce qui correspondait et de ce qui ne correspond pas si vous le vouliez.

Maintenant, ce n'est pas terrible; C'est mieux que rien et c'est assez utile dans l'ensemble, mais à cause de ces problèmes, vous voudrez probablement créer le vôtre.

J'ai créé mon propre système de signature qui parcourt chaque fonction de la cible de signature source et copie tous les octets non relatifs (c'est-à-dire qu'il ignore les octets de décalage des instructions JMP, MOV, CALL, etc.) et fait un hachage 64 bits de l'ensemble.Je sauvegarde uniquement les fonctions nommées par l'utilisateur unique et ignore les petites point de coupure du nombre d'octets). Il ne sert à rien de sauvegarder des signatures redondantes.

De cette façon, je sais que plus tard, si j'ai une correspondance, elle est plus que probablement une bonne et unique correspondance. Elle est beaucoup plus précise et a peu de chances de correspondances fausses et redondantes. en ce sens, c'est à peu près aussi rapide sinon plus rapide que le propre système sig de l'IDA. Cela me permet également d'ajouter des listes d'interface utilisateur de matchs, de non-matchs, de statistiques, etc., ce que je veux.

Excellent! Est-ce que c'est publié? J'utilise plusieurs de vos plugins, mais je ne crois pas m'en souvenir.
Chris Eagle
2014-01-31 15:54:41 UTC
view on stackexchange narkive permalink

Vous pourrez peut-être utiliser des instantanés pour que cela se produise à partir d'un plugin. Je ne pense pas que les fonctions d'instantané de la base de données soient exposées dans IDC ou IDAPython.

L'algorithme général sur une base de données fraîchement ouverte serait quelque chose du genre

  libs_before = iterate sur toutes les fonctions pour déterminer le nombre initial de fonctions de la bibliothèquesnapshot_t ss; :: qstrncpy (ss.filename, "tempsnap", 9); qstring errmsg; take_database_snapshot (&ss, &errmsg); // utilise l'itérateur de répertoire de plate-forme sur IDA sigs_files directory pour i int signum = plan_to_apply_idasgn (i); tandis que (i--) {apply_idasgn (1); // peut avoir besoin de jouer avec ce} libs_after = itérer sur toutes les fonctions pour déterminer le nombre de fonctions de la bibliothèque après l'application de sigs msg ("% d signatures correspondant à% s \ n", libs_after - libs_before, i); restore_database_snapshot (&ss), mycb, NULL);  

où un mycb minimal est:

  void idaapi mycb (const char * errmsg, void * ud) {} ​​ 

il y a évidemment du code à remplir, mais l'idée d'obtenir un décompte initial des fonctions de la bibliothèque dans le binaire et de prendre un instantané. Ensuite, parcourez les noms de tous les fichiers sig et appliquez chacun à son tour. Suite à l'application de chaque fichier de signature, générez un nouveau décompte des fonctions de bibliothèque dans la base de données. La différence entre le nouveau nombre et le nombre d'origine est le nombre de correspondances de signature. Enfin, restaurez le snapshot que vous avez pris pour annuler les modifications apportées lors de l'application des sigs.

Vous pouvez compter les fonctions de la bibliothèque en itérant sur toutes les fonctions (voir get_next_func ) et pour chaque retourné func_t * f , cochez (f->flags & FUNC_LIB)! = 0 .

J'espère que cela vous met sur la bonne voie

user3161161
2014-01-30 02:43:30 UTC
view on stackexchange narkive permalink

Il existe un plugin appelé BinDiff

Si vous avez renommé Sub_Routines dans un IDA DB, vous pouvez exécuter BinDiff entre votre base de données actuelle et une nouvelle DB qui n'a pas t été encore refactorisé. Le seul inconvénient est que cela prend un peu de temps pour les binaires de plus de 30 Mo.

http://i.imgur.com/dTPEyHq.png

BinDiff est un moteur différent général. Il ne fait rien de semblable à ce que je décris ci-dessus. Vous devez toujours effectuer des différences et appliquer des signatures manuellement sur eac / pair of db, ce que je veux éviter.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...