"Größe einer Funktion"



  • Redhead schrieb:

    Berechnung der Grösse der Funktion HalloBallo() nehme ich an ??
    Das ist jetz aber nicht dein Ernst oder ? 😃 😃 😃 😃

    Ich hab doch bereits eingeräumt, dass diese Variante nicht vollkommen deterministisch ist, aber wenn er die Größe der Funktion unbedingt haben will, dann kann er es ja so machen. In einigen Fällen ist es bei mir vorgekommen, dass die zweite Funktion vor der ersten angeordnet wurde und somit ein hoher negativer Wert rausgekommen ist. Aber wenn die kompilierte Version erstmal funktionierte, dann ging es auch auf jedem NT-System, auf dem ich diese Methode getestet habe.



  • Was ist denn der Sinn von der ganzen Sache? Nur mal so aus Langeweile was Neues ausprobieren oder steckt da noch mehr hinter?



  • Er will wohl seinen Funktionscode irgendwo injecten (Buffer-Overflows, RemoteThreads).Ansonsten wüsste ich auch keine wirkliche Verwendung dafür 😉



  • Nein, will ich nicht. Wenn ich wollte, würde es auch reichen einen größeren Wert anzugeben aber darum geht es mir eben nicht. Warum zur Hölle muss denn immer diese dümmliche "Sinn?"-Diskussion gestartet werden?
    Entweder man verrät seine Idee oder man wird als Virenautor abgestempelt? Traurig.



  • icy schrieb:

    Warum zur Hölle muss denn immer diese dümmliche "Sinn?"-Diskussion gestartet werden?

    Weil es idR eine bessere Lösung gibt.

    Beispiel:
    Frage: wie kann ich mir Flügel wachsen lassen??
    Antwort: geht nicht. was willst du denn machen??
    Frage: ich will einmal fliegen.
    Antwort: dann bau dir ein fluggerät siehe diese links: ...

    Geil oder?



  • icy schrieb:

    Nein, will ich nicht. Wenn ich wollte, würde es auch reichen einen größeren Wert anzugeben aber darum geht es mir eben nicht. Warum zur Hölle muss denn immer diese dümmliche "Sinn?"-Diskussion gestartet werden?
    Entweder man verrät seine Idee oder man wird als Virenautor abgestempelt? Traurig.

    Wie du meinem Smiley entnehmen kannst, war meine Aussage nicht ganz ernst gemeint und eigentlich ist es mir auch egal, was du damit machen willst. Und als Virenautor hab ich dich schon gar nicht abgestempelt, das ist vielleicht eine leichte Überinterpretation meiner Aussage 😉



  • Hm da hast du recht Shade of Mine aber ich bin mir 100%ig sicher, dass ich es genau so haben will bzw nicht anders geht.

    Masterofx32: Tut mir leid, hab wohl ein bisschen überreagiert.



  • Wie sehen denn nun deine aktuellen Ergebnisse aus? Nutzt du die (nicht ganz saubere) Subtraktionsmethode oder probierst du dich doch an der Ablaufverfolgung des Funktioncodes?



  • Die Code Injection würde wohl auch kaum funktionieren. Du kannst nicht einfach eine Funktion für sich allein nehmen und woanders hinkopieren, da sind ja in der Regel haufenweise Absolutadressen hardcoded drin.

    Wenn du es dir leisten kannst, einen Compiler aufzurufen, kannst du ja auch mal mit einem leeren Rumpf compilieren und dann die Größe des .text-Segments mit der vollständigen Version vergleichen.



  • Ringding schrieb:

    Die Code Injection würde wohl auch kaum funktionieren. Du kannst nicht einfach eine Funktion für sich allein nehmen und woanders hinkopieren, da sind ja in der Regel haufenweise Absolutadressen hardcoded drin.

    Wenn du es dir leisten kannst, einen Compiler aufzurufen, kannst du ja auch mal mit einem leeren Rumpf compilieren und dann die Größe des .text-Segments mit der vollständigen Version vergleichen.

    Das mit der Code-Injection funktioniert sehr wohl. Du musst nur selbstverständlich Funktionsaufrufe und Stringliterale,etc vermeiden. Zum Beispiel kannst du dir Funktionspointer zu LoadLibrary, GetProcAddress und FreeLibrary übergeben und dann mit CreateRemoteThread deine Funktion ausführen, die du injected hast. Von dort aus könntest du eine weitere DLL im fremden Prozess laden und von dort aus hast du ja wieder die möglichkeit "normal" weiterzuprogrammieren



  • Ja klar geht es. Aber nur wenn man sich sehr genau überlegt, was man macht bzw. den erzeugten Code kontrolliert. In dem Fall kann man's aber eigentlich auch gleich in Assembler schreiben.



  • Ringding schrieb:

    In dem Fall kann man's aber eigentlich auch gleich in Assembler schreiben.

    immer gibt's was zu meckern 😃



  • Ich will zum Beispiel einen Systemaufruf abfangen. Das Tutorial dazu verlangt im Beispiel die Größe der Funktion... :p



  • Wie meinen?



  • Ich hab einen Artikel gelesen, in dem steht wie man System-Calls (wie z.B. RegCreateKey) abfangen kann. Mit dem überschreiben bin ich schon fertig d.h. anstatt RegCreateKey wird meine Funktion aufgerufen. Und jede Anwendung denkt sie hätte da eben einen Schlüssel in der Registrierung erstellt. Sinnlos auf den ersten Blick... doch das Beispiel des Artikels bracht die Größe der Funktion um die überschriebene Funktion wieder aufzurufen (frag mich nicht warum). Also bin ich auf ins Forum und siehe da, schon ein Anderer hat meine Frage gestellt die dort erst als sinnlos abgestempelt wird. Wenn das Projekt fertig ist, kann ich besser kontrollieren, was mir in der Systemregistrierung rumgekritzelt wird. Oder noch interessanter (glaub ich) die Aufrufe in der CryptAPI... 🕶



  • Es wird doch wohl verdammt nochmal möglich sein, die Größe einer Funktion zu ermittlen!? Irgendwo muss doch der "Aussprungspunkt" im Speicher stehen?!

    Wäre es vielleicht möglich, den Einsprungspunkt der folgenden Funktion zu nehmen -1?



  • Such (Google) mal nach API-Hooking. Glaub kaum das man dafür die Grösse der
    Funktion wissen muss.
    Ich könnte mir vorstellen das "Shade of Mine" mit seinem "Sinn-Beispiel" bei
    dir genau richtig liegt, jetzt wo wir was was du willst, kann man dir
    vielleicht etwas besser helfen.



  • Mit der Registry waren andere schon schneller 🙂

    Wenn du nur mal einen Überblick brauchst, lass den Linker ein map-file generieren, und subtrahier die Adressen (funktioniert im Prinzip wie das subtrahieren von Funktzionszeigern - auch nicht immer)

    Es wird doch wohl verdammt nochmal möglich sein, die Größe einer Funktion zu ermittlen!?

    Was ist "die Größe einer Funktion" ?



  • Ich bin nicht icy. 🙄 Ich habe das gleiche Problem und habe euch deshalb ein Beispiel gegeben, wofür man sowas brauchen kann!
    Größe der Funktion ist eigentlich der Offset, der Platz den die Maschinencodebefehle im Speicher verbrauchen.
    Vielleicht kann man einen OpCode Header von Intel nehmen und die Prozedur analysieren...



  • Ich hab doch "die" Lösung schon gepostet, damit gibt's keinen Grund zu Beanstandungen. Ich konnte das mit VS 6.0 und 7.1 kompilieren und es lief auch auf jedem System ohne Probleme. Und wenn dir diese Methode zu unsicher ist, musst du eben deine Opcodes analysieren, aber das wurde hier auch schon erwähnt und ist weitaus aufwändiger.


Anmelden zum Antworten