Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 16:25

  • Please register to post and access all features, it's quick, easy and FREE!

 

HWID System sicherer machen

Reply
 
Old   #1
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,072
Received Thanks: 819
HWID System sicherer machen

Ich habe bis jetzt ein einfaches HWID System: Beim Start des Programms wird die HWID an ein PHP-Skript übergeben, dass dann überprüft, ob die HWID in der Datenbank eingetragen ist.

Jetzt ist es aber möglich, die Anfrage des Programms auf ein lokales Skript und eine lokale Datenbank umzuleiten... Wie könnte man das verhindern?

Ich hatte daran gedacht, dass ich vom Programm zusätzlich noch eine Zufallszahlenfolge generieren lasse, die dann vom Skript mit einem statischen Passwort verschlüsselt wird. Die vreschlüsselten Zeichen werden zurückgegeben und das Programm überprüft diese. Würde das funktionieren? Wie sicher wäre es?

Außerdem würde mich interessieren, ob es bei einem solchen System noch weitere Sicherheitslücken gibt.

Vielen Dank im Vorraus für jede gute Idee



.Infinite is offline  
Old   #2
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,194
Received Thanks: 718
kommt drauf an...

wenn das programm sowieso schon alles hat, also nur eine überprüfung auf registered auf deinem server macht würde ich mich eher auf einen packer/crypter und anti debugging maßnahmen konzentrieren.
ich als reverser würde zumindest da ansetzen, anstatt zu versuchen eine mir unbekannte datenbank, eventuell mit timestamps etc. nachzubauen.
(wie diese aussieht, kann ich evtl. natürlich aus den packets entnehmen, die sollten also zumindest simpel verschlüsselt sein...)
wenn du merkst, dass du debuggt wirst, oder ähnliche seltsame sachen in deinem speicher sind, gibst du keine fehlermeldung aus "hey, ich werde debuggt!!!111", sondern setzt nen flag und lässt dein programm noch ein wenig weiterlaufen.
nach ner weile springst du dann ein wenig ins leere (__asm jmp rand(); ), oder überschreibst die adresse einer funktion o.ä... alles halt, was zu einem 'unerklärlichem' programmabsturz führt...
das sollte reichen um einen 0815-reverser zu bremsen...

wenn du das programm/funktionen aber von deinem server in eine art "interpreter"/"clienten" reinstreamst, reicht idr. die hwid überprüfung/login.
solltest natürlich auch wieder verschlüsseln, und in den gestreamten code dann ein paar zeitstempel überprüfen und eine 2. login sequenz durchführen, damit nicht einmal die gestreamten daten mitgeloggt werden, und dann einfach ins programm reingestreamt werden^^
das wieder auseinanderzunehmen ist dann eine sache für leute wie dbs, die eh nix zu tuen haben...


Dr. Coxxy is offline  
Thanks
1 User
Old   #3
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,072
Received Thanks: 819
Quote:
wenn das programm sowieso schon alles hat, also nur eine überprüfung auf registered auf deinem server macht würde ich mich eher auf einen packer/crypter und anti debugging maßnahmen konzentrieren.
Ja, alle Funktionen sind schon im Programm drin. Wie kriege ich es denn hin, die zur Laufzeit zu streamen? Ist das nicht ziemlich langsam? Und liegt der Code nicht so oder so im Speicher?

Quote:
wie diese aussieht, kann ich evtl. natürlich aus den packets entnehmen
Wie willst du das denn machen? Das Programm sendet ein Packet (HTTP Get mit HWID als Parameter) und bekommt als Antwort auch nur ein Packet, in dem steht ob die HWID gültig ist oder nicht. Ich sehe nicht, warum man da was verschlüsseln sollte...

Quote:
wenn du merkst, dass du debuggt wirst
Woran merke ich das denn? Meine Kenntnisse im Bereich reverse engineering sind eher dürftig.

Ich gucke gerade nochmal, was es für Möglichkeiten per SQL-Injection geben würde...

Auf jeden Fall Danke schonmal bis hier
.Infinite is offline  
Old   #4
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,194
Received Thanks: 718
kommt drauf an, wie du das realisierst, wird im zweifelsfalle aber wirklich langsamer sein, und ist recht kompliziert.

