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:
- lesen
fs
Segmentregister (32-Bit-Windows speichert es TEB) - Erhalten Zeiger auf
PEB
- Zeiger auf
PEB_LDR_DATA
(mit Informationen über geladene Module des Prozesses Get) - Iterate durch die
InMemoryOrder
Liste - Modulnamen mit
"kernel32.dll"
Vergleich mit benutzerdefinierten Homebrew Hash-Funktion
Warum die Verwendung von GetModuleHandle
geeigneten es nicht war?
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. –
@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
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. –