Inwiefern beeinflusst "Debug->Attach to Process..." mein Programm?



  • Hallo,

    ich habe mal eine Frage in Zusammenhang mit einem anderen Problem, was ich hier im Forum auch schon gepostet habe. Da mich die Antwort darauf aber auch unabhängig von diesem Problem interessiert, mach ich mal diesen Thread hier auf.

    Es handelt sich zunächst bei dem Problem um das Installieren einer Message Hook in einer Fremdanwendung, beschrieben hier: http://www.c-plusplus.net/forum/320812.

    Das verlinkte Problem konnte ich leider noch nicht lösen, allerdings ist mir beim rumprobieren folgendes aufgefallen: Wenn ich das Programm ganz normal starte passiert nichts, der Hook Callback wird nie ausgelöst. Wenn ich aber vor dem Laden der Hook einen Breakpoint setze und dann mittels "Debug->Attach to Process..." meinen Debugger an das Programm anhänge, funktioniert es (zumindest bei meinem Testprogramm, dem Adobe Reader)!

    Daher meine Frage: Wieso wird durch das Anhängen des Prozesses der Ablauf meines Programms verändert? Ich dachte der "loggt" halt nur mit was dann in dem anderen Programm passiert, aber dadurch sollte es doch nicht unterschiedlich ablaufen?

    Was passiert da? Freue mich über Antworten 🙂

    Schöne Grüße,
    hs



  • "Debug->Attach to Process..." wird im Standard nicht aufgeführt. Vielleicht solltest du die Frage im passenden Forum stellen?



  • Achso, das war mir nicht klar. Was wäre denn das richtige Forum?

    Und wird der Thread jetzt von einem Administrator verschoben oder soll ich selber einen neuen aufmachen?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bei mir ändert sich da gelegentlich der Stack, also temporäre Speicheradressen 😕



  • Ok, interessant...

    Also bei mir tritt dieses Phänomen immer auf, wobei das für mich irgendwie keinen Sinn macht. Ist das ein Bug wenn sich der Stack ändert oder gewollt?



  • Änderung am Stack hab' ich noch nie beobachtet. Wäre auch total plem, weil kein Programm damit klarkommen würde.
    Ich bestreite auch dass junta überhaupt die Kompetenz hat eine solche Änderung "diagnostizieren" zu können.

    Was sich definitiv ändert ist das Timing von vielen Operationen (Dinge werden langsamer), und natürlich liefert die Funktion ::IsDebuggerPresent auf einmal true zurück.
    Ein Programm kann also durchaus beschliessen bestimmte Dinge anders zu machen sobald ein Debugger dran hängt. Möglicherweise um diverse Schutzmechanismen besser zu verstecken, indem man sie deaktiviert wenn das Programm im Debugger läuft.

    Darüberhinaus gibt es vermutlich noch etliche Änderungen wo undefiniertes Verhalten auf einmal sehr reproduzierbar wird wenn der Debugger attached ist. Oder unspezifiziertes Verhalten sich ändert.
    Eine Liste solcher Änderungen kann ich aber nicht anbieten.

    Am Besten du probierst das ganze nicht mit irgendeinem Frendem Programm wie Adobe Reader, sondern mit einem eigenen kleinen dummen Testprogramm. Wenn auch hier das Verhalten anders ist, dann machst du vermutlich beim hooken irgendwas falsch.
    Wenn es da klappt, könnte es sein dass das andere Programm irgendwas komisch macht, oder ganz einfach nicht gehooked werden möchte.

    ps: das Geschlecht von Fremdwörtern ist zwar immer ne Streitfrage, aber ich behapte mal dass kein (vernünftiger) Mensch "die Hook" sagt. Der Haken. Der Hook. Klare Sache.



  • Änderungen am Stack kommen durchaus vor, sollten aber kein Problem sein. Wenn dein Programm bei jedem Neustart eine andere Basisaddresse bekommt geht es ja nicht anders.
    Außerdem kommt es drauf an in welchem "Zustand" sich das Programm befindet wenn du den Debugger attachst, je nachdem liegen da halt auch andere Daten im Stack.



  • @DarkShadow44
    Wenn es das ist was junta gemeint hat, also dass Stacks von neuen Threads nach dem Attachen des Debuggers andere Adressen bekommen, dann hat er es falsch formuliert.
    Das ist ja keine "Änderung am Stack".

    "Änderung am Stack" würde heissen dass der Debugger in bestehende Stacks reinmalt oder die im Speicher rumschiebt. Was er natürlich nicht tut.

    Dass sich sämtliche Muster, die man von Adressen von dynamisch angefordertem Speicher (wie eben auch Stacks) gewohnt ist, ändern können, ist irgendwie klar.

    Und ... äh. Windows Programme haben typischerweise immer die selbe Basisadresse. Die meisten haben nichtmal Relocation-Informationen drinnen, könnten also nichtmal rebased werden selbst wenn Windows wollte. Keine Ahnung wovon du da redest...



  • Windows Programme haben typischerweise immer die selbe Basisadresse

    Die meisten schon, ja. Aber VS und GCC bieten zumindest eine Möglichkeit an Code positionsunabhängig zu machen und somit ASLR auch für diesen Speicherbereich nutzbar zu machen. Scheint aber nicht häufig genutzt zu werden.


Log in to reply