[C++] Eigene Detours Teil2

04/18/2011 00:45 schrillismus#16
Hm, wenn ich an das laufende Programm attache, sind alle Adressen anders und ich kann die Funktion nicht finden.
04/18/2011 10:16 MrSm!th#17
Du meinst die Opferfunktion? Die Adresse sollte immer gleich sein, es sei denn, du hast einen polymorphen Virus geschrieben o.O
04/18/2011 11:03 schrillismus#18
Sehr interessant :D

Nein, so wie es aussiet war ich einfach in der ntdll :o
Aber die Adressen sind trotzdem bei jedem Progrmmstart anders.
Ich habe mit VS 2010 Debug kompiliert.
04/18/2011 22:16 MrSm!th#19
Kompilier mal als Release (auch wenn es daran nicht liegen sollte)
Du meinst also, immer wenn du das Programm in Olly startest, ist die Opferfunktion an einer anderen Adresse?
04/18/2011 23:04 schrillismus#20
Also es ist so (Jetzt mit Release): Wenn ich das Opferprogramm in Olly aufmache, Olly wieder schliesse und wieder von Vorne anfange, dann bleibt die Adresse gleich. Wenn ich dazwischen aber das Programm einfach so starte, dann ändert sich die Adresse.

Also
Olly->Olly->Olly->Gleiche Adressen
Olly->Programm normal starten->Olly->neue Adressen

Wobei die Adressänderung etwa so aussieht:
002211D9->012B11D9->001B11D9->001211D9->011911D9->013411D9->002011D9 usw.
04/19/2011 01:11 MrSm!th#21
Lol langsam klingt es echt nach nem polymorphen Virus =D

Du meinst auch sicher die Opferfunktion und nicht das Trampolin? Hmpfff, da kann ich dir auch nicht helfen, das klingt sehr seltsam o.ō
Jedenfalls wird das wohl der Grund für den Crash sein: Die Adresse ändert sich.
04/20/2011 08:31 xNopex#22
Da der Adressbereich der Funktion schon ziemlich "hoch" ist, habe ich die Vermutung, dass die Funktion in einer DLL ausgelagert ist? Evtl. kannst du mal versuchen, ob die Funktion einen konstanten "Abstand" zur Base-Adresse der DLL hat, z.b.: DLL_BASE_ADDRESS + 0x11D9.
Falls ja, dann hättest du ja eine Lösung. Du musst die Adresse dann nur dynamisch berechnen.
04/20/2011 18:45 schrillismus#23
Hab ich auch schon versucht, der Abstand zur Base verändert sich auch.
04/24/2011 14:13 mono0#24
Dumme Frage, wurde hier auch schon mal gestellt, aber ich komm nicht mehr weiter; Wie finde ich heraus, wieviele Bytes ein Funktionsaufruf belegt?

04/25/2011 19:52 schrillismus#25
In der Spalte ganz links (in Olly) stehen die Adressen der Befehle. Ich habe es so gemacht: Die Adresse nach der Funktion minus die Adresse am Anfang der Funktion.
Wenn ich die Grösse der ganzen Funktion herausfinden will, rechne ich so:
Rechner auf Hex stellen, "004114CD-00411470 = 5d" oder in dezimal 93 Bytes.

Das funktioniert auch mit einzelnen Befehlen: z.b. "push ebp" am Anfang geht von 00411470 bis 00411471. Also 1 Byte.

Bitte korrigiert mich, wenn ich flasch liege:D
06/21/2011 16:41 Dr. Coxxy#26
erstmal danke für dieses tolle tutorial!

kleiner warnhinweis:

wenn ihr im debugmodus in visual studio kompiliert ändern sich die adressen...
wenn ihr im releasemodus kompiliert, rationalisiert er die funktion raus...

sähe dann so in c++ wieder aus:

Code:
int main( int argc, char** argv )
{
    while( true )
    {
        cout << "Von EXE\n";
        Sleep( 250 );
    }

    return 0;
}
mit dem ergebnis, dass man beim suchen vom string immer in der cout methode landet, anstatt in der funktion^^
jaja, visual studio ist böööse :D

kann man allerdings ausstellen:

Projekt->Eigenschaften->Konfigurations Einstellungen(oben Release einstellen)->C/C++->Optimization->Optimization->Disabled

MfG