dimanche 15 mars 2020

Shifu malware hash


I.    Introduction


Shifu est un cheval de Troie bancaire découvert pour la première fois en 2015. Shifu est basé sur le code source Shiz qui incorporait les techniques utilisées par Zeus. Les attaquants utilisent Shifu pour voler les informations d'identification des sites Web de banque en ligne du monde entier.

Nous allons dans cette article parlé surtout des hashs utilisés dans ce malware pour la détection s'il est entraîne d'être analysé utilisé dans l'une de ses technique d'évasion.

Il utilise une technique courante pour rapidement détecter "Sandboxie" et "Avast"

Shifu vérifie si le module snxhk.dll (Avast) ou sbiedll.dll (Sandboxie) est présent dans son propre espace de processus en appelant GetModuleHandleA(...) et exécute une boucle Sleep(...) infinie si un handle est retourné.

Il utilise également la détection par nom de processus en cours d'exécution au sein de l'hôte.

Pour cela, Il énumère les noms de processus en cours d'exécution sur l'hôte, les convertit en minuscules et calcule les hachages CRC32 de ces noms et les compare à une liste fixe qu'il embarque dans son code.

Toutes les astuces anti-analyse suivantes ne sont utilisées que si Shifu est exécuté sur une machine Windows 32 bits (pas de processus Wow64).

II.    Référence des Hashs Api


A partir d'information disparate existant sur le web, nous avons regroupé des hachs utilisés par le ransomware.

Pour la partie recherche de processus en cours d'exécution pour effectuer l'évasion
Nous avons mis en Gras, les hash que nous avons pu déterminer en plus.

Hash
Nom des processus possibles
0x99DD4432
? => recherche par croisement  => vmwareuser.exe
0x1F413C1F
vmwaretray.exe
0x6D3323D9
vmusrvc.exe
0x3BFFF885
vmsrvc.exe
0x64340DCE
? => comparaison avec les process de Emotet  => vboxservice.exe
0x63C54474
vboxtray.exe
0x2B05B17D
? => test des process du monde VDI d'évasion => xenservice.exe
0xF725433E
?
0x77AE10F7
? => recherche par croisement  => wireshark.exe
0xCE7D304E
dumpcap.exe
0xAF2015F2
ollydbg.exe
0x31FD677C
importrec.exe
0x6E9AD238
petools.exe
0xE90ACC42
idag.exe
0x4231F0AD
sysanalyzer.exe
0xD20981E0
sniff_hit.exe
0xCCEA165E
scktool.exe
0xFCA978AC
proc_analyzer.exe
0x46FA37FB
hookexplorer.exe
0xEEBF618A
multi_pot.exe
0x06AAAE60
idaq.exe
0x5BA9B1FE
procmon.exe
0x3CE2BEF3
regmon.exe
0xA945E459
procexp.exe
0x877A154B
peid.exe
0x33495995
autoruns.exe
0x68684B33
autorunsc.exe
0xB4364A7A
?
0x9305F80D
imul.exe
0xC4AAED42
emul.exe
0x14078D5B
apispy.exe
0x7E3DF4F6
?
0xD3B48D5B
hookanaapp.exe
0x332FD095
fortitracer.exe
0x2D6A6921
?
0x2AAA273B
joeboxserver.exe
0x777BE06C
joeboxcontrol.exe
0x954B35E8
?
0x870E13A2
? => Suite au brut force via le tools 
          ce hash CRC32 correspond à "tshark.exe"
0xD2EFC6C4
python.exe
  
Nous avons croisé les noms de processus avec ce du malware Emotet d'un précédent article

Nous regardons les processus qui ne sont pas référencés et listés dont "vboxservice.exe" , nous les avons passés dans notre outil de calcule de hash pour l'algorithme Hash CRC32.

Attention dans le cas de Shifu, il utilise les lowcases sensitive pour les noms de processus
























Nous trouvons donc l'un des hashs de la liste 0x6434DCE
Hash
Nom des processus possibles
0x64340DCE
? =>  Suite au croisement avec Emotet et  ses noms des processus  
          ce hash CRC32 correspond à "vboxservice.exe"

