Größe einer Funktion rausfinden?



  • Hi!

    Ist es irgendwie möglich die Größe einer Funktion in Bytes rauszufinden? Also die Größe des nativen Codes?

    alá

    void funktion( void )
    {
      int a;
    
      for ( a=0; a<100; ++a )
      {
        printf("%i\n", a);
      }
    }
    
    int main( int argc, char *argv[] )
    {
      // Folgende Zeile geht wegen dem sizeof nicht
      printf( "Funktion %p ist %u Bytes groß.", funktion, sizeof(funktion) );
    
      return 0;
    }
    


  • Nein. Wenn du es unbedingt wissen möchtst dann disassemble dein Programm und schau nach 😛
    Wozu braucht man soetwas denn?



  • Naja, der Sinn und Zweck der Sache sollte gerade sein, dass das disassemblen schwerer wird. Wollte halt Funktionen verschlüsseln und dann über komplexere Wege ausführen lassen (Geschwindigkeit würd zwar stark sinken, aber dafür würde das disassemblen schwerer). Hatte gehofft, man könnte einfach irgendwie die Größe rausfinden.. Oder irgendwie aus irgendeiner der vom Compiler/Linker erzeugten Dateien rauslesen..



  • ProfEich schrieb:

    Naja, der Sinn und Zweck der Sache sollte gerade sein, dass das disassemblen schwerer wird. Wollte halt Funktionen verschlüsseln und dann über komplexere Wege ausführen lassen (Geschwindigkeit würd zwar stark sinken, aber dafür würde das disassemblen schwerer). Hatte gehofft, man könnte einfach irgendwie die Größe rausfinden.. Oder irgendwie aus irgendeiner der vom Compiler/Linker erzeugten Dateien rauslesen..

    Über die Möglichkeiten, Code vor Reverse Engineering zu schützen, muss ich mich auch noch informieren (schon alleine, weil ich seit kurzem nebenbei an einem C++ Decompiler werkle - bin aber noch nicht mal beim Disassemblieren angekommen ;)).
    Was würde es dir denn bringen, die Funktionsgröße zu kennen? Mir fällt auf die schnelle kein Weg ein, daraus einen Nutzen zu ziehen.
    Während dem Dekompilieren von Hand sind mir ein paar Dinge aufgefallen, die jenen Vorgang ziemlich erschweren können:
    - Arbeiten mit Gleitkommazahlen
    - Verwenden von virtuellen Funktion
    - fehlende Symbolnamen natürlich (Funktionsnamen, etc.)
    - viel (zum Teil vom Compiler automatisch erzeuges) Inlineing (Funktionsaufrufe wurden einfach komplett durch die Funktion ersetzt)
    Warum möchtest du es denn möglichst gut schützen? Macht das Programm etwas, bei dem man Manipulationen vorbeugen sollte, wie z.B. bei Multiplayerspielen?



  • hehe~ jo, ich bin ja selber ein (in manchen Communities sogar sehr bekannter) reverser. Daher kenne ich auch Dinge, die es schwerer machen den Code zu reversen. Aber trotzdem Danke für die Tipps..

    Nun.. Gerade beim VERSCHLÜSSELN der Funktion wäre es praktisch, die Größe zu wissen. Zumal der Code ja erst im Nachhinein verschlüsselt werden soll (also IN der erstellen EXE). Also praktisch per PostProcessing. So, dass der orginalcode nirgendwo mehr in der EXE steht.



  • Es gibt verschiedene Methoden dazu - eine wäre zum Beispiel, für jede Funktion ein Segment zu vergeben.

    Allerdings macht das überhaupt keinen Sinn, da sowhl sämtliche direkten Sprungadressen als auch Variablenreferenzen leicht hinfällig werden können.

    Warum nicht lieber die zu schützenden Funktionen in eine DLL packen, selbige dann verschlüsseln und später während der Lauzeit entschlüsseln und selber laden?

    Gruss,
    Glen.



  • ProfEich schrieb:

    Nun.. Gerade beim VERSCHLÜSSELN der Funktion wäre es praktisch, die Größe zu wissen. Zumal der Code ja erst im Nachhinein verschlüsselt werden soll (also IN der erstellen EXE). Also praktisch per PostProcessing. So, dass der orginalcode nirgendwo mehr in der EXE steht.

    Warum machst du es dann nicht so, dass du den Entschlüsselungscode an den Anfang der ausführbaren Datei packst, dann in den Speicher entschlüsselst (vielleicht auch JIT) und reinhüpfst?! Also quasi eine VM direkt in der Datei.

    Aber ehrlich gesagt frage ich mich, wozu man Code verschlüsseln will?! So wahnsinnig genial kann der doch gar nicht sein... :p



  • Glen schrieb:

    Es gibt verschiedene Methoden dazu - eine wäre zum Beispiel, für jede Funktion ein Segment zu vergeben.

    Allerdings macht das überhaupt keinen Sinn, da sowhl sämtliche direkten Sprungadressen als auch Variablenreferenzen leicht hinfällig werden können.

    Warum nicht lieber die zu schützenden Funktionen in eine DLL packen, selbige dann verschlüsseln und später während der Lauzeit entschlüsseln und selber laden?

    Gruss,
    Glen.

    Hey, die Idee gefällt mir! Ich glaube der bin ich bei irgendeinem Spiel schonmal begegnet. Dann müsste man die DLL nur ins Temp-Verzeichnis entpacken, Lesezugriff verweigern (falls das geht) und verwenden. Unter Linux wäre das sicher nicht so einfach, oder?


Anmelden zum Antworten