packets mit wireshark o.ä. abfangen, aus dem not registered ein registered machen...

gibt diverse methoden um zu sehen ob man debuggt wird, ich hab hier i-wo ne pdf mit anti debugging methoden liegen, such ich gleich mal raus und lads hoch.

EDIT: da ist es
sowas wie IsDebuggerPresent und nach window/processnamen suchen ist sehr weit verbreitet, da hat jeder schon nen fertiges plugin in z.b. ollydbug mit dem die umgangen werden, die anderen methoden sind aber interessanter
Attached Files
File Type: pdf whitepaper_antidebugging.pdf (207.9 KB, 52 views)


Dr. Coxxy is offline  
Thanks
1 User
Old   #5
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,072
Received Thanks: 819
Quote:
kommt drauf an, wie du das realisierst, wird im zweifelsfalle aber wirklich langsamer sein, und ist recht kompliziert.
Das guck ich mir auf jeden Fall mal an. Hört sich interessant an

Quote:
packets mit wireshark o.ä. abfangen, aus dem not registered ein registered machen...
Dann verschick ich halt statt einer flag einfach nen hash mit Checksumme oder so

Quote:
´gibt diverse methoden um zu sehen ob man debuggt wird, ich hab hier i-wo ne pdf mit anti debugging methoden liegen, such ich gleich mal raus und lads hoch. (ca 40 min...)
Danke
.Infinite is offline  
Old   #6
failing on a final level
 
elite*gold: 45630
Join Date: Jun 2009
Posts: 28,549
Received Thanks: 24,650
Quote:
Jetzt ist es aber möglich, die Anfrage des Programms auf ein lokales Skript und eine lokale Datenbank umzuleiten... Wie könnte man das verhindern?
Gar nicht. Bau halt ne Verschlüsselung ein, sodass der Cracker nicht einfach auf ne Seite wie "success" umleitet und dann klappts.

Übrigens ist der ganze Kram total sinnlos und auch eine Verschlüsselung macht es nur bedingt sicherer (gleiches gilt für Checkvalues, die kann man alle reversen).
Die sicherste Variante ist es, das Programm ohne Server nicht lauffähig zu machen.
Das heißt, du kannst bestimmte Code-Teile vom Server beziehen oder du lädst wichtige Dlls nach oder das Executable ist verschlüsselt und der Server sendet den Decryption Key.

Alles andere ist nur eine geringe Verzögerung für den Cracker.

Quote:
Ich sehe nicht, warum man da was verschlüsseln sollte...
Damit man eben nicht einfach mit nem kleinen recv Hook oder eigenen Seite + Umleitung nen Crack fertig hat
Brauchst ja nur die empfangenen Daten modifizieren und peng, läuft alles.
Quote:
Woran merke ich das denn? Meine Kenntnisse im Bereich reverse engineering sind eher dürftig.

Ich gucke gerade nochmal, was es für Möglichkeiten per SQL-Injection geben würde...

Auf jeden Fall Danke schonmal bis hier
Gibt hunderte Methoden und auch hunderte, um die Detections zu bypassen.

Quote:
Dann verschick ich halt statt einer flag einfach nen hash mit Checksumme oder so
Dann baut man den entweder nach oder breakt einfach mal auf recv und sieht sich deinen Check an, das wird ja sicherlich nur so ein simples if(registered && valid_hash) sein, das sind 2 kleine Conditional Jumps, die man da patchen muss.

Code Streaming ist nicht langsam, wenn man es richtig macht und es kann ziemlich effektiv sein.
MrSm!th is offline  
Old   #7
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,072
Received Thanks: 819
Hmm... Ich verstehe ehrlich gesagt nicht, wie das funktionieren soll, den Programmcode zu streamen. Muss ich nen eigenen Interpreter schreiben, der den Code zur Laufzeit ausführt oder wie funktioniert das?

Zudem müsste ich ja dann wieder den kompletten Stream verschlüsseln... Verdammte Reverser! So toll sind meine Programme nun auch wieder nicht, dass ich einen größeren Aufwand zum Schützen betreibe als für das eigentliche Programm -.-
.Infinite is offline  
Old   #8
failing on a final level
 
