cdecl und stdcall Aufbau, Stack schreddern (Wissensfrage)



  • Hallo Leute,

    ich habe einen komischen debugging Fehler. Ich möchte nun herauskriegen ob die Rücksprungadresse überschrieben wird.

    1. double __stdcall myFunc(double dABC) {
    2. return myFunc2(dABC);
    3. }

    An welcher Stelle liegt nun die Rücksprungadresse?
    Etwa: &dABC-1?

    Wenn es die ist, wird sie beim Debuggen im Sprung von Zeile 1 zu Zeile 2 verändert. Sie wird jedoch nicht vom Sprung von 2. nach 3. verändert. Also schreddert myFunc2 NICHT den Stack. Liege ich da richtig?

    Viele Grüße

    Mike



  • Mike Fudd schrieb:

    Etwa: &dABC-1?

    Nein. Die Adresse liegt an [ESP], bzw. nach Einrichtung des Stack-Frames an [EBP + 4].



  • Hallo King,

    vielen Dank für die Hilfe. Diesem Schaubild nach:
    http://www.a-m-i.de/tips/stack/stack.php
    lag ich auch fast richtig:-)
    Die Adresse der Rücksprungadresse ist:
    (int *)(&dDruck) - 1
    Wegen der Pointerarithmetik bin ich um 4 Bytes zu weit gegangen, da double 8 Bytes lang ist...

    Könntest Du mir noch einen Tip geben wie ich im Visual Studion auf elegante Weise die Rücksprungadresse herauskriege?
    Über das Registerfenster vom VS weiß ich das EBP auf 0012E87C zeigt. Die Rücksprungadresse läge demnach in 0012E880.
    Aber "*(0012E880)" funktioniert nicht im Debuggingfenster.
    Und EBP+4 geht ja auch nicht...

    Mike



  • Das Einfachste dürfte ein Eintrag ins Watch-Window sein. Wenn Du als Watch "@EBP+4,md" eingibst (ohne die Gänsefüsse), ist das erste DWORD die Adresse (also EBP + 4), das zweite DWORD ist der Inhalt von EBP+4 (die Rücksprungsadresse).

    Mit diesen Fragen gehörst Du aber eigentlich ins VC-Forum, mit API hat das eher weniger zu tun. IMO. 😉



  • dach ich sowieso grad am verscheiben bin... 🤡

    ➡ ➡



  • Hallo King,

    vielen Dank für den Tip:-)

    Viele Grüße

    Mike


Anmelden zum Antworten