2016-05-01 5 views
0

Ich werde erklären, was ich vorhabe. Ich habe eine Funktion oder eine Reihe von Codezeilen (in C) zum Schutz - im Grunde sollte niemand die Anweisungen ändern. Also habe ich einen Code (Prüfsummenschutz genannt), der auf dem x86-Assembler-Code arbeitet, der aus der C-Datei erzeugt wird. Es nimmt eine Anweisung von dieser Assembly auf, addiert (oder wendet fletcher algo oder irgendeine andere Funktion an) auf einen Prüfsummenwert (anfänglich 0) an und dies wird durchgeführt, bis alle Anweisungen beendet sind. Um festzustellen, ob eine Anweisung manipuliert wurde, nehme ich den Zusatz (oder den Fletcher usw.) aller Anweisungen und überprüfe ihn mit dem vorberechneten Prüfsummenwert. Welche Methoden sind dafür geeignet?Was ist der entsprechende Prüfsummenalgorithmus, der verwendet wird, um eine Änderung des Codes zu verhindern?

Hier ist die Forschungsarbeit, die über diese Technik spricht:

https://www.cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf

Hier ist die Wache Vorlage:

guard: 
     add ebp, -checksum 
     mov eax, client_addr 

for: 
     cmp eax, client_end 
     jg end 
     mov ebx, dword[eax] 
     add ebp, ebx 
     add eax, 4 
     jmp for 
end: 
+0

Fletcher's Checksum ist ** nicht ** eine Sicherheits-Checksumme (Sie haben "Sicherheit" als eines Ihrer Tags). Es bietet ein wenig Schutz vor zufälligen Fehlern, aber keinen Schutz vor böswilligen Angriffen, da jeder Angreifer Ihre Daten modifizieren und die entsprechende Prüfsumme für seine Änderung berechnen kann. Wenn Sie eine Sicherheitsprüfsumme wünschen, sind Nachrichtenauthentifizierungscodes (MACs) oder digitale Signaturen erforderlich. Um Ihre Frage zu beantworten, denke ich aus einer mathematischen Perspektive, 256 ist eine bessere Wahl als 255. – TheGreatContini

+0

Ich habe die Frage geändert und daher hat sich die Beschreibung geändert. Ich habe über Message-Authentifizierung gelesen und es wird erwähnt, dass MACs, digitale Signaturen und authentische Verschlüsselung die Wege sind, um zu gehen. Was wäre die beste Methode? – ak0817

Antwort

1

Die Forschungsarbeit Sie unter Berufung ist von den Gründern der Arxan technologies. Sie haben patents zum Schutz von Code auf diese Art und Weise, wo der Schutz davor steht, Menschen vom Reverse Engineering abzuhalten. Viele Jahre vor Arxan hatte Intertrust einige similar technologies. Ich habe Arxan nicht gründlich genug studiert, um zu verstehen, was neu ist an dem, was sie tun, und ich kann die Rechtmäßigkeit der Patente nicht kommentieren.

Sie haben die Frage ursprünglich als eine Sicherheitsfrage formuliert, ohne den Kontext dafür anzugeben, wie es sich um Sicherheit handelt. Sie haben es jetzt neu geschrieben (danke!), Um den Sicherheitskontext klarer zu machen. Sie sind daran interessiert, Codeänderungen und/oder Reverse Engineering zu verhindern.

Techniken zur Verhinderung von Codeänderungen und/oder Reverse Engineering basieren auf Verschleierung und Selbstüberprüfung. Sicherheitspuristen werden niemals die "Sicherheit" von Verschleierung nennen, aber in der Praxis macht es einen großen Unterschied, Hacker von Reverse-Engineering-Software abzubremsen.

