Frage

ich entdeckt, dass es möglich ist, die hartcodierte Strings aus einer binären zu extrahieren.
Zum Beispiel sehen die Eigenschaften von Process Explorer die Zeichenfolge alle mit mehr zeigt als 3 Zeichen.

Hier ist der Code einer einfachen ausführbare Datei, die ich einfach es geschrieben testen:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
    for (int i= 0; i<argc; i++) {
        if (0 == _tcscmp(argv[i],hiddenString1)) {
            _tprintf (_T("The guid argument is correct.\n")); }
        else if (0 == _tcscmp(argv[i],hiddenString2)) {
            _tprintf (_T("Do something here.\n")); }
    }

    _tprintf (_T("This is a visible string.\n"));
    //Keep Running
    Sleep(60000);
    return 0;
}

Die Saiten können deutlich von den entsprechenden ausführbaren extrahiert werden:
alt text

Ich denke, dass es ein wenig zu einfach ist, die Saiten zu finden.

Meine Fragen sind:

  1. Wie einfach verbergen hiddenString1 oder hiddenString2 in der ausführbar?
  2. Sie haben einen sichereren Art und Weise „betrügen Code“ zu verwenden, als mit einige obskure versteckt Eingang?
War es hilfreich?

Lösung

Willkommen in der breiteren Welt der Defensive Programmierung.

Es gibt ein paar Optionen, aber ich glaube, dass alle von ihnen auf irgendeine Form von Verschleierung abhängen; , die zwar nicht perfekt, ist zumindest etwas.

  1. Statt einem geraden String-Wertes können Sie den Text in einer anderen binären Form gespeichert werden können (hex?).

  2. Sie können die Strings verschlüsseln, die in der App gespeichert sind, dann entschlüsseln sie zur Laufzeit.

  3. Sie können sie über verschiedene Punkte in Ihrem Code aufgeteilt, und Rekonstitution später.

oder eine Kombination davon.

Beachten Sie, dass einige Angriffe weiter gehen als bei der tatsächlichen binären suchen. Manchmal werden sie den Speicheradressraum des Programms untersuchen, während er ausgeführt wird. MS kam mit etwas ein Secure in .Net 2.0 aufgerufen . Der Zweck verschlüsselt die Saiten zu halten ist, während die App ausgeführt wird.

Eine vierte Idee ist nicht selbst in der App die Zeichenfolge zu speichern, sondern auf einem Validierungscode verlassen, um zu einem Server gesendet werden, die Sie steuern. Auf dem Server können Sie überprüfen, ob es sich um ein legit „Cheat-Code“ ist oder nicht.

Andere Tipps

Es gibt viele Möglichkeiten, um obskure Daten in einer ausführbaren Datei. Andere hier haben gute Lösungen geschrieben - etwas stärker als andere. Ich will nicht zu dieser Liste hinzuzufügen.

Just beachten: es ist alles ein Katz-und-Maus-Spiel. Es ist unmöglich Garantie , dass niemand Ihr "Geheimnis" herauszufinden,

Egal, wie viel Verschlüsselung oder andere Tricks, die Sie verwenden; egal wie viel Mühe und Geld man es in eine. Egal, wie viele "NASA / MIT / CIA / NSA" Typen beteiligt sind es versteckt.

Es kommt alles auf einfache Physik:
Wäre es nicht möglich, jeder Benutzer Ihr Geheimnis aus der ausführbaren Datei zu ziehen und „sichtbar machen“ es, dann würde der Computer nicht in der Lage sein, entweder sichtbar machen, und Ihr Programm nicht in der Lage sein zu verwenden, es. Jeder mäßig qualifizierte Entwickler mit genügend Anreiz haben die Art und Weise das Geheimnis sichtbar machen.

Der Moment, dass Sie die ausführbare Datei an einen Benutzer übergeben haben, haben sie alles, was sie brauchen, um das Geheimnis zu erfahren.

Am besten Sie hoffen können, ist es so schwer zu machen , um das Geheimnis zu entdecken, dass alle Vorteile, die Sie aus dem Wissen, das Geheimnis nicht die Mühe wert worden bekommen können.

Also, es ist OK, um zu versuchen, die Daten zu verschleiern, wenn es nur ist „nicht-schön“, denn es öffentlich zu sein, oder, wenn die Folgen davon werden die Öffentlichkeit wäre nur „unbequem“. Aber denken Sie nicht einmal in Ihrem Programm „das Passwort für Ihre Master-Client-Datenbank“, ein privaten Schlüssel oder ein anderes kritische Geheimnis versteckt. Sie kann einfach nicht.

Wenn Sie wirklich kritisch geheime Informationen, die Ihr Programm irgendwie brauchen sollte aber nie die Information der Öffentlichkeit wird (wie ein privater Schlüssel), dann müssen Sie Ihr Programm des Gespräch mit einem Remote-Server unter Kontrolle haben, gelten entsprechende Authentifizierung und Berechtigungssteuerungen ( das ist, stellen sie sicher, dass nur die zugelassenen Personen oder Computer sind in der Lage, die Anfrage an den Server zu machen), und hat diese Server die geheim zu halten und es zu benutzen.

