Funktion verändert den ESP der aufrufenden Funktion, wie kann ich das auch machen?



  • Hallo Leute,

    ich schreib zur Zeit einen InlineHook für die Funktion send() unter Windows.
    Das ganze mach ich indem ich Code injezier und ihn mit CreateRemoteThread ausführen lasse.
    Dieser Code schreibt an den Anfang von send() einen JMP zu meiner hook funktion und speichert aber die überschriebenen Bytes sodass ich von meiner Funktion die original Send funktion aufrufen kann.

    Das klappt auch alles ganz gut ( war n ganz schönes gefiesel dadurch das man nie weiß wo der injezierte Code landen wird 😉 )

    Jedenfalls hab ich den Hook jetzt soweit fertig aber hab gestern beim Debuggen ( ICQ ist in diesem fall die Test Applikation, bei Firefox ist es aber nicht anders ) gesehen das das originale Send() den StackPointer der Aufrufenden Funktion erhöht ( den Stack also kleiner Macht ) und zwar um genau 0x10 ( 16 in dezimal = die größe der übergebenen Parameter an send(), keine Ahnung obs deswegen 0x10 ist ). Vor und Nach dem aufruf von send() hat der ESP der aufrufenden Funktion also NICHT den gleichen Wert o.O
    Die Funktion mit der ich send() ersetzen lasse, mein Hook, macht das allerdings nicht sondern stellt den ESP wieder so her wie er vor dem Aufruf meiner funktion war, was ja soweit ich weiß das normale Verhalten ist. Ich kann in meinem Hook zwar rausfinden um wie viel das originale Send() den ESP verändert hätte aber ich weiß nicht wie ich das "nachcode" ohne da mit viel Assembler reinzupfuschen.
    Ich wüsste also den Offset mit dem ich den ESP der Aufrufenden Funktion ändern müsste aber ich hab keine Ahnung wie ich das anstell ( in C wohl gemerkt, höchstens mit InlineAsm, nicht in Asm selber ).

    Wie kann ich also in meiner Funktion den ESP der aufrufenden Funktion verändern so wie send() das tut?
    Weil normalerweise wird der ja mit dem Kommando 0xC3 (= LEAVE) am ende einer funktion wieder gleich dem EBP gesetzt und somit die veränderungen am Stack rückgängig gemacht und der ursprungs ESP und EBP wieder hergestellt.

    Oder kann ich in C(++) eine Funktion definieren in der der Compiler am Ende kein LEAVE schreibt? Dann könnt ich das ganze mit ein bischen Pfusch und inlineAsm lösen 😉 Aber das wär nur ne Not Lösung...

    So ich hoffe ihr wisst auf was ich rauswill und könnt mir helfen 🙂

    mfg,
    Xalon

    P.S: ICQ weiß scheinbar das der ESP verändert wird weil es sich darauf einstellt und wenn meine Funktion das jetzt nicht tut liests vom falschen speicher ( is ja klar, der stackpointer zeigt ja 16 bytes verkehrt..)



  • send hat vermutlich als calling convention pascal. sprich:
    caller pusht auf den stack
    callee raeumt stack auf



  • Also __stdcall, wenn ich das richtig sehe.

    Vielen Dank, funktioniert wirklich 🙂 Jetzt weiß ich endlich mal was dieses __stdcall macht xD Und nach der Lektion (ewiges debuggen) werd ichs auch nie wieder vergessen 😛

    mfg,
    Xalon

    P.S: Hätt nicht gedacht das das Problem so schnell und einfach gelöst werden kann 👍



  • wenn du nochmal sowas basteln willst, wäre das hier einen blick wert: http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/
    🙂



  • Hi,

    die Seite lädt leider nicht.
    Könntest du vielleicht kurz beschreiben um was es da geht? Damit ich entscheiden kann ob es sich lohnt jetzt zu schaun warum das nicht lädt 😛

    Wär nett

    mfg,
    Xalon



  • xalon_guest schrieb:

    die Seite lädt leider nicht.
    Könntest du vielleicht kurz beschreiben um was es da geht? Damit ich entscheiden kann ob es sich lohnt jetzt zu schaun warum das nicht lädt 😛

    Laedt bei mir problemlos.

    Ist ein link zu detours - ist ne library fuer code injection.

    Innovative systems research hinges on the ability to easily instrument and extend existing operating system and application functionality. With access to appropriate source code, it is often trivial to insert new instrumentation or extensions by rebuilding the OS or application. However, in today's world systems researchers seldom have access to all relevant source code.

    Detours is a library for instrumenting arbitrary Win32 functions on x86, x64, and IA64 machines. Detours intercepts Win32 functions by re-writing the in-memory code for target functions. The Detours package also contains utilities to attach arbitrary DLLs and data segments (called payloads) to any Win32 binary.

    Detours preserves the un-instrumented target function (callable through a trampoline) as a subroutine for use by the instrumentation. Our trampoline design enables a large class of innovative extensions to existing binary software.

    We have used Detours to create an automatic distributed partitioning system, to instrument and analyze the DCOM protocol stack, and to create a thunking layer for a COM-based OS API. Detours is used widely within Microsoft and within the industry.



  • Hi,
    klingt zwar interessant aber ich schreibs doch lieber selber, vorallem da ich ez schon fertig bin 🙂
    Es ist im Endeffekt der Weg das Ziel

    mfg
    Xalon


Anmelden zum Antworten