PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zu Codeobfuscation (C/C++)


anakin87
2012-10-26, 14:30:31
Hallo,
ich habe ein paar Fragen zu Codeobfuscation unter C/C++..

Welche Software kennt ihr denn so? Bzw. produziert Output der nicht ewig nachbearbeitet werden muss.
Zur Zeit evaluieren wir Mangle-IT, Stunnix Obfuscator und vl. nehmen wir Polystyle auch noch rein....
Es gibt anscheinen etwas brauchbares von morpher - aber bei dem Preis -> nein

So nun zu dem was mir nich passt:
Stunnix kann zwar chars umgestalten aber keine strings..
Mangle IT, tja es verändert zwar strings aber die bekommen nur eine Zeichenfolge vorangesetzt, der Rest bleibt wies ist. Auch werden manche Funktionen nicht erkannt und mit einem Prefix versehen, welche dann nachbearbeitet werden müssen - ebenso wie die Datentypen. Schade...

ich überlege jetzt selbst ein Programm zu erstellen um chars und strings zu kodieren (von encryption will ich noch nicht reden, vorerst halt)
Z.B. base64 en-/decoder getestet wird dann mit IDA Pro ob noch Klartext drin ist...

beste grüße

EDIT: ach ja wie siehts aus mit dem Umbau von Funktionen -> ich stell mir das etwas kompliziert vor, wenn eine Software Änderungen an der Logik vornimmt...

Gnafoo
2012-10-26, 17:41:19
Also das was z. B. Stunnix auf ihrer Webseite mit der Animation so schön demonstriert ist imho völliger Humbug. Zumindest wenn man das Reverse-Engineering von Binaries verhindern möchte. Entweder werden Dinge geändert, die nach dem Compilieren sowieso verschwinden (Variablennamen, Kommentare) oder die vom Compiler wieder rückgängig gemacht werden, bevor das Binary entsteht (Escape-Sequenzen, Aufgebauschte Konstanten, …). Ich denke mal deswegen steht auch dabei:

„It's useful for distributing applications or libraries in source form (to maximize portability) without disclosing source code.“

Das ist eigentlich auch der einzige Anwendungsfall, in dem man im entferntesten einen Nutzen daraus ziehen kann. Ich halte es aber auch für den Fall für sinnlos, weil sich die meisten Transformationen automatisch rückgängig machen lassen. Einfach den Code neu formatieren, Bezeichner ersetzen und die Werte der Konstanten ausrechnen, dann hat man ja eigentlich wieder den Quellcode.

Wenn es wirklich um das Reverse-Engineering der Binaries geht, dann gibt es kein wirksames Gegenmittel. Man kann es eventuell erschweren, aber dann muss man schon mit der Programmlogik arbeiten bzw. im Kontrollflussgraphen rumpfuschen und wirkliche Sicherheit bietet das natürlich trotzdem nicht.

anakin87
2012-10-26, 17:56:02
Also das was z. B. Stunnix auf ihrer Webseite mit der Animation so schön demonstriert ist imho völliger Humbug. Zumindest wenn man das Reverse-Engineering von Binaries verhindern möchte. Entweder werden Dinge geändert, die nach dem Compilieren sowieso verschwinden (Variablennamen, Kommentare) oder die vom Compiler wieder rückgängig gemacht werden, bevor das Binary entsteht (Escape-Sequenzen, Aufgebauschte Konstanten, …). Ich denke mal deswegen steht auch dabei:

„It's useful for distributing applications or libraries in source form (to maximize portability) without disclosing source code.“

Das ist eigentlich auch der einzige Anwendungsfall, in dem man im entferntesten einen Nutzen daraus ziehen kann. Ich halte es aber auch für den Fall für sinnlos, weil sich die meisten Transformationen automatisch rückgängig machen lassen. Einfach den Code neu formatieren, Bezeichner ersetzen und die Werte der Konstanten ausrechnen, dann hat man ja eigentlich wieder den Quellcode.

Wenn es wirklich um das Reverse-Engineering der Binaries geht, dann gibt es kein wirksames Gegenmittel. Man kann es eventuell erschweren, aber dann muss man schon mit der Programmlogik arbeiten bzw. im Kontrollflussgraphen rumpfuschen und wirkliche Sicherheit bietet das natürlich trotzdem nicht.
(y) Jep genau das habe ich mir auch gedacht, weil es war immer viel nachzuarbeiten und umbenennen kann ich auch.
Wie ich schon gepostet habe, denke ich auch dass Software die Programmlogik nicht richtig umbauen kann und wird...
Die Idee ist zur Zeit, dass ich aus