Nous avons donc mis à jour l'un de nos calculateurs de hash pour shifu et intégré la partie recherche de hash par force brut sur le nom de programme utilisé pour définir l'évasion lorsque l'un de ses process tourne sur le poste. comme cela fait pour trouvé les hashs du malware Emotet.

Dont voici la capture écran de l'outil de l'époque mise à jour.

























Cela pour essayer de trouver les différents autres hashs , mais la méthode est consommatrice de temps. Nous avons laissé tourné quelque heures. Mais n'a pas donnée de bon résultat
 
Hash
Nom des processus possibles
0x2B05B17D
gfftjbl.exe
0xF725433E
?
0x77AE10F7
?
0xB4364A7A
ocxqsxb.exe
slkttbt.exe
0x7E3DF4F6
pjzbhz.exe
ecmmtgu.exe
upxdrse.exe
0x2D6A6921
gvhqjub.exe
0x954B35E8
bisfdad.exe
nuujeob.exe
rzfobut.exe
0x870E13A2
? => Suite au brut force via le tools 
          ce hash CRC32 correspond à "tshark.exe"
Nous n'avons pas poussé, plus l'investigation, il reste donc 4 hashs sans résultat.

III.    Algorithme de création des hashs


Nous mettons l'algorithme un algorithme de hash CRC32 (lowercase) en C++ en dessous:

DWORD CalcHash_CRC32_lowercase_C_V5(char *data)
{
    unsigned __int32 r = 0xFFFFFFFFUL;
    int i, b;

    i = 0;
    while(data[i] != 0)
    {
        char currentChar = data[i];
        // Partie si on souhaite convertir A..Z en a..z LowCase
        if(currentChar >= 0x41 && currentChar <=0x5A)currentChar += 0x20;

        r ^= currentChar;
    
        for (b = 0; b < 8; ++b)
        {
            if ((unsigned __int8) r & 1)
                r = (r >> 1) ^ 0xEDB88320UL;
            else
                r >>= 1;
        }
        i++;
    }

    return r ^ 0xFFFFFFFFUL;
}

 

IV.    Aller plus loin dans ses hashs CRC32


Nous mettons quelque autre hash référence de base pour pouvoir rapidement arrivé sur des articles. Les deux derniers son bien des hashs CRC32, mais sont sur un calcule de hash avec "DWORD CalcHash_CRC32_ sensitivecase _C_V6(char *data)". Nous les avons mis sur un fond gris.
Hash
Description
0x6AE69F02
kernel32.dll
0x02489AAB
user32.dll
0xF734E815
ws2_32.dll
0xC82D5F77
getsockname
0x4AED5DAF
messageboxa
0x1C9E46BD
loadLibrarya
0x572D5D8E
MessageBoxA
0x3FC1BD8D
LoadLibraryA

Nous avons cherché quelques sites parlant ou en référant le hash 0xC82D5F77 au travers d'internet.

Nous arrivons sur "Ngioweb proxy Malware" qui utilise des hashs sur ce même algorithme CRC32

Il résout l'adresse des Api par leurs hachages évitant qu'elle soit visibible

ce malware Ngioweb utilise plusieurs méthodes d'obfuscation, dont l'appelle d'API par obfuscation. Chaque fois que le malware doit appeler une fonction API, il résout d'abord l'adresse de l'Api cible à l'aide de deux paire de hachages. L'une pour la librairie et l'autre pour l'Api ciblè , puis appelle la fonction de résolution pour enfin effectuer l'appel API elle-même en utilisant l'adresse résolue obtenu.

Nous mettons un exemple extrait d'un article sur "Ngioweb"










Appel de la fonction de résolution d'adresse d'une API ,"getsockname" dans le malware Ngioweb

Nous avons la fonction de "resolve" dans l'article. Mais il assez simple dans reconstruire une  zéro.

DWORD GetProcAddressByHashCRC32LowerCase(DWORD dwModuleHashCrc32, DWORD dwProcNameHashCrc32)

Voici la fonction reconstruite 

