2016-05-04 9 views
1

Ich war bei ZeuS Malware suchen, und ich habe in diesem Stück source code kommen:Was ist der Grund, benutzerdefinierte GetModuleHandle-Funktion zu schreiben?

HMODULE _getKernel32Handle(void) 
{ 
#if defined _WIN64 
    return NULL; //FIXME 
#else 
    __asm 
    { 
    cld     //clear the direction flag for the loop 

    mov edx, fs:[0x30]  //get a pointer to the PEB 
    mov edx, [edx + 0x0C] //get PEB-> Ldr 
    mov edx, [edx + 0x14] //get the first module from the InMemoryOrder module list 

    next_mod: 
    mov esi, [edx + 0x28] //get pointer to modules name (unicode string) 
    mov ecx, 24   //the length we want to check 
    xor edi, edi   //clear edi which will store the hash of the module name 

    loop_modname: 
    xor eax, eax   //clear eax 
    lodsb     //read in the next byte of the name 
    cmp al, 'a'   //some versions of Windows use lower case module names 
    jl not_lowercase 
    sub al, 0x20   //if so normalise to uppercase 

    not_lowercase: 
    ror edi, 13   //rotate right our hash value 
    add edi, eax   //add the next byte of the name to the hash 
    loop loop_modname  //loop until we have read enough 

    cmp edi, 0x6A4ABC5B //compare the hash with that of KERNEL32.DLL 
    mov eax, [edx + 0x10] //get this modules base address 
    mov edx, [edx]   //get the next module 
    jne next_mod   //if it doesn't match, process the next module 
    }; 
#endif 
} 

Logik ist folgende:

  1. lesen fs Segmentregister (32-Bit-Windows speichert es TEB)
  2. Erhalten Zeiger auf PEB
  3. Zeiger auf PEB_LDR_DATA (mit Informationen über geladene Module des Prozesses Get)
  4. Iterate durch die InMemoryOrder Liste
  5. Modulnamen mit "kernel32.dll" Vergleich mit benutzerdefinierten Homebrew Hash-Funktion

Warum die Verwendung von GetModuleHandle geeigneten es nicht war?

+3

Oft wird Malware in einen Prozess in einer Weise injiziert, die es schwierig macht, mit externen Funktionen von Windows DLLs zu verknüpfen. Code wie dieser kann geschrieben werden, um die Verbindung zu externen Funktionen zu vermeiden. –

+0

@DavidHeffernan auf der anderen Seite, die sich auf solch umständlichen Code verlassen, kann die Malware wegen des Absturzes eines wichtigen Prozesses erkennen. Seine "Hashing" -Funktion ist nicht so gut, und wenn der Prozess viele (kleine) Bibliotheken geladen hat, besteht ein hohes Kollisionsrisiko. – assp1r1n3

+0

Wie auch immer, die Frage ist wahrscheinlich auf der Grundlage von Meinungen und sollte geschlossen werden, vor allem, da Sie scheinen, um es in eine Diskussion zu verwandeln. –

Antwort

4

Das Code-Snippet versucht, das Modul-Handle (d. H. Basisadresse) von kernel32.dll zu erhalten, vermutlich weil es noch kein Handle zu diesem Modul hat. GetModuleHandle wird von kernel32.dll exportiert. Sie können eine Funktion nicht aufrufen, wenn Sie ihre Adresse nicht kennen.