antispy 101 - String Encryption

antispy 101: Wie benutzt man die String Encryption?

In diesem Beispiel der antispy 101 Serie zeigen wir wie die String Encryption in antispy funktioniert.


Während wir auf der Seite C/C++ Encrypted String auf das Feature String Encryption in antispy eingehen möchten wir diesen Beitrag dazu nutzen um die komplette Verwendung durchzugehen.

Es gibt viele Ansätze um Strings in einer Binary zu verschlüsseln. Wir versuchen einen guten Kompromiss zwischen Benutzung und Effizienz einzugehen. Daher implementieren wir mit der Klasse ::libantispy::string einen sehr flexiblen Laufzeit verschlüsselten String. Für die Verschlüsselung zur Kompilierzeit muss die klasse ::libantispy::const_string verwendet werden. Die einfachste Art der Verwendung ist das TEXT Makro.

Benutzung

Das TEXT Makro wurde in Anlehnung an das TEXT Makro in winnt.h entwickelt, daher überschreibt antispy das bereits definierte TEXT Makro. Für bestehende Windows Anwendungen, welche bereits das TEXT Makro verwenden, sind die Anpassungen dadurch minimal.

In den String-Klassen haben wir Konvertierungen zu vielen STL String-Klassen definiert. Konvertierungen zu String-Klassen aus anderen Frameworks sind per CMake-Option aktivierbar. Sollten Sie eine Konvertierung zu einer speziellen String-Klasse benötigen Kontaktieren sie uns.

Die Benutzung des ::libantispy::const_string ist für den Entwickler denkbar einfach.

Wir beginnen mit einem einfachen Platform unabhängigen Beispiel.

#include <iostream>

int main(int argc, char** argv) {
  std::cout << "Hello World" << std::endl;
  return 0;
}

Eine einfache Anpassung aktiviert die Verwendung des verschlüsselten ::libantispy::const_string.

#define TCHAR char
#include <libantispy/libantispy.h>

int main(int argc, char** argv) {
    std::cout << TEXT("Hello World") << std::endl;
    return 0;
}

Die Verschlüsselung wird durch das inkludieren des Headers und dem verwenden des TEXT Makros aktiviert.

Das Ergebnis

Beim kompilieren wird der statische String nicht mehr als solches in die Binary eingepflegt. antispy verschlüsselt den String beim kompilieren mit Modernen C++ Standards. Die Verschlüsselung ändert sich nach jedem Build. Dadurch lassen sich wertvolle Informationen in der statischen Analyse verstecken. Zur Laufzeit wird dieser String nur bei der Benutzung auf dem Stack entschlüsselt und anschließend wieder freigegeben.

Vergleich im Disassembler: Vorher und Nachher

Vorher ist der String ganz deutlich zu erkennen. Er ist im Disassembler referenziert und in einem konstanten read-only Segment der Binary gespeichert.

antispy 101 - Main ohne String Encryption
Einfache main Methode ohne String Verschlüsselung. Der String ist einfach erkennbar.

Nach der Verwendung von antispy sieht dieselbe Funktion so aus – huch was ist hier passiert? It’s magic.

antispy 101 - Main mit String Encryption
Einfache main Methode mit String Verschlüsselung. Zur Laufzeit wird der String am Stack entschlüsselt.

Beispiel: Magic Values im Code? Kein Problem…

In einem Projekt lesen wir den Header einer Datei aus. Um uns vor Reverse-Engineering des proprietären Dateiformats zu schützen nutzen wir antispy. Der „Magic“ ist zwar im Quelltext ganz normal vorhanden – aber in der statischen Analyse absolut nicht mehr wiederzufinden.

char buf[7]{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
if (read_data(hMemoryStream, static_cast<LPVOID>(&buf[0]), 7, &actual))
{
   // Using the antispy TEXT macro to hide magic value here.
   // > strcmp is inlined.
   result = strcmp(buf, TEXT("secret")) == 0;
}

Konnten wir dein Interesse wecken?

Hast du Interesse an antispy dann nimm Kontakt mit uns auf oder melde dich jetzt zu unserem Newsletter an, um keinen einzigen Artikel aus der Serie zu verpassen.

Du kannst dich auch jederzeit wieder abmelden.

Wir schicken dir Updates zu unseren Artikeln am Dienstag und Donnerstag.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.