Dekompilierung + Strings
lima-city → Forum → Programmiersprachen → C/C++ und D
addieren
anweisung
array
code
datei
datenbank
datum
editor
eingegebene passwort
http
methode
paar
problem
programm
sagen
schutz
server
string
tun
url
-
Hey,
ich habe da mal ne Frage.
Wenn man etwas dekompiliert dann kann man ja alle strings klar lesen, aber was tun wenn ich im quellcode ein Passwort und Usernamen verwende. Dann ist so eine Datenbank ja schnell offen für alle^^ ..oder sehe ich das falsch?
was kann man da gegen tun?
(außer keine DB verwenden xD) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das ist richtig. Mit dem UNIX-Tool strings kann man somit leicht passwörter in ausführbaren Dateien finden.
Es gibt kein Verfahren, mit dem man im Programm hartcodierte Passwörter wirklich 100%ig sicher schützen kann. Das sieht man ja auch an den verschiedenen DRM-Kopierschutzen. Diese werden auch alle früher oder später geknackt. -
Ja. Was denkst du warum so viele Leute ein Adobe Photoshop haben? Sicherlich nicht, weil man ihre Lizenzschlüssel nicht selbst generieren kann :D
Das effektivste was du machen kannst, ist das Passwort in verschlüsselter Form zu halten und es anschließend zu entschlüsseln, obwohl man es dann dennoch irgendwo im Klartext lesen kann (RAM) oder den Verschlüsselungsalgorithmus nachstellen kann.
Brauchst du überhaupt solch eine Sicherheit? Keine Ottonormalanwender wird sich 'nen Hex-Editor schnappen und in deinem Code nach PWs suchen... -
nikic schrieb:
Brauchst du überhaupt solch eine Sicherheit? Keine Ottonormalanwender wird sich 'nen Hex-Editor schnappen und in deinem Code nach PWs suchen...
natürlich nicht, aber man lernt ja nie aus xD außerdem sicher ist sicher und schaden kanns auch nicht =)
Beitrag zuletzt geändert: 12.12.2009 11:26:59 von myhead -
Habe erst kürzlich dieses Problem lösen müssen und ich habe es einfach mit Base64 verschlüsselt, so eingetragen und während der Verwendung der Strings, wird der Base64-Code dann Ad-Hoc entschlüsselt, bevor er daraufhin sofort verwendet wird. In der *.exe-Datei habe ich die Base64-Codes natürlich wiedergefunden, allerdings muss man diese auch erstmal erkennen, wenn man den entschlüsselten Code nicht kennt. Wenn du allerdings einen Profi hast, der wird nicht lange brauchen, auch nicht wenn du einen komplett eigenen Algorithmus schreibst, daher ist Base64 ein ganz guter Kompromiss.
Liebe Grüße
- VampireSilence -
Hi,
eine vielleicht nicht ganz so kompliziert zu implementierende Variante, die ich auch nutze, ist, den "Passwortstring" zu haben, und darauf einen anderen zu addieren (jetzt nicht mit += oder sowas).
Das sieht etwa so aus:
A N D E R E R S T R I N G A N D E....
D E R P A S S W O R T S T R I N G...
Du addierst einfach die ascii-werte, und schon ist es relativ sicher. Das ganze nochmal mit base64-codiert, und so einfach wird das passwort nicht gefunden.
Hoffe es hilft dir. -
Dabei sei allerdings gesagt, dass sich Base64-Strings mit blossem Auge schon sehr leicht identifizieren lassen. Deine erste Variante ist kryptisch zwar nicht sehr stark, dafür allerdings wesentlich schwerer erkennbar. Damit will ich sagen, wenn du schon sowas programmierst, dann belass es bei der ersten Variante, da sie die Strings wesentlich weiter in die Unkenntlichkeit zieht, als Base64.
Dadurch ist ohne Base64 ein besserer Schutz gegeben, als mit Base64.
Liebe Grüße
- VampireSilence -
Ich sage dazu mal: Obfuscator. Passwort-Speicherungen lassen sich allerdings recht schwierig gestalten. Eine möglichkeit, die in der Webentwicklung oft verwendet wird ist die Einwegverschlüsselung. So wird vom Passwort praktisch nur der HASH-Wert gespeichert. Bei der Eingabe wird das eingegebene Passwort gehashed und mit dem Hash des "gespeicherten" Passworts verglichen.
Es gibt verschiedene Varianten der Einwegverschlüsselung. Dort gibt es dann ggf. nur noch Rainbow-Tables, um dahinter zu kommen.
-
myhead schrieb:
was kann man da gegen tun?
Ich weiß nicht was für ein Programm du schreiben möchtest, aber in der Regel löst man das so, dass man einmal ein Serverprogramm hat und auf dem Anwenderrechner einen Client. Auf dem Server befindet sich die Datenbank und über den Client logt man sich ein, die Daten werden dann über das Serverprogramm zum Client gesendet und andersrum. Der Client hat somit keinen direkten Zugriff auf die Datenbank sondern nur das Serverprogramm. -
nerdinator schrieb:
Ich sage dazu mal: Obfuscator. Passwort-Speicherungen lassen sich allerdings recht schwierig gestalten. Eine möglichkeit, die in der Webentwicklung oft verwendet wird ist die Einwegverschlüsselung. So wird vom Passwort praktisch nur der HASH-Wert gespeichert. Bei der Eingabe wird das eingegebene Passwort gehashed und mit dem Hash des "gespeicherten" Passworts verglichen.
Das macht aber nicht viel Sinn, denn damit schützt du ja nichts. Man bekommt zwar das "echte" Passwort nicht heraus, jedoch benötigt man dieses auch garnicht mehr, wenn der Server sowieso nur den Hash vergleicht. Und wenn dieser Hash dann offen im Programmcode liegt, isses genau so unzweckmäßig. Du müsstest also den Hash chiffrieren und wenn du das tust, brauchst du das Passwort auch garnicht erst hashen.
Liebe Grüße
- VampireSilence -
Hi,
einen "Schutz" gegen das Decompilieren und somit auch gegen das einfache PW Auslesen bietet auch das Komprimieren der ausführbaren Binärdatei. Natürlich auch nur eine kleine Hürde aber relativ leicht anzuwenden und somit vielleicht in Kombination mit anderen Maßnahmen auch für deine Zwecke sinnvoll. Zumindest der HEX Editor und Strings tun sich dann sehr schwer ;).
Verbreitet ist UPX http://de.wikipedia.org/wiki/UPX und bietet entsprechend auch wenig Schutz, da es in den "bösen" Tools evtl. schon eingebaut ist.
Sofern du auf Windows arbeitest gibt es auch ein paar Exoten http://de.wikipedia.org/wiki/Kompression_ausf%C3%BChrbarer_Programmdateien die dann nicht jeder Debugger sofort erkennt.
Gruß
Manni -
Hallo,
Mal ein paar Gedanken zur Thematik:
also ich habe gestern mal ein Programm geschrieben, das alle "Lesbaren" Strings aus einer Ausführbaren Datei ausließt - das ist erstaunlich, was dabei herauskommt. Bei Delphi sind z.B. alle Klassennamen noch auszulesen, bei Qt alles über Signal-Slot-Verbindungen sowie alle Klassen und Methoden, die das Programm verwendet. Auch Passwörter sind kein Problem. Das einzige, was da hilft, ist eine einfache Verschlüsselung. Aber was bringt die, wenn man mit Programmen wie Wireshark den Netzwerkverkehr überwacht und da das Passwort rausfischt? (OK, wird mit SSL schwierig...) Dann sendet man das Passwort selbstmit einem eigenen Request - und dann hat man es auch.
Deshalb würde ich, wenn man sich zum Beispiel in den Benutzer um eine eigene Identifikation bitten. Diese wird vom Server überprüft und die Daten zurückgesandt. Aber auch das ist angreifbar.
Gruß, Tillorgias -
...also danke schon mal für die ganzen Antworten...jetzt bin ich auch etwas erleichtert, hab schon die ganze Zeit über verschiedene Theorien und Methoden nachgedacht und keine von denen war nahezu 100% sicher xD
also ist das ein algemeines Problem in der Programmierung...gut zu wissen xD
wenn jemand noch weitere Vorschläge/Ideen hat, nur raus damit^^ -
Wie schon gesagt : Code Obfuscation.
Äquivalente Formeln und konstante Transformationen
Beispielsweise kann man einem Register die Zahl 10 addieren oder, was auf dasselbe hinausläuft, 15 addieren und 5 subtrahieren.
Umordnung von Anweisungen
Die Reihenfolge, in der Programmanweisungen ausgeführt werden, kann manchmal umgeordnet werden, ohne das Programm zu beeinflussen.
Variablensubstitution
Einfaches Umbenennen von Variablennamen wie „Rechnungsbetrag“ oder „Adresse“ auf generierte Namen wie „ax7zhgr“.
Bedingte Anweisungen und Sprünge
Dazu gehören auch überflüssige Vergleiche, die stets wahr bzw. falsch ergeben, Links oder Pointer.
Aufruf von Subroutinen
Jede einzelne Anweisung kann auch durch eine Subroutine ersetzt werden.
Einfügen von Leercode
In die Folge der Anweisungen wird hierbei überflüssiger Code eingefügt, der nichts zum Programm beiträgt und lediglich triviale oder irrelevante Berechnungen ausführt.
Verschlüsselung
Verschlüsselung ist besonders für die Tarnung von einzelnen Bytes oder Strings wie im Code hardcodiert abgelegte Passwörter geeignet.
Mischen von Funktionen
Die Anweisungen zweier Funktionen können alternierend geschrieben werden. Dadurch verschwimmen die Grenzen zwischen den Funktionen.
Spalten von Variablen
(Umstrukturierung von Arrays)
1.) ein eindimensionales Array kann in mehrere eindimensionale Arrays gespalten werden
2.) ein eindimensionales Array kann in ein mehrdimensionales Array ausgeweitet werden
3.) ein mehrdimensionales Array kann in ein eindimensionales Array geschrumpft werden
4.) zwei oder mehrere eindimensionale Arrays können zu einem eindimensionalen Array zusammengeführt werden.
Anti Debugs
Routinen, die auf die Erkennung und die frühzeitige Terminierung eines Programmes bei der Erkennung eines Debuggers abzielen. Dazu scannen sie beispielsweise den Speicher nach Suchstrings diverser Debugger.
(Quelle: Wikipedia)
tillogias schrieb:
Ich denke es geht prinzipiell nicht darum, Passwörter über das Netz zu übertragen. Aber für den Fall gibt es relativ sichere Methoden, wie beispielsweise Salz-Werte usw.
Aber was bringt die, wenn man mit Programmen wie Wireshark den Netzwerkverkehr überwacht und da das Passwort rausfischt? (OK, wird mit SSL schwierig...) Dann sendet man das Passwort selbstmit einem eigenen Request - und dann hat man es auch.
tillogias schrieb:
Du brauchst sogar zwingend das Passwort, denn es geht soweit ich das verstanden habe nicht darum, Daten an einen Server zu senden, sondern schlicht in einem Programm selbst unlesbar zu "verstecken". Für Web-Varianten gibt es andere Lösungen.
Das macht aber nicht viel Sinn, denn damit schützt du ja nichts. Man bekommt zwar das "echte" Passwort nicht heraus, jedoch benötigt man dieses auch garnicht mehr, wenn der Server sowieso nur den Hash vergleicht. Und wenn dieser Hash dann offen im Programmcode liegt, isses genau so unzweckmäßig. Du müsstest also den Hash chiffrieren und wenn du das tust, brauchst du das Passwort auch garnicht erst hashen.
Solange du nur den Hash hast, kannst du das Passwort nicht zurück rechnen. Das Programm "Hashed" jetzt nur noch das eingegebene Passwort und überprüft es mit dem gespeicherten Hash. Nun könnte man die Datei "umschreiben", was aber mit der Code Obfucation schwierig wird. Weiterhin erschwert die bereits genannte Methode der Komprimierung dann auch noch das "auffinden" des Hashes. In Kombination ist das am Ende doch recht sicher. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage