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.
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
|
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