Programm bildet seine eigene Checksumme



  • Hi,

    ich wollte einmal versuchen ein Programm zu schreiben, welches seine eigene Checksumme generiert und diese mit der garantiert richtigen Checksumme des Programmes vergleicht.
    Ich hab mich also ans Werk gemacht und bin auf folgendes Problem gestoßen.

    Womit soll ich die richtige Checksumme überhaupt rausbekommen, wenn ein Teil des Programmes noch gar nicht fertig ist, nämlich der Vergleich mit der richtigen Checksumme.

    Vielleicht etwas schwer zu verstehen oder blöd zu erklären, hier mal etwas Pseudocode:

    wenn(GetChecksummeVonProgramm() != "hier steht die richtige checksumme")
    ausgabe("falsche checksumme")
    

    Das Problem ist einfach, dass ich den Wert der richtigen Checksumme "hier steht die richtige checksumme" ja noch nicht kenne, da genau dieser Vergleich, den ich als Pseudocode geschreiben hab, ja solange nicht vollendet werden kann, bis ich die richtige Checksumme habe.

    Für mich ein rekurives Problem :p

    Ich muss dazu sagen, dass ich die Checksumme aus den gesammten Zeichen der kompilierten exe erstelle und nicht nur aus einem Teil der Zeichen.

    Wie lösen die Profis das Problem? - Es gibt doch schon Programme die sich selbst auf Veränderungen prüfen.

    Gruß
    ravel



  • Mach die Abfrage doch umgekehrt, es ändertsich dadurch ja nur ein Bit in der Exe und du kommst nur dann nicht durch, wenn sie zutrifft. Dann schreibst du eine Externe Exe, die dir die Checksumme berechnet und sie ausgibt, dann trägst dudiese Checksumme in der Abfrage ein und drehst sie wieder um.



  • Obwohl mir gerade auffällt, dass das nciht so ganz hinhaut... hmm... ödes Problem xD vielleicht sollte man das so machen: Exe-Dateien haben einen Header, wenn du mal herausfindest, wie groß der bei dir ist... weil der ändert sich ja nicht durch solche Eingaben... und dann nur diese Bytes überprüfst... und die letzten Bytes, weil Viren schreiben sich meistens hinten ran.



  • Mach das doch einfach so, dass du die Checksumme deines Binaries erzeugst und an das Ende des Binaries anfügst. Dann liest du einfach von da die Original Checksumme und beim generieren der Checksumme musst du einfach die letzten n-Bytes ignorieren.



  • hätte ich genau so empfohlen, oder du lagerst sie einfach aus. alternativ merkst du dir wo in der exe der wert steht, und ignorierst diesen part....

    /EDIT: richtig cool kommt kingruedis idee kombiniert mit nem exe-packer wie UPX..... crc natürlich erst NACH dem packen adden!



  • Hi,

    erstmal vielen Dank für Eure Antworten, besonders kingruedis Idee ist auf dem ersten Blick ziemlich gut. UPX benutze ich bereits für meine Programme, loki1985.
    Auf dem zweiten Blick sehe ich aber eine Sicherheitslücke in dem Prizip. Vorweg muss ich sagen, dass ich den Prüfsummencheck dazu nutzen will um böswillige Veränderungen im Programm zu erkennen.

    Ich schreibe jetzt also das Programm welches bei jedem Start die eigene Prüfsumme berechnet und mit der Prüfsumme die am Ende des kompilierten Programmcodes (damit wir uns richtig verstehen, also der Code der in der exe steht, wenn man ihn mit einem Editor öffnet?) steht vergleicht und entsprechend reagiert.

    Ich berechne nun mit einem externen Programm die echte Prüfsumme des Programmes und schreibe sie in den compilierten Programmcode. Beim generieren der eigenen Prüfsumme wird die Prüfsumme im kompilierten Programmcode ignoriert. Nun wird die generierte Prüfsumme mit der im kompilierten Programmcode verglichen.

    Was spricht jetzt dagegen, dass ein potentieller Cracker Veränderungen am Programm vornimmt, eine neue Prüfsumme des Programms berechnet und sie selbst ans Ende des kompilierten Programmcodes setzt?

    Gruß
    ravel



  • Beim IOCCC gibt es ein Programm, das das kann.



  • dfgfdg schrieb:

    Beim IOCCC gibt es ein Programm, das das kann.

    International Office of Cocoa, Chocolate and sugar confectionery?
    http://www.candy.net.au/IOCCC/

    😕

    Edit: Ah wahrscheinlich das http://uguu.org/nfo_rinia.html
    Werde ich mir mal anschauen.

    Gruß
    ravel



  • der klassische weg ist, die prüfsumme im code 4 bytes auf 0 zu setzen. compilieren. mit XOR die prüfsumme zu berechnen. die 4 bytes auf die prüfsumem setzen. compilieren. und im laufenden prog muss die prüfsumme gleich 0 sein.

    kannst mit max 4 milliarden mal compilieren auch den trick mit crc32 machen. so würde ich das machen, um crack-anfänger mir vom halse zu halten.

    aber echte cracker haben in nullkommanix das

    if(ps!=0) return throw UnregExceptipion();
    

    gefunden und machen aus dem != ein ==. also im assemblercode aus dem JE ein JNE.

    sicher biste nur, wenn das knacken den cracker viel mühe kostet. probier mal sowas:

    a) die eigene exe wird sofort aufgemacht und per filemapping ins ram gespiegelt. und der zeiger darauf ist global. und er wandert an sehr viele stellen, damit der böse nicht so leicht überwachen kann, wann man die variable liest.

    zu gegebener zeit (so spät wie möglich und mitten in der game-engine irgendwo) wird das auch benutzt. und zwar mehrfach. möglichst oft.

    b) deine factprs zum laden der spielstände oder dokumente oder was braucht ja ne kleine hasttable. haha. als hashfunktion wird die checksumme des programms genommen. ist auch kein problem, beim speichern wird ja die selbe genommen worden sein.

    c) möglichst viele literale werden nicht als literal im code abgelegt, sondern als offset in eine tabelle, die fest im code steht, und die (wieder so spät wie möglich) im programm gesucht wird. zugriff dann im code statt cout<<"hallo" mit cout<<STRING(HALLO) nebst #define STRING(X) ((char*)programm+anfangtabelle+X)) (nur mal verhindern, daß der böse den globalen zeiger aufs filemapping verfolgt). so oft, wie die globale variable programm benutzt wird, verliert er hoffentlich den spaß.

    d) mach viel unfug. je kreativer du bist, desto schwiriger wird es. verwende einweg-funktionen, virtuelle methoden, computed goto, excpetions und switch, damit der code nicht zu einfach zu verfolgen ist. nett ist auch mutierender code, aber das paßt nicht gut in den c++-compiler. andererseits, mit ausreichend zeit auch das.



  • Ravel schrieb:

    dfgfdg schrieb:

    Beim IOCCC gibt es ein Programm, das das kann.

    International Office of Cocoa, Chocolate and sugar confectionery?
    http://www.candy.net.au/IOCCC/

    http://www.de.ioccc.org/years.html


Anmelden zum Antworten