//aus dem
string s1="geheim";
VerarbeiteGeheim(s1);

//sollte das werden
string s2="encoded";
VerarbeiteGeheim(decode(s2));


Ich bin mir nicht sicher ob mir der Compiler das dann wegoptimiert, darum wollte ich ja mit IDA Pro mal drüberschaun ob der string wieder irgendwie auftaucht. Klar kann man es trotzdem reverse eng., aber das sollte vorerst mal reichen.

PatkIllA
2012-10-26, 18:24:43
Was willst du denn konkret erschweren?
Geht es nur um die Strings oder auch um die Logik? Quelltext oder nur Binaries?
Nur ein großes Programm oder auch Bibliotheken?

anakin87
2012-10-28, 12:41:38
Eigentlich geht es in erster Linie um strings die dann in der Binary des Programmes so nicht mehr auftauchen sollten. Über Logik und Quelltext kann man dann später noch streiten ;D...

Klar kann man ein "laufendes" Programm analysieren und die strings wieder klar lesen, aber soweit möchte ich es erstmal nicht hochspielen.

anakin87
2012-10-30, 11:27:51
Ok die Aufgabenstellung hat sich etwas geändert...
Nun so siehts aus... Es soll ein Teilbereich (ganz wichtige Logik und so) ;D des Programms gegen STATISCHE Analysen der Binary geschützt werden. D.h. Kontrollfluss abändern, Garbage Insertion - Code confusion, Encryption, das volle Programm.

Kennt ihr Tools die mir da helfen? Ganz ohne nacharbeiten wird es wahrscheinlich nicht funktionieren oder?

Überprüft wird dann wieder mit IDA Pro..

Beste Grüße

Gast
2012-10-30, 21:10:00
Die naheliegende Möglichkeit wäre, einen executable compressor wie upx oder pecompact zu verwenden. Das würde absolute Amateure davon abhalten, mal ins Programm zu glotzen.
Einen halbwegs brauchbaren Schutz gegen Fortgeschrittene würde etwa vmprotect bieten.
Und gegen Profis ist eh kein Kraut gewachsen...

anakin87
2012-10-31, 11:52:57
Ok das hilft sehr, nur wurde mir nahe gelegt auch den Kontrollfluss abzuändern -> geht schon eher Richtung Code-Transformation. Klar kann dadurch das Laufzeitverhalten schlechter werden, aber das ist OK...
Ich hab jetzt dazu nur mal TXL (www.txl.ca) und von SUIF soll es anscheinend auch was geben...
Kennt ihr etwas in der Richtung?
Defcon17 hatte einen coolen Talk über BinaryObfuscation -> https://www.youtube.com/watch?v=iva16Bg5imQ

EDIT: vmprotect lässt Binaries mutieren - sieht recht gut aus. Gibts weitere?

Gast
2012-10-31, 15:27:52
vmprotect lässt Binaries mutieren - sieht recht gut aus. Gibts weitere?
Das direkte Konkurrenzprodukt heißt themida.

Und den Source-Code zu verunstalten ist nun wirklich grober Unfug.

anakin87
2012-10-31, 17:01:54
Das direkte Konkurrenzprodukt heißt themida.

Hm themida muss ich mir auch mal ansehen.



Und den Source-Code zu verunstalten ist nun wirklich grober Unfug.
Warum denn? Weil der Compiler optimiert?
Man kann ganz fiese Sachen mit goto, Funktion-&Methodpointer und volatile Datentypen anstellen. Oder übersehe ich etwas?:freak:

PatkIllA
2012-10-31, 17:03:31
Man kann ganz fiese Sachen mit goto, Funktion-&Methodpointer und volatile Datentypen anstellen. Oder übersehe ich etwas?:freak:Irgendeiner muss den Scheiß ja auch vielleicht noch mal warten.
Habt ihr da so große Gefahr? Wir entwickeln in .NET und sind damit quasi Open Source.

