dimanche 2 avril 2017

Antivrus - Analyse Statique par signature


Les types d'analyse qu'effectue un Antivirus


on peut définit 3 types d'analyse effectué par les antivirus qui sont les suivant:

- l'analyse statique par signature
- l'analyse statique heuristiques
- l'analyse dynamique

L'analyse statique par signature

Cette analyse est basée sur une liste de séquence de byte ou l'on considérer qu'elle représente un marqueur du malware.

Quand un nouveau malware est détecté une analyse est effectué par des analystes de société d'antivirus. De là ils définissent une signature du malware qui va être rajouter à la liste. Lors de l'upgrade de la base donnée des signatures chaque antivirus va à ce moment là disposer de cette mise à jour. Cette signature peut être basée sur un code particulier ou d'autre critère comme hash du binaire lui-même.

Un malware possède des éléments de code fixe qui ne mutent pas, un peu comme les cellules souches d’une maladie. les analystes utilisent ces éléments fixes pour créer une signature qu’on peut ensuite identifier, de la même manière que l’on détermine un virus en fonction de son ARN/ADN.
Souvent la signature sur une suite d'octets d'un malware. Les antivirus ont une base de données contenant des millions de signatures et comparent le code du binaire scanné avec la base de données des signature.

Le gros problème de cette méthode d’analyse basée sur les signatures, c’est qu’elle ne peut pas être utilisée pour détecter un nouveau logiciel Malware sauf si celui-ci utilise une souche d'un code déjà référencé. Donc pour contourner cette analyse, il suffit à développeur de malware de faire une modification mineure du code pour fausser la signature de l'antivirus.

De plus les malwares polymorphes ont la capacité de modifier automatiquement leur code, ce qui ne permet pas de générer du hachage binaire unique identifiant celui-ci ou une signature spécifique sur une suite d'octet.

Démonstration sur l'analyse d'une signature spécifique


Nous allons prendre une signature dans notre exemple qui aujourd'hui n'est plus significative qui est connu.

Nous avons parlé dans un précédent article des deux éléments permettant de contruire un shellcode GetKernel32 et GetProcAddressByHash. Il existe d'autre technique pour obtenir l'addresse de la fonction GetProcAddress(..) via une fonction dans un shellcode.

Nous avons nommé GetAddressOfFnGetProcAddressInKernel32dll qui est présent dans plusieurs shellcode du net.

Son prototype est le suivant :


DWORD GetAddressOfFnGetProcAddressInKernel32dll( VOID )

 L'un des shellcodes de cette fonction est le suivant:
 
unsigned char szShellCode_Fn_GetAddressOfFnGetProcAddressInKernel32dllV1[] =
         "\x60\x33\xC9\x64\x8B\x41\x30\x8B\x40\x0C\x8B"
         "\x70\x14\xAD\x96\xAD\x8B\x58\x10\x8B\x53"
         "\x3C\x03\xD3\x8B\x52\x78\x03\xD3\x8B\x72"
         "\x20\x03\xF3\x33\xC9\x41\xAD\x03\xC3\x81"
         "\x38\x47\x65\x74\x50\x75\xF4\x81\x78\x04"
         "\x72\x6F\x63\x41\x75\xEB\x81\x78\x08\x64"
         "\x64\x72\x65\x75\xE2\x8B\x72\x24\x03\xF3"
         "\x66\x8B\x0C\x4E\x49\x8B\x72\x1C\x03\xF3"
         "\x8B\x14\x8E\x03\xD3\x8B\xC2\x89\x44\x24\x1C\x61\xC3";

Via un outil, nous vous montrons le résultat de l'appel de la fonction GetAddressOfFnGetProcAddressInKernel32V1

Appel de la fonction GetAddressOfFnGetProcAddressInKernel32




























Vous pouvez tester vous même via le code similaire suivant :

void DlgShellCodeFnGetAddressOfFnGetProcAddress::OnBnClickedBtGetAddrfnGetprocaddress()
{
            unsigned char szShellCode_Fn_GetAddressOfFnGetProcAddressInKernel32dllV1[] =
            "\x60\x33\xC9\x64\x8B\x41\x30\x8B\x40\x0C\x8B"
            "\x70\x14\xAD\x96\xAD\x8B\x58\x10\x8B\x53"
            "\x3C\x03\xD3\x8B\x52\x78\x03\xD3\x8B\x72"
            "\x20\x03\xF3\x33\xC9\x41\xAD\x03\xC3\x81"
            "\x38\x47\x65\x74\x50\x75\xF4\x81\x78\x04"
            "\x72\x6F\x63\x41\x75\xEB\x81\x78\x08\x64"
            "\x64\x72\x65\x75\xE2\x8B\x72\x24\x03\xF3"
            "\x66\x8B\x0C\x4E\x49\x8B\x72\x1C\x03\xF3"
            "\x8B\x14\x8E\x03\xD3\x8B\xC2\x89\x44\x24\x1C\x61\xC3";

       int (*FnShellcode)() = (int(*)())(&szShellCode_Fn_GetAddressOfFnGetProcAddressInKernel32dllV1[0]);

            DWORD dwAddressOfFnGetProcAddressInKernel32Dll= FnShellcode();

            char szAddrFnGetProcAddress[255];
            sprintf(szAddrFnGetProcAddress,"%08X",dwAddressOfFnGetProcAddressInKernel32Dll);

            SetDlgItemText(IDC_ED_GETPROCADDRESS_RESU,szAddrFnGetProcAddress);
}

Maintenant revenu à notre sujet, nous allons crée un projet nommé "sampleSignatureViral" et intégrer le shellcode de notre fonction  GetAddressOfFnGetProcAddressInKernel32V1 et cela sans même appeler


























Nous lançons la compilation sur le poste et là l'anti-virus Avast détecte notre simple programme comme dangeureux avec comme signature "Win32:ShellCode-AK[Expl]"































Il nous reste plus qu'a chercher la séquence ou la suite d'octet que l'antivirus est pour lui le déclancheur de l'alerte et de l'action de suppression du binaire.

En fait c'est assez simple, il suffit d'enlever des octets et relancer la compilation jusqu'a avoir le plus petit suite d'octet de inclus dans notre shellcode et la suppression de l'un de plus n'engendre plus l'alerte

Nous vous donnons le resultat obtenu, si on enleve encore un octet au shellcode en dessous, il y aura plus alerte





























En conclusion la signature de l'infection Win32:ShellCode-AK[Expl] correspond à la séquence ou suite d' octet suivant:

"\x33\xC9\x64\x8B\x41\x30\x8B\x40\x0C\x8B\x70\x14\xAD\x96\xAD\x8B\x58\x10\x8B\x53  
  \x3C\x03\xD3\x8B\x52" 

Nous gardons à l'exprit pour la suite que l'octet qui suit le dernier octet de la signature est  "\x78".
Nous expliquerons pourquoi nous devons pas oublier ce point. même si pour la signature cela n'a aucune importante l'octet qui suite

Si nous passons notre binaire "sampleSignatureVirtal.exe" au scanne de VirusTotal qui est un site web permettant l'analyse de fichier suspects et facilite la détection rapide des virus, vers, chevaux de Troie et toutes sortes de malwares détectés par les moteurs antivirus.l'url du site est :  https://www.virustotal.com/

Nous obtenons le même résultat pour notre binaire