Prüfen ob eine Anwendung manipuliert wurde



  • du kannst das nicht wirklich 100% sicher lösen. Irgend wie kann man immer mit Reverse Engineering deine Anwendung knacken.



  • Also spar dir den Aufwand. 🙂



  • InfoStudend schrieb:

    MD5 Hash klar erste Idee nur wo speicher ich den Hash damit er nicht gefunden und manipuliert wird? Im Prog selber geht ja nicht mehr! Also Ini Datei und dann als Möglichkeit noch chiffrieren.
    Noch mehr Möglichkeiten??

    cu infoStudent

    du kannst es so machen, eine globale variable anlegen und mit ein wert vorbelgen
    jetzt suchs du mit ein hexeditor diesen wert, merks dir adresse

    schreibst ein programm, welches eine hash von der exe macht, sie an der stelle einträgt wo die globale variable ist, jetzt noch mal eine hash von der exe hollt und kuckt ob sich die hash verändert hatt
    da die hash selber neu in der exe ist wird sich wiederum die hash verändern, da hashes aber nicht 100% eindeutig kann es klapen, du darfs aber nicht sowas wie md5 benutzen den dann kanns du lange warten
    dies programm läst du dann so lange laufen bis die hash vor und nach den eintragen in die exe gleich sind

    um das ganze etwas schneller zu machen kannst du die exe im speicher behalten und das segment der exe welches vor der globalen varibale leigt wird ja nicht verändert, du musst dein hash algo dann nur noch beibringen das es dies segment nur einmal durchgehen muss und das ergebnis zwischen speichern

    wenn jetzt jemand deine exe hacken will muss er das gleiche machen wie du oder er macht aus

    bool ist_die_exe_ok()
    {
        // der hash algo usw.
        return ergebnis;
    }
    

    ein

    bool ist_die_exe_ok()
    {
        return true;
    }
    

    deswegen sollten die prüf sachen inline sein, aber das schütz auch nicht vor ein search & replace
    also müsstes du verschieden code benutzen, das ist aber auch nicht so leicht da compilier die sachen optimieren und am ende sieht der output gleich aus



  • InfoStudend schrieb:

    MD5 Hash klar erste Idee nur wo speicher ich den Hash damit er nicht gefunden und manipuliert wird? Im Prog selber geht ja nicht mehr! Also Ini Datei und dann als Möglichkeit noch chiffrieren.
    Noch mehr Möglichkeiten??

    cu infoStudent

    Wieso geht's nicht im Programm? Bei meinem Installationsprogramm hänge ich die Installationsdateien (ein gepacktes Archiv das auch das eigentliche Install-Script enthält) auch einfach an's Ende der Exe, wieso soll das nicht auch mit 'nem Hash gehen?

    Wenn du einen MD5-Hash nimmst weisst du dass die letzten 128 Bit der Datei der Hash-Code sind und darfst die bei Ermitteln des Hashes einfach nicht berücksichtigen. Um eventuelle Cracker zu verwirren kannst du danach ja noch ein paar Bytes voll Mülldaten schreiben 🙂



  • Wenn du z.B. ne Progressbar nutzt dann musst du ja InitCommonControls[Ex] aufrufen - sonst startet die Anwendung nicht. Man kann aber stattdessen auch via LoadLibrary die shell32.dll laden.
    Den Namen shell32.dll hab ich verschlüsselt (also simpel verschlüsselt) gespeichert. (Also z.B. char* lib = "54jbksdsg!";)
    Der String wird immer LoadLibrary übergeben. String wird dann mit der Checksumme der Datei wieder entschlüsselt. Ist halt jedesmal aufwendig wenn die Exe-Datei geändert wurde (Also Quellcodeanpassung o.Ä.).
    Ist halt ein sehr billiger Trick. Voraussetzung ist halt das keine Funktion aus der shell32.dll genutzt werden.



  • Du kannst den Hash berechnen und diesen in den letzten 4 Byte der Anwendung speichern. Beim Überprüfen machst du nur einen CRC32 auf die ersten n-4 Byte.



  • Naja, meine Idee benötigt ein Zusatzprogramm das den CRC32 der kompilierten exe berechnet und ihn an die Datei anhängt. Das Hauptprogramm muss beim Starten das gleiche machen wie das "Anhängtool" nur halt ohne zu schreiben. Es terminiert wenn der CRC32 falsch ist. Dann kann auch niemand mehr die Ressourcen verändern und es als sein Prog ausgeben (Vorrausgesetzt er kennt die Methode mit der Checksumme nicht! Dann müsste er aber auch die CRC32-Table kennen. Ist also relativ sicher.). Das Programm erkennt auch selber eine Modifikation durch Viren etc. und kann eine Warnung ausgeben.



  • Das Probleme dabei ist aber immer, wie Dimah schon gesagt hat, das es irgendwo dann ein
    "if(exeOk) StarteProgramm(); else BeendeProgramm();" gibt.



  • Stimmt, hatte ich nicht bedacht. Hmmm, wie könnte man das lösen? Bearbeitungazeitpunkt kann jedes Kiddie nach der Änderung selbst zurücksetzen. Fällt also schonmal weg. Datei zusätzlich auf NOPs untersuchen ist schwierig weil man die exe auch parsen müsste, zeitaufwendig und kann durch NOPs auch entfernt werden 😃 erhöht aber die Sicherheit ein wenig. Fällt weg. Man muss sich wohl damit abfinden 😞 😉 .



  • Zudem produzieren manche Compiler selbstständig NOPs und INT3s auch im Release-Mode!
    Du könntest eine wichtige Variable von der Prüfsumme abhängig machen.



  • Hallo Leute!
    Danke für die vielen Antworten!

    Also ist leider doch so wie gedacht.Jede noch so gute Lösung in einer Hochsprache läßt sich auf ein if ok then start prog auf asm ebene übertragen.
    Oder anders ausgedrückt der Wissensstand des Programmierers muß höher sein als der des bösen Kiddis.

    Erstmal habe ich mich für einen MD5 Hash dessen Hashwert in einer Ini Datei verschlüsselt liegt. Naja für den Aufwand doch eine nützliche Version.

    Habt ihr noch weitere Ideen wie man dieses Problem am besten lösen kann bzw. wie man es dem bösen jungs so schwer wie möglich machen kann?

    cu InfoStudent



  • du kannst ja die Prüfmethode direkt in Assembler schreiben, dann baust du den Code eben recht verwirrend auf. Das hält dann schon Leute mit weniger Erfahrung ab. Sorgt aber natürlich dafür, dass dein Code nicht mehr gut portierbar ist und der Kerl, der sich später um den Code kümmern muss dich dafür prügeln wird. Das Problem ist eben, dass jeder, der Ahnung von Assembler hat und einen Debugger bedienen kann deine Lösungen knacken kann. Du könntest ansonsten auch die Applikation verschlüsselt hinterlegen und ein kleiner Lade Code, entschlüsselt einfach den Code. Hier besteht aber wieder das Problem den Schlüssel sicher auf zu bewahren.

    Ein sicherer Weg wär mit Smartcards oder anderen Hardware Lösungen zu arbeiten, aber das kommt ja idr. nicht in Frage. Naja, vielleicht musst du einfach auf TCPA warten ;), obwohl die erste TCPA Implementierung (MS XBox) ja auch schon geknackt wurde *hihihi*



  • Hallo Leute

    Leider habe ich nicht Lust und Laune auf ASM Ebene abzusteigen aber die Idee ist natürlich denkbar. Auch ist die Idee mit externen Datenträgern sehr gut nur leider ein wenig zu teuer. Und den Teufel TCPA mit ins Boot holen wollte ich eigendlich nicht.

    Also es ist jetzt eine Mischung aus einem MD5 Hash der in eine externe Datei zusammen mit verschlüsselten Benutzerpasswörter verschlüsselt abgelegt wird. Ja auch mit einem Fake Benutzernamen der sich dann auch nicht mit dem Hash anmelden kann. Außerdem habe ich eine kleine Überraschung eingebaut. Eine "falsche" Eingabe in einem Zahlenfeld gibt eine Meldung aus vom wem das Prog ürsprunglich gecodet wurde und kann so helfen zu beweisen wer der Urheber ist. Hoffe das das wohl reichen wird :-))
    Reicht um die Kiddis abzuwehren ...

    Cu InfoStudent



  • Ich glaube selbst ein Kiddie kann den Text in deiner Meldung per Hexeditor ändern.



  • hallo mastah

    genau das wollte ich ja verhindern.
    darum ist der text im versteckten anzeigenfeld verschlüsselt und wird nur zur laufzeit entschlüsselt so das kaum einer auf die idee kommt ihn dort zu vermuten bzw überhaupt danach zu suchen.

    für die kiddis ist ja auch der md5 schutz schon eine hürde.

    cu InfoStudent


Anmelden zum Antworten