DWORD GetProcAddressByHashCRC32LowerCase(DWORD dwModuleHashCrc32, DWORD dwProcNameHashCrc32)
{
    PPEB_LDR_DATA pebLdrData;
 
    __asm
  {
        mov eax, fs:[0x30]       // Get PEB ADDR en X32 à partir TEB offset champs structure 0x30 
        add eax, 0x0C              // Get PEB_LDR_DATA  en X32 à partir du PEB offset champs structure 0x0C
        mov eax, [eax]             // Get LoaderData ADDR
        mov pebLdrData, eax
    }

                LDR_DATA_TABLE_ENTRY LoaderTable;
    PLIST_ENTRY pCurrentList = 0, pStart = 0,ptr=0;
               
    pStart = pebLdrData->InLoadOrderModuleList.Blink;
                ptr = pebLdrData->InLoadOrderModuleList.Flink;

    do {                            // for each module
        PLDR_DATA_TABLE_ENTRY dte = (PLDR_DATA_TABLE_ENTRY)ptr;
                              
        ptr = ptr->Flink;

        BYTE *baseAddress = (BYTE *)dte->ModuleBase;
        if (!baseAddress)continue;           // invalid module(???)
           
        IMAGE_DOS_HEADER *dosHeader = (IMAGE_DOS_HEADER *)baseAddress;
        IMAGE_NT_HEADERS *ntHeaders = (IMAGE_NT_HEADERS *)(baseAddress + dosHeader->e_lfanew);
        DWORD iedRVA = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
        if (!iedRVA)continue;                // Export Directory not present
           
        IMAGE_EXPORT_DIRECTORY *ied = (IMAGE_EXPORT_DIRECTORY *)(baseAddress + iedRVA);
        char *moduleName = (char *)(baseAddress + ied->Name);
 
                               // Calculate Hash CRC32 LowerCase du module
                                       unsigned __int32 r = 0xFFFFFFFFUL;
                                                               int i=0, b;
                                                              
                                                               while(moduleName[i] != 0)
                                                               {
                                                                              char currentChar = moduleName[i];
                                                                              if(currentChar >= 0x41 && currentChar <=0x5A)currentChar += 0x20;

                                                                              r ^= currentChar;
                                                                              for (b = 0; b < 8; ++b)
                                                                              {
                                                                                              if ((unsigned __int8) r & 1)
                                                                                                              r = (r >> 1) ^ 0xEDB88320UL;
                                                                                              else
                                                                                                              r >>= 1;
                                                                              }
                                                                              i++;
                                                               }
                                                
                               DWORD moduleHash = (r ^ 0xFFFFFFFFUL);

                               if(dwModuleHashCrc32 == moduleHash)
                               {
                                  // The arrays pointed to by AddressOfNames and AddressOfNameOrdinals run in parallel, i.e. the i-th
                                  // element of both arrays refer to the same function. The first array specifies the name whereas
                                  // the second the ordinal. This ordinal can then be used as an index in the array pointed to by
                                  // AddressOfFunctions to find the entry point of the function.

                                               DWORD *nameRVAs = (DWORD *)(baseAddress + ied->AddressOfNames);
                                               for (DWORD i = 0; i < ied->NumberOfNames; ++i)
                                               {
                                                               char *functionName = (char *)(baseAddress + nameRVAs[i]);
                                                              
                                                               // Calculate Hash CRC32 LowerCase
                                                               unsigned __int32 r = 0xFFFFFFFFUL;
                                                               int e=0, b;
                                                
                                                               while(functionName[e] != 0)
                                                               {
                                                                              char currentChar = functionName[e];
                                                                              if(currentChar >= 0x41 && currentChar <=0x5A)currentChar += 0x20;

                                                                              r ^= currentChar;
                                                                              for (b = 0; b < 8; ++b)
                                                                              {
                                                                                              if ((unsigned __int8) r & 1)
                                                                                                              r = (r >> 1) ^ 0xEDB88320UL;
                                                                                              else
                                                                                                              r >>= 1;
                                                                              }
                                                                              e++;
                                                               }
                                                
                                                  DWORD dwHashApi = (r ^ 0xFFFFFFFFUL);
                                                                                             
                                               if (dwProcNameHashCrc32 == dwHashApi)
                                                  {
                                                               WORD ordinal = ((WORD *)(baseAddress + ied->AddressOfNameOrdinals))[i];
                                               DWORD functionRVA = ((DWORD *)(baseAddress + ied->AddressOfFunctions))[ordinal];
                                                     return (DWORD)(baseAddress + functionRVA);
                                                  }
                                               }

                              
                               }
                              
    } while (ptr != pStart);

    return 0x0;            // address not found
}