elite*gold: 45630
Join Date: Jun 2009
Posts: 28,549
Received Thanks: 24,650
Du musst nicht zwingend verschlüsseln, da der Reverser ja nicht sofort weiß, was Daten und was Code Instruktionen sind.
Er weiß vermutlich nichtmal, dass überhaupt Code ausgeführt wird und sucht gar nicht danach.

Du musst nichts interpretieren, du schreibst doch schon in C++, das ist doch so schön hardwarenahe, sei doch etwas kreativ :P

Code:
//grundlegendes prinzip:

char buffer[***];

//empfangen

__asm call buffer;

//oder:

FunktionsPtr = (FunktionsPtrTyp)buffer;
FunktionsPtr(arg1,arg2,...);
Eventuell musst du vorher den Buffer noch als PAGE_EXECUTE_READWRITE markieren, damit es keine Access Violation produziert.
MrSm!th is offline  
Old   #9
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,072
Received Thanks: 819
Quote:
Code:
//grundlegendes prinzip:

char buffer[***];

//empfangen

__asm call buffer;

//oder:

FunktionsPtr = (FunktionsPtrTyp)buffer;
FunktionsPtr(arg1,arg2,...);
Das ist ja genial :P Mal gucken ob es funktioniert.
.Infinite is offline  
Old   #10
 
elite*gold: 1
Join Date: Mar 2011
Posts: 828
Received Thanks: 1,395
Es gibt noch eine einfachere Methode, die auch ohne Server auskommt. Und zwar generierst du für jeden Kunden eine individuelle EXE. Danach verschlüsselst du wichtige Teile des Codes mit einem sicheren Algorithmus, wie z.b. RC5 oder AES. Als Encryption Key benutzt du die HWID des Kunden.

Beim Start des Programms, wird jetzt die aktuelle HWID ausgelesen und die vorher verschlüsselten Codestellen im Speicher wieder decrypted.
Stimmte die HWID überein, ist das Programm nun lauffähig. War die HWID falsch, so wurden die Codeteile falsch entschlüsselt und das Programm crasht.
Den Crash kann man noch verhindern, indem man die decrypteten Codestellen mit einer vorher in der EXE gespeicherten Prüfsumme vergleicht.

Wie bei allen Schutzmechanismen, die auf diesem Prinzip basieren, also sowohl meine Methode, als auch das Code Streaming, kann die Anwendung aber sehr einfach von einem legitimen Kunden geleaked werden, da dieser ja logischerweise vollen Zugriff auf alle Codeteile besitzt.
Saedelaere* is offline  
Old   #11
failing on a final level
 
elite*gold: 45630
Join Date: Jun 2009
Posts: 28,549
Received Thanks: 24,650
Dein System ist aber nicht besonders praktikabel, man kann nicht für jeden eine EXE generieren. Sinnvoller ist es, das Programm mit einem Key zu verschlüsseln, welcher aus einer validen Serial berechnet werden kann, die wiederum abhängig von der HWID ist.
MrSm!th is offline  
Old   #12
 
elite*gold: 1
Join Date: Mar 2011
Posts: 828
Received Thanks: 1,395
Hatte mir mal ein Script geschrieben, mit dem man individuelle EXEn generieren konnte. Das konnte man dann ganz komfortabel auf nem Webserver laufen lassen.

Aber da der Aufwand zum Protecten bekanntlich nicht höher sein soll, als der Programmieraufwand für das Tool selbst, nimmt man am besten eh fertige Lösungen, wie Themida oder VMProtect.
Sowas kombiniert mit dem von dir vorgeschlagenen Code Streaming sollte schon ziemlich sicher sein.
Saedelaere* is offline  
Old   #13
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,194
Received Thanks: 718
Quote:
Originally Posted by MrSm!th View Post
Code:
//grundlegendes prinzip:

char buffer[***];

//empfangen

__asm call buffer;

//oder:

FunktionsPtr = (FunktionsPtrTyp)buffer;
FunktionsPtr(arg1,arg2,...);
das war was ich mit meiner ersten methode meinte, gegen die meisten 'reverser' reichen einige der antidebugging methoden aus meiner pdf und damit sich leute dafür richtig interessieren, musst du schon was größeres machen^^
Dr. Coxxy is offline  
Old   #14
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,072
Received Thanks: 819
Hmm, was mache ich falsch?