anakin87
2012-10-31, 17:13:02
Naja Wartung ist anscheinend nicht vorgesehen.....
Das mit der Gefahr ist sone Sache - es sollte reichen die anderen für 4Wochen zu beschäftigen. Und je nachdem wie gut sie sind, sollte es trotzdem nicht so schnell schaffbar sein. Ganz aufhalten kann man es nicht, es sollte ein Spiel auf Zeit werden - wieviel kann ich rausschlagen?
Darum werden jetzt verschiedene Methoden evaluiert.

Gast
2012-10-31, 19:03:46
Warum denn? Weil der Compiler optimiert?
Man kann ganz fiese Sachen mit goto, Funktion-&Methodpointer und volatile Datentypen anstellen. Oder übersehe ich etwas?:freak:
Weil sich das eigentliche Spektakel eh auf der Binary-Ebene abspielt. Den Source-Code zu transformieren streut höchstens dem Programmierer Sand in die Augen. Der Compiler mag sich für sowas missbrauchen lassen, aber einen großen Effekt wird das kaum erzielen, denn dafür ist er einfach nicht gemacht. Dem Sportskameraden im verlinkten Video ging es anscheinend eher um die lustigen Sprüchlein auf den Slides. So richtig viel Ahnung hat er nämlich nicht durchblicken lassen.

Änderungen am Source-Code werden sich übrigens auch beim Einsatz von themida/vmprotect nicht vermeiden lassen. Den halbwegs brauchbaren Schutz ergibt erst der geschickte Einsatz der Features, die durch Makros des mitgelieferten SDK aktiviert werden. Da gilt es dann zu überlegen, welche Abschnitte virtualisiert oder erst bei Bedarf entschlüsselt, ausgeführt und mit Müll überschrieben werden sollen, usw.
Ob das dann lange hält, hängt natürlich auch von Zielpublikum und Nachfrage ab. So werden Spiele schon bei Release fällig, während es bei obskuren Tools schon mal 4 Wochen dauern kann, bis sich herumgesprochen hat, dass es so etwas überhaupt gibt...

Marscel
2012-11-01, 01:38:30
Ne virtuelle Maschine macht echt nicht so viel Spaß beim Reverse Engineering, da kann man dann auch zur Laufzeit lustige Patterns einführen.

Ich würd bei sowas immer den größten Kopfschmerzfaktor anzielen. Das setzt natürlich Ahnung von Binärcode vorraus: Anweisungen zur Laufzeit generieren oder entschlüsseln und nach Verlassen wieder verschlüsseln, Anweisungsblöcke zerstückeln, im Speicher würfeln, neu verdrahten. Code-Inlining mit Abwandlungen, sinnlose Anweisungen, API-Zugriffe zentral rutschen lassen (Call-Stack vermeiden), Checksumming, ... Eine VM macht Dinge da beim Programmieren teilweise einfacher.

Professionelle Lösungen machen das so, wie der Gast schon erwähnt hat. Wenn man selbst die Ahnung, Zeit und Kreativität hat, lässt sich auf Binärebene aber auch sehr viel anstellen, wie man an zahlreichen HackMes im Netz sieht.

Es gab vor ~20 Jahren mal ein Spiel, das hieß Chaos Strikes Back. Das stellt spierisch den Wahnsinn ganz gut dar, den man analog dem RE bieten muss. :ugly:

noid
2012-11-01, 10:44:32
Das direkte Konkurrenzprodukt heißt themida.

Und den Source-Code zu verunstalten ist nun wirklich grober Unfug.

Ich dachte zum Verunstalten ist der Programmierer da? :freak:
Outsourcing ist eine weitere Methode, TDD und Agile auch.
Am besten noch mit Pairprogramming und fertig.

anakin87
2012-11-02, 13:47:45
@Gast & Marscel
Danke für die vielen neuen Ideen. Ich habe noch nicht so ganz den Durchblick im RE wie und was... ZZ Assembler kann ich nur ganz grob - darum die Idee den Compiler dazu misbrauchen.
Wobei aber es einen gewaltigen Unterschied macht ob MSVC, oder MinGW, etc.... Die haben alle ganz verschiedene Vorstellungen von Optimierung.
Aber nachdem ich mich mit IDA Pro auseinandergesetzt habe sehe ich ein, dass meine Kentnisse noch zu mager sind um auf Obfuscation/Protection - Ebene da direkt zu arbeiten.
Richtig blöd ist nur, dass die ganze Sachlage eilt....
Ich muss mir ein gutes Buch/Tut/Man/etc. dazu suchen -> irgendwelche Ideen?

Beste Grüße