Nous avons intégré cela dans un testeurs existant de formation sur le hash CRC32 




























Nous disposons également de l'extraction en Shellcode de la fonction décrite au dessus

Nous le remettons en dessous le listing :

\x83\xEC\x14\x64\xA1\x30\x00\x00\x00\x83\xC0\x0C\x8B\x00\x89\x44
\x24\x04\x8B\x44\x24\x04\x8B\x48\x10\x8B\x40\x0C\x53\x55\x56\x89
\x4C\x24\x1C\x57\x8B\x58\x18\x85\xDB\x8B\x10\x89\x54\x24\x18\x0F
\x84\xBA\x01\x00\x00\x8B\x43\x3C\x8B\x74\x18\x78\x85\xF6\x89\x74
\x24\x10\x0F\x84\xA7\x01\x00\x00\x8B\x4C\x1E\x0C\x8A\x14\x19\x03
\xCB\x83\xC8\xFF\x84\xD2\x0F\x84\xA0\x00\x00\x00\x8B\xF1\x8B\xFF
\x8A\xCA\x80\xE9\x41\x80\xF9\x19\x77\x03\x80\xC2\x20\x0F\xBE\xD2
\x33\xC2\xA8\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1
\xE8\xA8\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8
\xA8\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8
\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01
\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01\x74
\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01\x74\x09
\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01\x74\x09\xD1
\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\x8A\x56\x01\x83\xC6\x01
\x84\xD2\x0F\x85\x68\xFF\xFF\xFF\x8B\x74\x24\x10\xF7\xD0\x39\x44
\x24\x28\x0F\x85\xE7\x00\x00\x00\x8B\x6C\x1E\x20\x8B\x44\x24\x10
\x8B\x74\x18\x18\x03\xEB\x33\xFF\x85\xF6\x89\x74\x24\x1C\x0F\x86
\xCB\x00\x00\x00\x8B\x4C\xBD\x00\x8A\x14\x19\x03\xCB\x83\xC8\xFF
\x84\xD2\x0F\x84\xA4\x00\x00\x00\x8B\xF1\x8D\x9B\x00\x00\x00\x00
\x8A\xCA\x80\xE9\x41\x80\xF9\x19\x77\x03\x80\xC2\x20\x0F\xBE\xD2
\x33\xC2\xA8\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1
\xE8\xA8\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8
\xA8\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8
\x01\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01
\x74\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01\x74
\x09\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01\x74\x09
\xD1\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\xA8\x01\x74\x09\xD1
\xE8\x35\x20\x83\xB8\xED\xEB\x02\xD1\xE8\x8A\x56\x01\x83\xC6\x01
\x84\xD2\x0F\x85\x68\xFF\xFF\xFF\x8B\x74\x24\x1C\xF7\xD0\x39\x44
\x24\x2C\x74\x1E\x83\xC7\x01\x3B\xFE\x0F\x82\x35\xFF\xFF\xFF\x8B
\x44\x24\x20\x39\x44\x24\x18\x74\x2C\x8B\x44\x24\x18\xE9\x22\xFE
\xFF\xFF\x8B\x44\x24\x10\x8B\x4C\x18\x24\x8D\x14\x79\x0F\xB7\x0C
\x1A\x8B\x54\x18\x1C\x5F\x8D\x04\x8A\x8B\x04\x18\x5E\x5D\x03\xC3
\x5B\x83\xC4\x14\xC3\x5F\x5E\x5D\x33\xC0\x5B\x83\xC4\x14\xC3

Nous avons passer le ce shellcode dans notre outil pour permettre de voir la traduction en assembleur de la fonction crée


  Voila le listing obtenu

