OldSchoolHack

Register / Login English

Assult Cube Funktionszeiger

icon Thread: Assult Cube Funktionszeiger

Join Date: Sep 2010

Posts: 38

Da ich den einen Teil meiner Frage bereits selbst behoben habe, möchte ich aus dem Kontext der Frage ein kleines Tutorial dazu machen:
Assult Cube besitzt eine Funktion, um einen Text auf dem Bildschirm ausgeben zu lassen. Wir wollen die Funktion finden und aus einer DLL ausrufen können:
1. Assult Cube ist opensource. Die funktion heißt
CPP Code:
  1. conoutf
und wir finden sie überall im Sourcecode, z.B. hier:
CPP Code:
  1. conoutf("cannot redefine alias %s in this execution context", id->name);
Rechtsklick drauf und "Gehe zu Definition", die Funktion ist folgendermaßen definiert:
CPP Code:
  1. void conoutf(const char *s, ...)
  2. {
  3. defvformatstring(sf, s, s);
  4. clientlogf("%s", sf);
  5. con.addline(sf);
  6. delete[] conline; conline=newstring(sf);
  7. }
für uns ist eigentlich nur der Funktionskopf mit Rückgabetype und Parametern interessant.
So nun fehlt uns nur noch der Funktionszeiger.
Wir starten Assult Cube und attachen es in Olly. Wir klicken oben auf das "E" und wählen das Modul "ac_client" an.
Nun suchen wir nach einem der vilen Calls der Funktion, z.B. hier
CPP Code:
  1. conoutf("cannot redefine alias %s in this execution context", id->name);
einfach nach dem übergebenen String.
Also Rechtsklick->Search for->All referendet Textstrings und suchen nach
Quote
cannot redefine alias %s in this execution context
.
Wir finden etwas und klicken drauf und landen hier:
CPP Code:
  1. 0045C91F . 895424 08 MOV DWORD PTR SS:[ESP+8],EDX
  2. 0045C923 . C74424 04 8024>MOV DWORD PTR SS:[ESP+4],ac_clien.004C24>; ASCII "cannot redefine alias %s in this execution context"
  3. 0045C92B . E9 F0420000 JMP ac_clien.00460C20
Doof, ist ja garkein call... egal wir folgen dem Jump einfach mal und landen hier:
CPP Code:
  1. 00460C20 /$ 81EC 08010000 SUB ESP,108
Olly zeigt uns, dass es vierle Calls und Jumps zu dieser Adresse gibt:
Quote
Local calls/jumps from 00403B46, 00403B54, 00403B87, 004083D1, 00408F2B, 00408F48, 00408F6E, 00408F82, 00408F9E, 00408FBA, 0040BC18, 0040BC3B, 0040BC91, 0040BCB0, 0040BD8E, 0040C645, 0040D65F, 0040F2D0, 004111CB, 00411318, 0041136A, 004114A3, ...
Wir schauen uns einfach mal einen von denen an:
CPP Code:
  1. 00403B4E |. 56 PUSH ESI
  2. 00403B4F |. 68 8C984B00 PUSH ac_clien.004B988C ; ASCII "Driver: %s"
  3. 00403B54 |. E8 C7D00500 CALL ac_clien.00460C20
Aha, hier wird die funktion wirklich gecallt.
Gut, wir wissen jetzt also, dass unsere Funktion hier liegt
CPP Code:
  1. 00460C20
Also aufs gehts, wir erstellen in Vc++ ein neues Dll Projekt.
Als erstes erstellen wir einen Funktionsprototypen der Funktion, die wir aus der Dll aufrufen möchten:
CPP Code:
  1. typedef void conoutf(const char *s, ...);
So war sie auch im Sourcecode von Assult Cube definiert.
Nun erstellen wir uns einen Zeiger der Funktion:
CPP Code:
  1. conoutf *DisplayMessage;
Jetzt weisen wir dem Zeiger die Adresse der Funktion zu:
CPP Code:
  1. DisplayMessage = (conoutf*)(0x00460C20);
Dabei müssen wir auf conoutf* casten (schreibt man das so ? ^^).
Jetzt klatschen wir noch die DLLMain rein:
CPP Code:
  1. BOOL WINAPI DllMain(HANDLE hinstDLL,DWORD dwReason,LPVOID lpvReserved){
  2. if (dwReason == DLL_PROCESS_ATTACH){
  3.  
  4. DisplayMessage("Ich bin Cool");
  5. }
  6. }
  7.  
Injecten das in Assult Cube, sollte so funktionieren.

So zu meinem Problem:
CPP Code:
  1. CreateThread(0, 0, (LPTHREAD_START_ROUTINE) HackMainThread, 0, 0, 0);
Hier schmiert mit der Prozess ab:
void HackMainThread();
ist die Funktion. Sobald ich den Thread starte schmiert der Prozess ab, der Code davor wird noch ausgefürt.