"Größe einer Funktion"
-
Hi Ringding,
Redhead schrieb:
Das ist jetz aber nicht dein Ernst oder ?Immerhin funktioniert das um einiges robuster als die andere Methode.
Und du meinst wirklich das du damit einen sinnvollen und verlässlichen Wert rauskriegst.

-
Was hab ich hier bloß angerichtet!?!?

Hätt' ich doch bloß die Finger von der Tastatur gelassen. Es ging doch nur darum, das "sowas nicht geht". Jetzt läuft dieses Thema bald auf der dritten Seite und wird, fürchte ich, dadurch noch viel mehr "Interessenten" anziehen.

Bezüglich C3 hab ich mich ein bisschen sehr undeutlich ausgedrückt. Es reicht natürlich nicht die Suche nach C3, sondern der Assembler-Code müsste entsprechend analysiert werden, also z. B. bei B0 entsprechend das nächste Byte überspringen usw.
Wird ne ziemlich lange Liste, fürchte ich.
Ob die Compiler-Optimierungen ggf. zusätzliche ret's einsetzen, weiß ich nicht. Vermutlich hast Du recht (ich werd's nicht überprüfen). Generell muss aber doch jede Funktion zunächst den Stack aufräumen und sich die Rücksprungadresse holen. Wahrscheinlich erzeugt eine Geschwindigkeitsoptimierung tatsächlich diesen Code mehrfach.
-
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" ?