"Größe einer Funktion"



  • 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.



  • Damit sich niemand beirren lässt:
    Das subtrahieren funktioniert auf keinen Fall, da zwischen den Funktionen oft leerräume im Speicher sind!
    Und drum bekomme ich nicht meine 74 zurück sondern 96!!! 🤡

    Debuggerauszug:

    ...
    100:      {
    101:          return true;
    10001521 B0 01                mov         al,1
    10001523 EB 02                jmp         ValidCompilation+37h (10001527)
    102:      }
    103:      return false;
    10001525 32 C0                xor         al,al
    104:  }
    10001527 5F                   pop         edi
    10001528 5E                   pop         esi
    10001529 5B                   pop         ebx
    1000152A 8B E5                mov         esp,ebp
    1000152C 5D                   pop         ebp
    1000152D C3                   ret
    --- No source file  --------------------------------------------------------------------------------
    1000152E CC                   int         3
    1000152F CC                   int         3
    10001530 CC                   int         3
    10001531 CC                   int         3
    10001532 CC                   int         3
    10001533 CC                   int         3
    10001534 CC                   int         3
    10001535 CC                   int         3
    10001536 CC                   int         3
    10001537 CC                   int         3
    10001538 CC                   int         3
    10001539 CC                   int         3
    1000153A CC                   int         3
    1000153B CC                   int         3
    1000153C CC                   int         3
    1000153D CC                   int         3
    1000153E CC                   int         3
    1000153F CC                   int         3
    --- C:\Dokumente und Einstellungen\Uli Hecht\Eigene Dateien\Projekte\Sonstiges\testelmechtel mit C++\WMP@ï  „ÜsŒí
    105:
    106:  //Prüft ob TrampolineProc() größer als 10 Byte ist
    107:  bool ValidTrampolineProc()
    108:  {
    10001540 55                   push        ebp
    

    ...


Anmelden zum Antworten