Code:
        typedef void (*pointer_to_function)();

	char* buffer= new char[255];
	VirtualAlloc(buffer, sizeof(buffer), MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	sprintf(buffer, "std::cout << \"test\";");
	
	pointer_to_function fptr;
	fptr = (pointer_to_function)buffer;
	fptr();
.Infinite is offline  
Old   #15
failing on a final level
 
elite*gold: 45630
Join Date: Jun 2009
Posts: 28,549
Received Thanks: 24,650
Quote:
Originally Posted by .Infinite View Post
Hmm, was mache ich falsch?

Code:
        typedef void (*pointer_to_function)();

	char* buffer= new char[255];
	VirtualAlloc(buffer, sizeof(buffer), MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	sprintf(buffer, "std::cout << \"test\";");
	
	pointer_to_function fptr;
	fptr = (pointer_to_function)buffer;
	fptr();
Wtf? Verarschst du mich? Du weißt doch, dass C++ eine native Sprache ist.
Du kannst doch keinen Quelltext direkt ausführen o.O
Du musst kompilierten Code senden.
Und Funktionsaufrufe klappen selbstverständlich nicht, da die Adressen der Funktionen ja im lokalen RAM völlig anders sind.

Testweise könntest du folgendes kompilieren und streamen:
Code:
int func(int a, int b)
{
return a+b;
}
Solltest du die Funktion komplett senden (samt Stackframe etc. natürlich; für den Anfang kannst du ja einfach die Bytes des kompilierten Codes aus Olly kopieren und in ein Byte Array einfügen) dann solltest du in deinem lokalen Programm bei
Code:
//reihenfolge hängt natürlich von der calling convention ab;
//ich denke mal es ist hier __cdecl
__asm push a; // a=1
__asm push b; // b=2
__asm call buffer;
//jetzt mal ohne die funcptr variante
3 herausbekommen.
Musst natürlich im Falle von inline ASM den return Wert manuell aus eax auslesen.

Quote:
Originally Posted by Saedelaere* View Post
Hatte mir mal ein Script geschrieben, mit dem man individuelle EXEn generieren konnte. Das konnte man dann ganz komfortabel auf nem Webserver laufen lassen.

Aber da der Aufwand zum Protecten bekanntlich nicht höher sein soll, als der Programmieraufwand für das Tool selbst, nimmt man am besten eh fertige Lösungen, wie Themida oder VMProtect.
Sowas kombiniert mit dem von dir vorgeschlagenen Code Streaming sollte schon ziemlich sicher sein.
Naja, ich halte es trotzdem für sinnvoll, wenn nicht jeder Kunde eine individuelle Exe anfragen muss, vor allem bei größeren Projekten, aber das ist wohl teilweise auch Geschmackssache.
Es auch nicht besonders schwer, zu implementieren, dass sich eine Exe für alle mit allen validen HWIDs entschlüsseln lässt.
Am besten ist natürlich noch, wenn man regelmäßig die Abhängigkeit von HWID zu Key ändert und die neue dann vom Server empfängt (nur bei korrekter Registration) und so die Leaking-Gefahr verringert.
Aber zumindest eine Serial würdest du auch ohne das regelmäßige Ändern verkaufen


MrSm!th is offline  
Thanks
1 User
Reply



« Previous Thread | Next Thread »

Similar Threads
HWID System für Entwickler
Einigen ist es sicher schon aufgefallen - auf dem Profil gibt es ein neues Feld mit der Beschriftung "Hardware ID". Hier möchte ich euch mal...
228 Replies - e*pvp News - DE
[C++] HWID System Dll
Ich versuche schon seit einigen Tagen das HWID System in einer Dll zu benutzen. Da die Beispiele im offiziellen Thread down sind, habe ich nach...
7 Replies - C/C++
HWID Generator & Dev-Tools für e*pvp's HWID System
Hier die Downloads passend zum News-Thread, da das Attachen von Daten an News-Threads nicht möglich ist ;) News-Thread:...
0 Replies - Main



All times are GMT +1. The time now is 16:25.


Powered by vBulletin®
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Abuse
Copyright ©2017 elitepvpers All Rights Reserved.