00000000:   83 EC 14                                           SUB ESP,14h (On alloue l'espace de 20 octets sur la stack)
00000003:   64 A1 30 00 00 00                            MOV EAX,DWORD PTR FS:[00000030]
00000009:   83 C0 0C                                           ADD EAX,0Ch
0000000C:   8B 00                                                MOV EAX,DWORD PTR [EAX]
0000000E:   89 44 24 04                                       MOV DWORD PTR[ESP+04h],EAX
00000012:   8B 44 24 04                                       MOV EAX,DWORD PTR[ESP+0x04]
00000016:   8B 48 10                                            MOV ECX,DWORD PTR[EAX+10h]
00000019:   8B 40 0C                                           MOV EAX,DWORD PTR[EAX+0x0C]
0000001C:   53                                                      PUSH EBX
0000001D:   55                                                     PUSH EBP
0000001E:   56                                                      PUSH ESI
0000001F:   89 4C 24 1C                                      MOV DWORD PTR[ESP+0x1C],ECX
00000023:   57                                                      PUSH EDI
00000024:   8B 58 18                                            MOV EBX,DWORD PTR [EAX+18h]
00000027:   85 DB                                                TEST EBX,EBX (check if dest address is 16 byte aligned)
00000029:   8B 10                                                 MOV EDX,DWORD PTR [EAX]
0000002B:   89 54 24 18                                       MOV DWORD PTR[EBX+0x18],EDX
0000002F:   0F 84 BA 01 00 00                           JE 000001BAh (+1BAh ->:000001EF)
00000035:   8B 43 3C                                           MOV EAX,DWORD PTR[EBX+0x3C]
00000038:   8B 74 18 78                                       MOV ESI,DWORD PTR [EAX+EBX*1+0x78]
0000003C:   85 F6                                                TEST ESI,ESI (check if zero)
0000003E:   89 74 24 10                                       MOV DWORD PTR[ESP+0x10],ESI
00000042:   0F 84 A7 01 00 00                            JE 000001A7h (+1A7h ->:000001EF)
00000048:   8B 4C 1E 0C                                     MOV ECX,DWORD PTR[ESI+EBX*1+0x0C]
0000004C:   8A 14 19                                           MOV DL,BYTE PTR[ECX+EBX*1]
0000004F:   03 CB                                                ADD ECX,EBX
00000051:   83 C8 FF                                           OR EAX,FFFFFFFFh
00000054:   84 D2                                                TEST DL,DL
00000056:   0F 84 A0 00 00 00                            JE 000000A0h (+A0h ->:000000FC)
0000005C:   8B F1                                                MOV ESI,ECX
0000005E:   8B FF                                                MOV EDI,EDI
00000060:   8A CA                                               MOV CL,DL
00000062:   80 E9 41                                            SUB CL,0x41
00000065:   80 F9 19                                            CMP CL,0x19
00000068:   77 03                                                 JA 03h (Jump if Above)(+03h ->:0000006D)
0000006A:   80 C2 20                                           ADD DL,0x20
0000006D:   0F BE D2                                         MOVSX EDX,DL
00000070:   33 C2                                                 XOR EAX,EDX
00000072:   A8 01                                                TEST AL,0x01
00000074:   74 09                                                 JZ 0x09 (+09h ->:0000007F)
00000076:   D1 E8                                                SHR EAX,1
00000078:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000007D:   EB 02                                               JMP 02h +02h ->:00000081)
0000007F:   D1 E8                                                SHR EAX,1
00000081:   A8 01                                                TEST AL,0x01
00000083:   74 09                                                 JZ 0x09 (+09h ->:0000008E)
00000085:   D1 E8                                                SHR EAX,1
00000087:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000008C:   EB 02                                                JMP 02h +02h ->:00000090)
0000008E:   D1 E8                                                SHR EAX,1
00000090:   A8 01                                                TEST AL,0x01
00000092:   74 09                                                 JZ 0x09 (+09h ->:0000009D)
00000094:   D1 E8                                                SHR EAX,1
00000096:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000009B:   EB 02                                                JMP 02h +02h ->:0000009F)
0000009D:   D1 E8                                               SHR EAX,1
0000009F:   A8 01                                                TEST AL,0x01
000000A1:   74 09                                                JZ 0x09 (+09h ->:000000AC)
000000A3:   D1 E8                                                SHR EAX,1
000000A5:   35 20 83 B8 ED                               XOR EAX,EDB88320h
000000AA:   EB 02                                              JMP 02h +02h ->:000000AE)
000000AC:   D1 E8                                              SHR EAX,1
000000AE:   A8 01                                               TEST AL,0x01
000000B0:   74 09                                                 JZ 0x09 (+09h ->:000000BB)
000000B2:   D1 E8                                               SHR EAX,1
000000B4:   35 20 83 B8 ED                                XOR EAX,EDB88320h
000000B9:   EB 02                                                JMP 02h +02h ->:000000BD)
000000BB:   D1 E8                                               SHR EAX,1
000000BD:   A8 01                                               TEST AL,0x01
000000BF:   74 09                                                JZ 0x09 (+09h ->:000000CA)
000000C1:   D1 E8                                                SHR EAX,1
000000C3:   35 20 83 B8 ED                                XOR EAX,EDB88320h
000000C8:   EB 02                                                JMP 02h +02h ->:000000CC)
000000CA:   D1 E8                                              SHR EAX,1
000000CC:   A8 01                                               TEST AL,0x01
000000CE:   74 09                                                JZ 0x09 (+09h ->:000000D9)
000000D0:   D1 E8                                               SHR EAX,1
000000D2:   35 20 83 B8 ED                               XOR EAX,EDB88320h
000000D7:   EB 02                                                JMP 02h +02h ->:000000DB)
000000D9:   D1 E8                                                SHR EAX,1
000000DB:   A8 01                                               TEST AL,0x01
000000DD:   74 09                                               JZ 0x09 (+09h ->:000000E8)
000000DF:   D1 E8                                               SHR EAX,1
000000E1:   35 20 83 B8 ED                                XOR EAX,EDB88320h
000000E6:   EB 02                                                JMP 02h +02h ->:000000EA)
000000E8:   D1 E8                                                SHR EAX,1
000000EA:   8A 56 01                                          MOB DL,BYTE PTR[ESI+0x01]
000000ED:   83 C6 01                                          ADD ESI,01h
000000F0:   84 D2                                                TEST DL,DL
000000F2:   0F 85 68 FF FF FF                           JNE FFFFFF68h (-98h ->:00000060)
000000F8:   8B 74 24 10                                      MOV ESI,DWORD PTR[ESP+0x10]
000000FC:   F7 D0                                               NOT EAX
000000FE:   39 44 24 28                                       CMP DWORD PTR[ESP+0x28],EAX
00000102:   0F 85 E7 00 00 00                             JNE 000000E7h (+E7h ->:000001EF)
00000108:   8B 6C 1E 20                                      MOV EBP,DWORD PTR[ESI+EBX*1+0x20]
0000010C:   8B 44 24 10                                      MOV EAX,DWORD PTR[ESP+0x10]
00000110:   8B 74 18 18                                       MOV ESI,DWORD PTR [EAX+EBX*1+0x18]
00000114:   03 EB                                                ADD EBP,EBX
00000116:   33 FF                                                 XOR EDI,EDI
00000118:   85 F6                                                 TEST ESI,ESI (check if zero)
0000011A:   89 74 24 1C                                      MOV DWORD PTR[ESP+0x1C],ESI
0000011E:   0F 86 CB 00 00 00                           JBE Loc_000001EF
00000124:   8B 4C BD 00                                    MOV ECX,DWORD PTR[EBP+EDI*4]
00000128:   8A 14 19                                           MOV DL,BYTE PTR[ECX+EBX*1]
0000012B:   03 CB                                               ADD ECX,EBX
0000012D:   83 C8 FF                                          OR EAX,FFFFFFFFh
00000130:   84 D2                                                TEST DL,DL
00000132:   0F 84 A4 00 00 00                            JE 000000A4h (+A4h ->:000001DC)
00000138:   8B F1                                                MOV ESI,ECX
0000013A:   8D 9B 00 00 00 00                           LEA EBX,[EBX+0x00000000]
00000140:   8A CA                                               MOV CL,DL
00000142:   80 E9 41                                            SUB CL,0x41
00000145:   80 F9 19                                            CMP CL,0x19
00000148:   77 03                                                 JA 03h (Jump if Above)(+03h ->:0000014D)
0000014A:   80 C2 20                                           ADD DL,0x20
0000014D:   0F BE D2                                         MOVSX EDX,DL
00000150:   33 C2                                                 XOR EAX,EDX
00000152:   A8 01                                                TEST AL,0x01
00000154:   74 09                                                 JZ 0x09 (+09h ->:0000015F)
00000156:   D1 E8                                                SHR EAX,1
00000158:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000015D:   EB 02                                               JMP 02h +02h ->:00000161)
0000015F:   D1 E8                                                SHR EAX,1
00000161:   A8 01                                                TEST AL,0x01
00000163:   74 09                                                 JZ 0x09 (+09h ->:0000016E)
00000165:   D1 E8                                                SHR EAX,1
00000167:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000016C:   EB 02                                                JMP 02h +02h ->:00000170)
0000016E:   D1 E8                                                SHR EAX,1
00000170:   A8 01                                                TEST AL,0x01
00000172:   74 09                                                 JZ 0x09 (+09h ->:0000017D)
00000174:   D1 E8                                                SHR EAX,1
00000176:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000017B:   EB 02                                                JMP 02h +02h ->:0000017F)
0000017D:   D1 E8                                               SHR EAX,1
0000017F:   A8 01                                                TEST AL,0x01
00000181:   74 09                                                 JZ 0x09 (+09h ->:0000018C)
00000183:   D1 E8                                                SHR EAX,1
00000185:   35 20 83 B8 ED                                XOR EAX,EDB88320h
0000018A:   EB 02                                               JMP 02h +02h ->:0000018E)
0000018C:   D1 E8                                               SHR EAX,1
0000018E:   A8 01                                                TEST AL,0x01
00000190:   74 09                                                 JZ 0x09 (+09h ->:0000019B)
00000192:   D1 E8                                                SHR EAX,1
00000194:   35 20 83 B8 ED                                XOR EAX,EDB88320h
00000199:   EB 02                                                JMP 02h +02h ->:0000019D)
0000019B:   D1 E8                                               SHR EAX,1
0000019D:   A8 01                                               TEST AL,0x01
0000019F:   74 09                                                 JZ 0x09 (+09h ->:000001AA)
000001A1:   D1 E8                                               SHR EAX,1
000001A3:   35 20 83 B8 ED                               XOR EAX,EDB88320h
000001A8:   EB 02                                               JMP 02h +02h ->:000001AC)
000001AA:   D1 E8                                              SHR EAX,1
000001AC:   A8 01                                               TEST AL,0x01
000001AE:   74 09                                                JZ 0x09 (+09h ->:000001B9)
000001B0:   D1 E8                                                SHR EAX,1
000001B2:   35 20 83 B8 ED                                XOR EAX,EDB88320h
000001B7:   EB 02                                                JMP 02h +02h ->:000001BB)
000001B9:   D1 E8                                                SHR EAX,1
000001BB:   A8 01                                                TEST AL,0x01
000001BD:   74 09                                                JZ 0x09 (+09h ->:000001C8)
000001BF:   D1 E8                                                SHR EAX,1
000001C1:   35 20 83 B8 ED                                XOR EAX,EDB88320h
000001C6:   EB 02                                                JMP 02h +02h ->:000001CA)
000001C8:   D1 E8                                               SHR EAX,1
000001CA:   8A 56 01                                          MOB DL,BYTE PTR[ESI+0x01]
000001CD:   83 C6 01                                          ADD ESI,01h
000001D0:   84 D2                                                TEST DL,DL
000001D2:   0F 85 68 FF FF FF                          JNE FFFFFF68h (-98h ->:00000140)
000001D8:   8B 74 24 1C                                     MOV ESI,DWORD PTR[ESP+0x1C]
000001DC:   F7 D0                                              NOT EAX
000001DE:   39 44 24 2C                                     CMP DWORD PTR[ESP+0x2C],EAX
000001E2:   74 1E                                                 JZ 0x1E (+1Eh ->:00000202)
000001E4:   83 C7 01                                           ADD EDI,01h
000001E7:   3B FE                                                CMP EDI,ESI
000001E9:   0F 82 35 FF FF FF                           JB Loc_00000124
000001EF:   8B 44 24 20                                      MOV EAX,DWORD PTR[ESP+0x20]
000001F3:   39 44 24 18                                       CMP DWORD PTR[ESP+0x18],EAX
000001F7:   74 2C                                                JZ 0x2C (+2Ch ->:00000225)
000001F9:   8B 44 24 18                                      MOV EAX,DWORD PTR[ESP+0x18]
000001FD:   E9 22 FE FF FF                               JMP FFFFFE22h (-FFFFFE22h ->:00000024)
00000202:   8B 44 24 10                                       MOV EAX,DWORD PTR[ESP+0x10]
00000206:   8B 4C 18 24                                      MOV ECX,DWORD PTR[EAX+EBX*1+0x24]
0000020A:   8D 14 79                                          LEA EDX,[ECX+EDI*2]
0000020D:   0F B7 0C 1A                                    MOVZX ECX,WORD PTR[EDX+EBX*1]
00000211:   8B 54 18 1C                                      MOV EDX,DWORD PTR [EAX+EBX*1+0x1C]
00000215:   5F                                                      POP EDI
00000216:   8D 04 8A                                          LEA EAX,[EDX+ECX*4]
00000219:   8B 04 18                                            MOV EAX,DWORD PTR[EAX+EBX*1]
0000021C:   5E                                                     POP ESI
0000021D:   5D                                                    POP EBP
0000021E:   03 C3                                                ADD EAX,EBX
00000220:   5B                                                      POP EBX
00000221:   83 C4 14                                            ADD ESP,14h
00000224:   C3                                                      RET
00000225:   5F                                                      POP EDI
00000226:   5E                                                      POP ESI
00000227:   5D                                                     POP EBP
00000228:   33 C0                                                 XOR EAX,EAX
0000022A:   5B                                                     POP EBX
0000022B:   83 C4 14                                           ADD ESP,14h
0000022E:   C3                                                     RET

