2017-08-02 4 views
1

Faire des exercices du livre Pratical Malware Analysis (Laboratoire 5-1)extrait de code IDA, eax déplacé dans la variable globale

La dword_1008E5C4 variable globale (2ème photo) est censé contenir la version du système d'exploitation, mais de ce que je peux voir, il devrait toujours être mis à 0 en raison de l'instruction xor eax, eaxsub_10003695

Ai-je raté quelque chose?

enter image description here enter image description here

+0

Oui, il vous manque quelque chose. EAX ne contient pas la version. Le LEA charge l'adresse de l'endroit où se trouvent ces données. Lorsque EAX est effacé, il l'efface simplement en tant que valeur de retour. –

Répondre

2

La fonction GetVersionEx a cette signature:

BOOL WINAPI GetVersionEx(
    _Inout_ LPOSVERSIONINFO lpVersionInfo 
); 

Il retourne une structure OSVERSIONINFO (ou OSVERSIONINFOEX, mais ce n'est pas pertinent ici) dans une variable locale sur la pile (ici référencé rel à EBP) quel champ dwPlatformId est vérifiée avec le

cmp [ebp+VersionInformation.dwPlatformId], 2 

instruction. Une valeur de 2 n'indique

Le système d'exploitation est Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP ou Windows 2000.

donc sur ces systèmes les CMP ensembles le drapeau ZERO? indiquant l'égalité. Parce que le drapeau ZERO? est maintenant réglée et EAX est encore zéro

setz al 

ensembles EAX à 00000001 - étant la valeur de retour du sous-programme.

+0

Oh, merci, maintenant je comprends (surtout). Forgot al fait partie de eax :) Ainsi, l'appel à GetVersionExA remplit [ebp + VersionInformation] avec la structure. Supposons que je suis un peu confus sur la façon dont la fonction callee change la valeur d'une variable locale de l'appelant – sakana

1

Oui, l'instruction setz, qui définit la valeur de al (partie de eax) sur la base du résultat de la comparaison au-dessus.