I. Introduction
Dans la
sécurité de l'information , plus particulièrement dans l'analyse des logiciels
malveillants , imphash ( "Imports Hash" ) est le
résultat d'une somme de contrôle d'un texte créé à partir des fonctions
importées (Import Address Table) d'un exécutable
windows via une partie inclus dans le PE (Portable Executable), à l'aide de l'algorithme MD5 ,
une idée venant des chercheurs de Mandiant en 2004.
Afin de
fournir un mécanisme permettant la recherche d'autres copies ou variante d'un
programme malveillants au sein d'une même famille, car les auteurs de logiciels
malveillants ne modifient pas les fonctions de la bibliothèque qu'ils utilisent
lors de la génération de nouvelle souche. c’est-à-dire lorsqu’ils compilent à
nouveau le même programme malveillant, générant ainsi de nouveau exécutable. Dans ce cas, bien que le hachage
du fichier change lié au fait qu'il est fait quelques modifications dans le
code.
A
contrario,s'il n'ont pas intégrer de nouveau appel d'Api au sein du programme, l'emphash restera le même pour
les différents variant ou version.
Et dela nous pouvons dire qu'ils sont fonctionnellement
proche et font partie de la même famille du malware.I. L'algorithme de calcul de l'Imphash
Le texte
à partir duquel la somme de contrôle MD5 est calculée est formé comme suit:
- Analyse la table d'importation (IT) ou la table des importations de fonctions exécutables PE, qui contient un enregistrement des fonctions importées par cet exécutable et ses bibliothèques respectives.
- Pour chaque fonction trouvée, il préfixe son nom avec le nom de la bibliothèque (DLL) où il se trouve sans son extension, mais en maintenant le point. Par exemple, si l'exécutable importe la fonction DeleteCriticalSection () à partir de la bibliothèque KERNEL32.DLL, cette importation réécrite serait KERNEL32.EnterCriticalSection .
- Si la fonction n'est pas importée nominativement, on essaie de la résoudre avec une base de données locale et, si cela n'est pas possible, son numéro ordinal est utilisé.
- Convertit le texte en minuscule, obtenu kernel32.entercriticalsection .
- Répétez l'intégralité de l'algorithme pour les autres fonctions importées par le binaire, en concaténant le résultat avec le précédent, séparés par des virgules.
- Enfin calcule le hash MD5 du texte final résultant.
II. Exemple conceptuel
Prenons comme exemple un
exécutable PE qui importe les fonctions suivantes, dans cet ordre:
- EnterCriticalSection (), à partir de KERNEL32.DLL
- MessageBoxA (), à partir de USER32.DLL
- CreateWindowExA (), à partir de USER32.DLL
Quiconque souhaite calculer
l'emphash de cet exécutable doit calculer le hachage MD5 de la chaîne suivante
(sans prendre en compte les caractères de nouvelle ligne):
kernel32.entercriticalsection,
user32.messageboxa, user32.createwindowexa
Le résultat de l'exemple est
2e4b75f13408b52416d9c846d1189ae6. Il est
donc possible de faire le même calcul pour différents fichiers afin de trouver
d'autres copies de la même famille. C'est
une méthode de recherche de fichiers similaires.
Nous avons implémenté, cela dans une tools avec génération
de la chaîne avant l'appel de l'algorithme MD5.
qui nous permet de teste l'exemple indiqué du dessus,
voici le résultat obtenu en dessous:
Nous fessons pareil pour un échantillon
"AntiFireWall.exe", cela nous donne son Imphash
pour ce
fichier qui est "94802f07a877e9817802657426aadd80". Voir la capture
en dessous:
Dans le cas de ce fichiers la chaîne résultante, construit
à partir de l'IAT est la suivante:
kernel32.closehandle,kernel32.createfilea,kernel32.createfilemappinga,kernel32.createprocessa,
kernel32.createremotethread,kernel32.getfilesize,kernel32.getprocaddress,kernel32.loadlibrarya,
kernel32.mapviewoffile,kernel32.unmapviewoffile,kernel32.virtualallocex,kernel32.virtualprotect,
kernel32.writeprocessmemory
|
Nous voyons que programme n'appel que des APIs de module
Kernel32.dll
Kernel32.dll
=> Apis using : 13
- CloseHandle
- CreateFileA
- CreateFileMappingA
- CreateProcessA
- CreateRemoteThread
- GetFileSize
- GetProcAddress
- LoadLibraryA
- MapViewOfFile
- UnmapViewOfFile
- VirtualAllocEx
- VirtualProtect
- WriteProcessMemory
|
Nous allons vérifier l'imphash que génére un tier au
travers du site VirusTotal
( https://www.virustotal.com/#/home/upload )
en poussant notre échantillon de test.
Si nous retrouvons notre Imphash et aussi connaitre plus
de détaille sur le binaire au niveau de sa note.
Nous avons bien le même Imphash que celui calculer par "VirusTotal". Il est intéressant de voir que l'échantillons atteint une note 33/65 , voir la capture qui suit:
Il remonte qu'il est décrit assez souvent comme un
"Trojan". Nous rentrerons dans l'analyse plus profondément sur ce
binaire dans un prochain article sur la structure PE.
Si on regarde de plus près, sachant qu'il utilise des
bases données virale et qu'il apparaît des noms identiques ou distinct entre les
anti-virus.
On peut ce dire que Ad-Aware , ALYac , BitDefender ,
Emsisoft , F-Secure , GData , eScan utilise la même source ou base de référence
étant donnée que la référence fournit est identique
"Trojan.Generic.11937180"
Cela peut peut-être intéressant de creusé cela , les relation entre les Anti-virus et leurs source est leurs référence utilisé.
I. Conclusions
L'intérêt est de pouvoir
catégorisé des exécutables en fonction du type Api importé et donc utilisé dans
le dit programme.
en ce basant sur l'IAT qui contient la liste des
bibliothèques et des fonctions Api liées dynamiquement du binaire et présent au
sein de celui-ci utiliser pendant l'exécution du processus. L'idée est donc la
suivante: si deux binaires ont le même “imphash”, il y a de fortes chances
qu'ils aient des objectifs similaires par le fait qu'il utilise le même jeu
d'Api.
Mais attention, il faut pas oublier que le malware peut
garder dynamiquement les Apis qu'il souhaites ans avoir a passer par le
mécanisme de IAT.
en passant par
GetModuleHandle(..) et GetProcAddress(..) ou pas des fonctions customs comme dans
les shellcodes