Ce code peut être facilement optimiser pour remplacer la fonction de hash avec un code plus compacte.

Nous mettons 3 autres hash extrait à partir de la capture écran suivant:










  
Nous avons déterminé cela avec notre tools sur les hashs
























 
Nous avons  regardé ce qui sortait lors de recherche de hash CRC32 sur des binaires passer dans joesandbox

Voici quelques liens trouvés sur google, en relation avec les hashs au-dessus. Cela permet de trouver d'autres hash possible de l'algorithme CRC32.











Nous mettons l'url de celle qui est intéressant plus particuliérement par rapport au hash

https://www.joesandbox.com/analysis/142301/1/html

Nous avons le hash 0x2E50340B et nous avons passé dans notre outils

 























Donc la valeur 0x2E50340B est le Hash CRC32(SensitiveCase)['IsWow64Process']

V.    Conclusions


L'intérêt si on identifie la méthode de génération des hashs d'api, on peut lister les Apis utiliser par le programme malveillant et aussi faire des rapprochement entre des échantillons
différents. Les auteur de ce programme utilise des sous-routines ou bloc qui on déjà fait leurs preuve dans d'autre projet et testé . Donc si on part du fait, que ses auteurs on utilisé des codes qu'il aurait tiré de leurs expériences. Ils ont soit écrit des shellcodes ou des fichiers asm.
Et s'ils sont partie de compilateur évolué comme Visual Studio, les blocs propres ou métier ne sont probablement pas récrit totalement.

Il ne faut pas oublier que cela peut prendre du temps de crée ses blocs de code comme tous développeurs. Ils se construisent des tools kits de développement au cours du temps pour capitaliser leurs travaux.

Il ne réécrit pas tous mais assembles des blocs comme des classes métier ou dédié à des opérations précise.

Il est assez, intéressant de croisé les méthodes et les techniques cela pour cartographier
des familles.

Nous espérons que ce petit exemple sur le hash CRC32, vous a permis de comprendre le codage en assembleur et la recherche d'algorithme de hash et approfondir quelques éléments