Programm vor Disassemblern, Debugging schützen



  • hallo,

    ich habe eine Netzwerkanwendung geschrieben,
    welche ich gegen Debuggern bzw. Dissassemblern schützen will.
    Da man mit einem Disassembler in einem Programm wie in einem
    offenen Buch lesen kann was drinsteht, was nicht jeder wissen
    sollte (z.B Algorithmen) möchte ich gern mein Program davor schützen
    (Den Zugriff erschweren; 100% Schutz wird es wohl nie geben).
    Gibt es dafür irgendwelche Möglichkeiten die den Zugriff erschweren? 🙂

    Mfg

    Alpha_Coder


  • Mod

    Offenes Buch ist gut. Ich glaube du überschätzt die Qualität von Decompilern. Entferne alle unnötigen Sysmbole (z.B. mit UNIX-Tool strip oder etwas äquivalenten) und compiliere mit hohen Optimierungsstufe und du bist schon einmal gut bedient.

    Du kannst auch dein Programm nochmal verschlüsseln/packen und es entpackt sich dann selbst, das ist aber nicht wirklich eine hohe Hürde und macht es dem Reverse Engineer nur ein bisschen unbequemer.

    Das alles gilt für compilierte Sprachen. Wenn du in Assembler entwickelst gelten ganz andere Antworten, ebenso bei Sprachen wie Java oder .NET.



  • Es gibt auch professionelle Obfuskatoren die es dem Angreifer mehr als nur "ein wenig" schwerer machen 🙂

    Allerdings machen es alle verfügbaren Techniken nur schwerer, aber nicht unmöglich das Programm zu analysieren/verändern/...



  • um den Spaßfaktor einer Analyse noch etwas zu verringen, kann man noch:

    * verwirrende Bezeichner einführen. Wichtig klingende Namen für völlig unwichtige Klassen, Hauptklassen dagegen mit kryptischen, selbstausgedachten Abkürzungen oder belanglosen namen belegen.

    Wichtig: Der Name eines wichtigen Bezeichners darf nie auf die wahre Funktion hinweisen. Der Input-Buffer heißt "outputStack" usw 😃

    * Codeteile einbauen, die gar nicht benutzt werden. Trivialitäten mit Komplexität aufblasen und mehrfach wrappen.

    * Code-Kommentare gelegentlich mit Lügen würzen 🙂

    * Bezeichner mit leicht verwechselbaren Buchstaben wählen: o O 0 1 i I l | S $

    Mehr Tips gibt's mit Suche nach: how to write unmaintainble code



  • Kommentare werden garnicht mitcompiliert und nicht verwendete Zeilen code machen
    a) keinen Sinn, da leicht erkannt
    b) können sie sehr schnell die performance behindern

    Außerdem ist es für einen selbst nicht grade von vorteil das dingen so zu schreiben das man selbst nichts mehr von versteht.

    Auch ähnliche Zeichen sind der totale Blödsinn. Ich guck mir so ein Programm doch nicht in Word mit irgend einer komischen schrift an.

    In Eclipse oder auch VS gibt es wohl wenig probleme die Buchstaben zu unterscheiden...

    EDIT: Nicht verwendeter code wird in der Regel wegoptimiert...



  • Sqwan schrieb:

    nicht verwendete Zeilen code machen
    a) keinen Sinn, da leicht erkannt
    b) können sie sehr schnell die performance behindern

    hängt von der Fantasie und den Fähigkeiten des Programmierers ab ...

    Wenn man beispielsweise den Code eines gängigen Zufallsgenerators so frisiert, daß die Ausgaben stets ein gesetztes Bit 3 haben, und dann

    if( zuf(x) & 8 ){
    ...
    /* verwendet oder nicht? */
    ...
    }
    

    muß der Leser erstmal mathematisch dazu in der Lage sein, einen faulen
    Zufallsgenerator zu erkennen.

    Individuelle Obfuskation ist schon möglich, die Frage ist eher, ob es den Aufwand lohnt. Daß es sich lohnt, eine Klartext-Version zurückzubehalten, dürfte der Programmierer spätestens bei Eintreffen des ersten bugreports merken 😃



  • Was hast du von einem faulen zufallsgenerator?
    Und wie viele leute die einen code für wirtschaftliche Zwecke wieder herstellen, wie auch immer sie das machen, haben wohl das Hintergrundwissen so einen quatsch heraus zu finden...


  • Mod

    !rr!rr_. schrieb:

    um den Spaßfaktor einer Analyse noch etwas zu verringen, kann man noch:

    * verwirrende Bezeichner einführen. Wichtig klingende Namen für völlig unwichtige Klassen, Hauptklassen dagegen mit kryptischen, selbstausgedachten Abkürzungen oder belanglosen namen belegen.

    Bezeichner sind im Maschinencode nicht mehr vorhanden. Klassen sind im Maschinencode nicht mehr vorhanden. Hauptklassen sind im Maschinencode nicht mehr vorhanden.

    * Codeteile einbauen, die gar nicht benutzt werden. Trivialitäten mit Komplexität aufblasen und mehrfach wrappen.

    Unbenutzter Code ist (in der Regel) im Maschinencode nicht mehr vorhanden und selbst wenn einfach zu identifizieren.

    * Code-Kommentare gelegentlich mit Lügen würzen 🙂

    Kommentare sind im Mascinencode nicht mehr vorhanden.

    * Bezeichner mit leicht verwechselbaren Buchstaben wählen: o O 0 1 i I l | S $

    Bezeichner sind im Maschinencode nicht mehr vorhanden.

    Mehr Tips gibt's mit Suche nach: how to write unmaintainble code

    Du redest von einem ganz anderen Thema als (vermutlich) gefragt. Das hilft vielleicht um Java Code zu verschleiern, aber da der Threadersteller von Disassemblern und Decompilern spricht, wird das wohl nicht gemeint sein.



  • Kommentare sind sogar bei Java weg.
    Auch der rest ist in Java blödsinn... Damit stellt man sich selbst ein Bein!



  • Da reden die Einäugigen mit den Blinden. 😃



  • @Erhard Henkes:
    Das kannst du in vermutlich 80% der Beiträge hier schreiben, was macht diesen Thread so besonders 😕



  • Nichts! Besonders wäre er erst gewesen, hätten die Erleuchteten ein brauchbares Satement abgegeben...



  • Als ich mein erstes Program mit dem IDA PRO Free mal angeschaut habe, habe ich nicht schlecht gestaunt was der zurückliefert. Der ist durchaus in der Lage kleinere Funktionen lesbar darzustellen.

    Meine Tips beziehen sich mit C++ und WinAPI/MFC/... entwickelten Programme.

    Verschleiere wichtige Funktionen mittels Code Obfuscation. Schaue dir diese mittels IDA Pro Free an, und versuche deinen Code soweit leserlich zu versauen dass das Debugging mit IDA Pro Free keinen Spaß macht. Nutze sinnlosen, aufgeblähten, redundanten, Inline Code um dein Program zu verschleiern. Code auf dem Stack gibt dabei Extrapunkte.

    Prüfe ob ein Debugger in der Release Version läuft und ändere dein Programverhalten s.d. dieser scheinbar öfters abstürzt oder Werte falsch berechnet.

    Denkbar wäre auch dass das Program die Integrität der eigenen Exe überprüft.

    Las einfach deinen Spieltrieb freien Lauf, deinem Gegenüber das Reverse Engineering zu versauen 😃

    Quellen:
    http://www.symantec.com/connect/articles/windows-anti-debug-reference
    http://www.heise.de/security/artikel/Comic-ueber-Reverse-Engineering-270144.html
    http://www.marx.com/ftp/pub/techdocs/manuals/CRYPTO-BOX/SmarxOS/SmarxOS_Compendium_de.pdf, Seite 297 Professioneller Softwareschutz



  • BiSt du einäugig oder blind?



  • Vermutlich blind. 😮

    Vielleicht habe ich aber auch nicht so die letzen Posting's verstanden. Also könntest du mir bitte mal erklären warum ich blind oder einäugig sein soll ??? 😡



  • Erhard Henkes schrieb:

    Da reden die Einäugigen mit den Blinden. 😃

    Was weiß denn ich. Ich hab die Theorie nicht aufgestellt.


  • Mod

    Sqwan schrieb:

    Erhard Henkes schrieb:

    Da reden die Einäugigen mit den Blinden. 😃

    Was weiß denn ich. Ich hab die Theorie nicht aufgestellt.

    Es geht wohl darum, dass hier viele glauben, Sourcecodeobfuscation würde groß was am Maschinencode oder gar an der Rückübersetzung ändern. Damit macht man sich bloß selbst das Leben schwer, der Reverse Engineeer merkt davon aber noch nicht einmal was (außer man verwendet absichtlich obskure Algorithmen, aber es ging ja darum die guten Algorithmen zu schützen).

    Grüße

    Ein Einäugiger.



  • Joa. Aber was unterscheidet dann den Einäugigen vom Sehenden?
    Wenn ich davon ausgehe, das die die sagen, "Verbau nicht unnötig code, bei der Rückübersetzung merkt man eh nichts davon", die Einäugigen sind.



  • SeppJ schrieb:

    Sqwan schrieb:

    Erhard Henkes schrieb:

    Da reden die Einäugigen mit den Blinden. 😃

    Was weiß denn ich. Ich hab die Theorie nicht aufgestellt.

    Es geht wohl darum, dass hier viele glauben, Sourcecodeobfuscation würde groß was am Maschinencode oder gar an der Rückübersetzung ändern.

    Nur um das klarzustellen: ich meinte mit Obfuskatoren Programme die den fertigen Maschinencode verhunzen.


  • Mod

    hustbaer schrieb:

    Nur um das klarzustellen: ich meinte mit Obfuskatoren Programme die den fertigen Maschinencode verhunzen.

    Ja, das hatte ich auch so verstanden. Ich bezog mich auf den Rest des Threads.



  • SeppJ schrieb:

    Klassen sind im Maschinencode nicht mehr vorhanden. Hauptklassen sind im Maschinencode nicht mehr vorhanden.

    aus dem Anfangsposting geht aber nicht hervor, daß es sich um Maschinencode handelt, nicht einmal, um welche Sprache.

    Mit so allgemeinen behauptungen wäre ich - je nach Sprache, bytecode oder Binärformat - eher vorsichtig.

    SeppJ schrieb:

    Unbenutzter Code ist (in der Regel) im Maschinencode nicht mehr vorhanden und selbst wenn einfach zu identifizieren.

    Da hast du aber einen sehr schlauen Compiler (patentiert?)

    SeppJ schrieb:

    Bezeichner sind im Maschinencode nicht mehr vorhanden.

    s. Antwort 1)

    SeppJ schrieb:

    Du redest von einem ganz anderen Thema als (vermutlich) gefragt.

    als ob das hier immer eine Rolle spielt 🙂 Nein, im Ernst - ich kann deine Voraussetzungen nachvollziehen, wenn wir spezifisch von (sagen wir) C/C++ und Kompilaten in einem bestimmten Binärformat reden. Die Frage liest sich aber für mich allgemeiner.

    SeppJ schrieb:

    aber da der Threadersteller von Disassemblern und Decompilern spricht, wird das wohl nicht gemeint sein.

    Die Bagger und die Compiler gibt es auch für Sprachen, die nach Bytecode kompilieren.


Anmelden zum Antworten