Der einfachste Weg ist sie trivial wie xor mit etwas zu verschlüsseln oder rot-13, und sie dann im Fluge entschlüsseln, wenn sie verwendet werden. Das wird beseitigen lässig Betrachtung von ihnen, aber es wird nicht jemand mit viel Erfahrung stoppen bei umkehrt.

Zusätzlich zu diesen Methoden Chris erwähnt auch einen Hash-Algorithmus verwenden könnte. Wenn alles, was Sie tun wollen Kontrolle ist, wenn die korrekte ID angegeben wurde Sie nicht wirklich braucht die ganze ID in Ihrem Programm zu speichern.

  • Erstellen Sie eine Hash (MD5, SHA, etc.) der Zeichenfolge / Passwort / id Sie gegen vergleichen wollen, vielleicht fügen Sie ein ‚Salz‘ Wert zu. Bewahren Sie diese in Ihrem Programm
  • Wenn das Programm ausgeführt wird, tun den gleichen Algorithmus auf der Eingabezeichenfolge / Passwort / id und vergleichen die beiden Hashes, um zu sehen, ob sie übereinstimmen.

Auf diese Weise der eigentliche Text nie in Ihrem Programm gespeichert ist, und sie können das Programm nicht zurückentwickeln, was der ursprüngliche Text war, um herauszufinden, da Hash-Algorithmen Einbahn sind nur.

  

Es gibt URLs für HTTP-Anfragen, die ich verbergen möchte.

Wenn Ihre Anwendung die Anforderung stellt, hat es keinen Sinn diese zu verstecken. Ausführen einer App wie Fiedler, http analyzer, oder eines von Dutzenden von anderen frei und leicht verfügbaren Methoden zeigen den gesamten Verkehr App erstellt.

Werden alle Ihre geheimen Codes sein GUIDs oder war das nur ein Beispiel?

Vielleicht speichern Sie Ihr Geheimnis als binäres guid:

const GUID SecretGuid =
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

Dann wandeln Sie Ihre geliefert GUID aus Zeichenfolge in das Binärformat und vergleichen Sie die zwei binäre guids.

Wenn es eine bestimmte Zeichenfolge, die Sie nicht wollen, Menschen in der Lage sein zu sehen, dann verschlüsseln und zur Laufzeit entschlüsselt werden.

Wenn Sie nicht die Leute wollen Ihre GUID sehen, dann bauen sie aus Bytes, anstatt aus einem String aufgebaut:

const GUID SecretGuid = 
      { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

Das Beste, was Sie tun können, ist Ihr Passwort oder andere Zeichenfolge codieren, die Sie als char-Array ausblenden möchten. Zum Beispiel:

std::string s1 = "Hello";   // This will show up in exe in hex editor
char* s2 = "World";   // this will show up in exe in hex editor
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor.

Hier ist die Methode, die ich für diesen Zweck verwenden. Erstens, ich benutze die die Strings Tool von Sysinternals die Saiten in einem EXE oder DLL anzuzeigen. Ich benutze dann die kleines Tool folgenden rel="nofollow (siehe Artikel ) diese Zeichenfolgen mit einer verwürfelten Anordnung der Zeichen als ein arithmetischer Ausdruck gespeichert ersetzen: bei Beispiel: statt des string: "Dies ist ein Test" Ich werde den folgenden Code platzieren: (die durch automatisch generiert diesem Tool )

WCHAR T1[28];
 T1[22] = 69;
 T1[15] = 121 - 17;
 T1[9] = L':' + -26;
 T1[12] = L't' - 1;
 T1[6] = 116 - 1;
 T1[17] = 117 - 12;
 T1[3] = 116 - 1;
 T1[14] = L'' - 3;
 T1[13] = L'w' - 3;
 T1[23] = 69;
 T1[26] = L'Y' + 3;
 T1[19] = 111 + 0;
 T1[21] = L'k' - 34;
 T1[27] = L'\\' - 8;
 T1[20] = L'B' + 32;
 T1[4] = 42 + -10;
 T1[25] = L'm' - 17;
 T1[16] = L'H' + 18;
 T1[18] = L'A' + 56;
 T1[24] = 68;
 T1[1] = 105 - 1;
 T1[11] = L'k' - 6;
 T1[10] = 66 + 50;
 T1[2] = 105;
 T1[0] = 117 - 1;
 T1[5] = L'k' - 2;
 T1[8] = 89 + 8;
 T1[7] = 32;

Es gibt viele Lösungen für dieses Problem und keiner von ihnen (einschließlich mir) ist perfekt, aber es gibt Möglichkeiten, krabbeln, verschleiern und verstecken die empfindlichen Saiten. Sie können sie natürlich verschlüsseln und während der Laufzeit (siehe diesen Artikel) entschlüsseln, aber ich finde wichtiger diese Zeichenfolge unter den Bits und Bytes der ausführbaren Datei verschwinden zu lassen und es funktioniert. Nach meinem Werkzeug ausgeführt wird, werden Sie nicht: „Das ist ein Test“ in der ausführbaren Datei finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top