Frage Wie kann ich einen Test im Code verschleiern, um eine Manipulation der Antwortverarbeitung zu verhindern?


Ich suche nach einem Weg, um (im Objektcode) einen Test zu verschleiern - etwas, was getan werden könnte, um zu überprüfen, ob ein Lizenzschlüssel gültig ist. Was ich verhindern möchte, ist jemand, der eine Image-Binärdatei nach dem Code durchsucht, der die Antwort verarbeitet.

bool checkError = foo();
if ( checkError ) // I'd like to avoid making a simple check like this one.
{
   // process response
}

Dies ist ein einfaches Beispiel, aber kein empfohlener Ansatz:

int check = 71 * 13;
check += 35 * isValid(); // will only return 0 or 1

//later (delayed execution of response)
if ( check % 71 )
{
   //process response
}

BEARBEITEN: Nur um zu verdeutlichen, ist der eigentliche Test bereits beendet und ich bekomme einen Pass / Fail Return. Meine Antwortverarbeitung wird eine grundlegende jmp sein und wäre an Hinweisen interessiert, wie der Ort der jmp verschleiert werden kann.


7
2017-12-11 20:10


Ursprung


Antworten:


Ein Ansatz wäre, den Code, der die Lizenzprüfung durchführt, in eine separate DLL zu stellen. Laden Sie in der Hauptanwendung die DLL zur Laufzeit und berechnen Sie die Prüfsumme der DLL selbst. Die App speichert die Prüfsumme, die mit der DLL berechnet wurde. Wenn die Prüfsummen nicht übereinstimmen, haben Sie mehrere Möglichkeiten, eine falsche Versionsnachricht anzuzeigen - ein wenig offensichtlich; Rufen Sie nicht die Lizenzprüfung an - weniger offensichtlich, wird aber bemerkt, wenn der Angreifer sich fragt, warum die Lizenzprüfung nicht aufgerufen wird; Rufen Sie eine Funktion mit einem ähnlichen Namen wie die echte Lizenzprüfungsfunktion auf.

Stellen Sie sich vor, es zu benutzen Verschlüsselung öffentlicher Schlüssel. Verwenden Sie einen öffentlichen Schlüssel als Teil der Konfiguration und lassen Sie einen privaten Schlüssel in die App integriert. Wenn sie sich mit dem öffentlichen Schlüssel herumschlagen, wird die digitale Signatur der App auf eine erkennbare Weise kompromittiert.

Ich stimme @camccann zu, dass es helfen würde, die Art von Angriff zu verstehen, die Sie erwarten. Als letzten Ausweg teilen Sie die Lizenzprüfung in so viele Teile wie möglich auf, um das Umgehen durch Ändern eines einzelnen Verzweigungspunkts zu erschweren.

[BEARBEITEN]

Ein anderer Gedanke wäre, ein zu verwenden Zustandsmaschine. Siehe das Beispiel der Befehlsstruktur in der oberen Antwort auf diese Frage. Setzen Sie die Auswertung der Lizenzprüfung in Form eines Hash-Lookups und einer Menge von Dummy-Funktionsaufrufen in ein Array zusammen mit dem richtigen. Der Entscheidungscode, der die Lizenzprüfung in einer Tabelle / Hash-Suche nach der entsprechenden Funktion auswertet, sieht nicht wie Ihr typischer aus

if(){ pass;} else { fail; } 

bauen.

Zwei Vorteile,
  1) Es gibt keine boolesche Bedingung zum umgehen und
  2) Sie können keinen einfachen JMP-Befehl ausführen, ohne die Adresse / den Namen der Funktion zu kennen, an die die Steuerung übergeben werden soll.

SO Thread auf einer State Machine turorial.
SO Thread bei Zustandsautomatenimplementierungen


5
2017-12-11 20:32



Verschleierung nicht verhindern, nur entmutigen. Ein ausreichend fähiger und entschlossener Angreifer wird immer in der Lage sein, jede Art von Verschleierung zu umgehen. Was Sie also zuerst wissen müssen, ist: Was für Leute versuchen Sie hier zu durchkreuzen?


5
2017-12-11 20:17



Das Sicheres Programmier-Kochbuch (O'Reilly) hat ein ganzes Kapitel über Anti-Manipulation (das eigentliche Buch hat das Kapitel, nicht sicher, was auf der Website verfügbar ist). Ordentliches Zeug.


3
2017-12-11 21:14



Sie könnten einen Absturz verursachen, indem Sie den Scheck wie folgt streuen:

T* data = (T*) new char[sizeof(T) * (check() ? 1 : 0)]
array[i + 1 * (check() ? 0 : 42)].doStuff();

Es gibt einen schönen Artikel bei Gamasutra über Rissschutz in Spyro das macht ähnliche Dinge, geht dann weiter, indem es das Spiel nicht zum Absturz bringt, sondern nur schlechter und schlechter arbeitet. (Du triffst niemals Feinde, du gehst langsamer, bestimmte kritische Objekte verschwinden zufällig usw.)

Spaß lesen für alle Programmierer und vielleicht nützlich für Sie.


3
2017-12-11 22:00