Zurück zu Ihrer Frage, fragen Sie, ob man für diese Art von Schutz eine Prüfsumme, eine digitale Signatur oder eine MAC verwenden sollte. Ich würde stattdessen eine kryptographische Hash-Funktion empfehlen. Hier ist warum:

  • Eine einfache Checksumme ist einfach für einen Hacker zu umgehen. Er muss lediglich den Code so ändern, dass ein Befehl, der am Ende seiner Code-Änderung nie aufgerufen wird, seine Änderungen im vorherigen Teil des Codes aufhebt.
  • Digitale Signaturen und MACs basieren auf Geheimnissen und in der Theorie kann ein Hacker diese Geheimnisse immer in Ihrem Code finden. This research paper hat gezeigt, wie man das vor vielen Jahren macht (und es ist praktisch und funktioniert!). Sobald die Geheimnisse gefunden sind, verhält sich eine digitale Signatur oder MAC im Wesentlichen wie ein kryptografischer Hash. Der wahre Grund, diese Werkzeuge zu vermeiden, ist, dass sie für das Problem, das Sie zu lösen versuchen, übertrieben sind.
  • Kryptografische Hashes lösen das gleiche Problem wie die Prüfsummen, aber sie machen es für jemanden unmöglich, sie so zu attackieren, wie man eine normale Prüfsumme angreift: wenn sie den Code modifizieren, dann werden sie das auch haben um die Prüfsumme zu ändern. Mit anderen Worten, es gibt keine einfache Möglichkeit, Änderungen des Codes durch Einfügen einer Anweisung rückgängig zu machen, die am Ende nichts bewirkt. (Wenn Sie einen Weg gefunden hätten, hätten Sie eine Kollision in der Hash-Funktion berechnet, was bedeutet, dass Sie die kryptografische Hash-Funktion durchbrochen haben).

Trotz dieser Punkte kann ein einzelner Check in der Software auf verschiedene Arten immer noch umgangen werden.Deshalb brauchen Sie Wachen, die den Wächter bewachen, und Wächter darüber, und so weiter, und Sie müssen auch Ihre Prüfsummen bewachen (kryptografische Hash-Ausgabewerte), darüber wachen und so weiter. Wenn Sie praktischen Schutz vor Code-Modifikationen und Reverse-Engineering wünschen, geht diese Strategie letztendlich auf ein Minenfeld des geistigen Eigentums von Arxan und/oder Intertrust.

+0

Vielen Dank für Ihre ausführliche Antwort. Die Sache ist, als Teil meines Projekts muss ich einen bestimmten C-Code schützen, und ich weiß, dass es viele "korrekte" oder ausreichend schwierig zu durchbrechende Rahmen geben kann. Aber gerade jetzt, um wenigstens ein bisschen Fortschritte zu machen (wenn auch nur ein bisschen), wollte ich etwas zu diesem Arxan-Papier hinzufügen (was ich erwähnt habe), also suchte ich nach einer anderen Funktion, anstatt einen einfachen Zusatz auf den Opcodes zu verwenden. Ich habe 2 Fragen, es wäre toll, wenn Sie diese beantworten könnten. – ak0817

+0

1. Welche kryptografische Hash-Funktion wäre Ihrer Meinung nach geeignet? Da der Code, den ich schützen möchte, nicht riesig ist (100-200 Zeilen), möchte ich nicht, dass die Laufzeit durch Hinzufügen einer komplizierten Hash-Funktion in die Luft geht. 2. Denken Sie nach dem Hinzufügen der Prüfsummenfunktionalität (unter Verwendung irgendeiner der kryptographischen Hash-Funktionen - SHA256, MD5 usw.), sollte ich den Code ebenfalls verschleiern? Danke im Voraus. – ak0817

+0

Außerdem muss ich diese Hash-Funktion in x86-Assembly implementieren, da ich Assembly-Anweisungen aus dem Code abholen, um sie nacheinander zu schützen, und Hash-Funktion auf ihren Opcodes anwende. Ist es zu schwierig, dies in der Montage zu implementieren? – ak0817

1

Es gibt keine wirklich idiotensichere Möglichkeit, dies in der Software zu tun. Ausreichend motiviert und kenntnisreiche Angreifer können im Allgemeinen solche Schemas besiegen, solange sie Zugriff auf das Programm binäre haben.

Das einzige, was Sie tun können, ist es härter für sie zu machen. Unter Verwendung von Verschleierungstechniken, selbst modifizierendem Code, Hardware-Schlüsseln, nennen Sie es.

Aber bedenken Sie, dass solche Tricks im Allgemeinen mehr legitime Kunden zu verärgern, dass ernsthafte Angreifer zu stoppen.

Update:

Beispiele, schauen z.B. bei An idiot guide to writing polymorphic engines, die Antwort auf this question und this forum thread. Suchen Sie nach "x86 code obfuscation" und Sie werden viel mehr finden.

+0

Danke. Können Sie einen geeigneten Verschleierungsansatz vorschlagen? Ich meine, ich habe gelesen, dass ich Pseudo-Code einfügen, die Reihenfolge der Anweisungen ändern muss, aber es scheint keinen Algorithmus zu geben. – ak0817

+0

@ ak0817 Einige Links zu Verschleierungstechniken hinzugefügt. –

+0

Danke. Ich bin nur ein Anfänger in der Verschleierung. Ich werde versuchen zu verstehen, was ich kann. – ak0817

Verwandte Themen