Zeus Technik

Hi,

Ich beschäftige mich schon seit längeren mit Hooking und habe mir gerade den Zeus Code geholt.
Da ich denke man darf den Src Code nicht posten hoffe ich mal das sich damit schon jemand anders beschäftigt hat, aufjedenfall versteh ich die Injection ansich nicht.

Verstanden habe ich schon void *newImage = Core::initNewModule

Aber der Abschnitt:
Code:
LPTHREAD_START_ROUTINE proc = (LPTHREAD_START_ROUTINE)((LPBYTE)newImage + (DWORD_PTR)((LPBYTE)Core::_injectEntryForThreadEntry - (LPBYTE)coreData.modules.current));
HANDLE thread = CWA(kernel32, CreateRemoteThread)(process, NULL, 0, proc, NULL, 0, NULL);

Ist mir ein Rätsel.

newImage ist die Adresse im Fremden Prozess + 0 - GetModuleHandleW(NULL)

Aber wieso Funktioniert das und welche Methode ruft dieser dann auf ?
Ich schätze mal ich übersehe irgendwas grundsätzliches, hoffe mir kann jemand helfen da mich die Technik dahinter doch recht intressiert :)
 
Also:
Code:
void *Core::initNewModule(HANDLE process, HANDLE processMutex, DWORD proccessFlags)
{
  void *image = PeImage::_copyModuleToProcess(process, coreData.modules.current);
  if(image == NULL)return NULL;
da muss man wohl nicht so viel dazu sagen.
"_copyModuleToProcess" alloziert Speicher und macht einige Schritte des Windows PE Loaders nach - vor allem Sections korrekt im Speicher ausrichten sowie vorhandene Relocationstabelle durchzugehen.
Sofert man sich mit dem PE Format auskennt, sollte das nachvollziehen keine großen Schwierigkeiten bereiten (sonst in PECOFF von Microsoft oder zahlreichen PE Referenzen nachschlagen ;))

D.h nach diesem Schritt:
Code:
Core::initNewModule(blub)
liegt das Modul im "fremden" Speicher vor.

Damit das Ganze auch funktioniert, müssten eigentlich auch die Imports abgearbeitet werden und die IAT entsprechend gefüllt werden :
Code:
initLoadModules
erledigt es. Im übrigen recht simpel, ohne die Exports selbst zu parsen *enttäuscht vom Zeus sei*. Andererseits - je simpler, desto zuverlässiger.
Code:
  if(!PeImage::_loadImport(coreData.modules.current, __GetProcAddress(coreData.modules.kernel32, "LoadLibraryA"), __GetProcAddress(coreData.modules.kernel32, "GetProcAddress")))return false;
InitLoadMoudles wird im core::init aufgerufen. Das wird wiederum im "injectEntryForThreadEntry" getan (der defaultModuleEntry() Aufruf).

Zu Deiner Rechnung:
Adresse im Fremden Prozess + 0 - GetModuleHandleW(NULL)
Warum 0? Die Funktion wird doch gar nicht aufgerufen ;)
Ich mag zwar grundsätzlich kein C/C++ und bin da längst nicht so fit, allerdings schaut mir das sehr nach der Ermittlung der Methodenadresse aus und nicht nach einem Aufruf ;).
Würde also Ergeben: ImageBase im Fremden Prozess + Adresse von "_injectEntryForThreadEntry" im aktuellen - ImageBase des aktuellen Prozess == Adresse von "injectEntryblub" im fremden Prozess.
D.h CreateRemoteThread ruft im Injecteten Code letzendlich "_injectEntryForThreadEntry" auf, die den Inittialisierungskram erledigen sollte.
 
Ach ich bin ein Trottel hab ganz übersehn das die Methode garnicht aufgerufen wird :)

Danke jedenfalls das du dir die Zeit genommen hast.

lg,
Michiluki
 
Zurück
Oben