theory:reverse_engineering

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

theory:reverse_engineering

Beitrag von cloidnerux » Di Aug 09, 2011 10:08 am

Nachdem jeztzt der Wettbewerb vorbei ist, ist der Artikel natürlich für alle freigegeben zum Editieren:
http://www.proggen.org/doku.php?id=theo ... ngineering

Wie schon in den Bewertungen zu lesen, fehlt vielen eben das "Reverse Engineering" in Bezug auf Programme und ich würde gerne auch etwas darüber schreiben, ich weiß nur noch nicht wie.

Das Problem ist nicht, das ich nichts darüber weiß, sondern das es dafür fast keine kostenlose Helferlein gibt und man sich mit sehr viel Assembler beschäftigen muss.
Das würde ich aber gerne mit etwas praktischem verbinden und da fällt mir so konkret nur das Umgehen eines Kopierschutzes bzw Lizenssystems ein und das halte ich nicht für sinnvoll.
Daher würde ich mich über jede Idee freuen .

Es wurde auch Wireshark erwähnt. Ich halte es zwar auch für wichtig, aber eben erst wenn man wirklich Analysieren will, welches Programm welche Daten sendet, was ich in der Praxis entweder mit Trojaner-Suche oder Cracking verbinde.
Daher würde ich mich auch hier über Anregungen freuen.

Edit: Auch würde es mich Interessieren, was ihr mit "Reverse Engineering" verbindet und worüber ihr etwas mehr erfahren würdet, sodass wir das mit einfließen lassen können.

MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: theory:reverse_engineering

Beitrag von Xin » Di Aug 09, 2011 10:38 am

cloidnerux hat geschrieben:Wie schon in den Bewertungen zu lesen, fehlt vielen eben das "Reverse Engineering" in Bezug auf Programme und ich würde gerne auch etwas darüber schreiben, ich weiß nur noch nicht wie.
Sagen wir mal so... Du hast Dir eigentlich ein Thema ausgesucht, dass man eigentlich kaum beschreiben kann, denn es gibt eben kein "Tutorial", keinen Handlungsablauf, wie man Reverse Engineering betreibt. Im Prinzip ist "Reverse Engineering" ein Buzz-Wort für "Educated Guess".
Ein solcher Artikel kann also keinen Weg vorgeben, sondern nur für Möglichkeiten sensiblisieren.

Du kannst eigentlich nur Hinweise geben, was Dir mit "PK" für Zipdateien auch gelungen ist. Für Dateien kannst Du also allgemeingültiger beschreiben, dass es nicht ungewöhnlich ist, dass sich das eine Dateiformat in einem Archiv eines anderen Dateiformates versteckt.

Wenn Du einen Weg beschreiben möchtest, dann würde ich Dir als Beispiel das BMP-Format anraten. Schaumal, ob Du einen Hex-Diff findest. Speichere dann die kleinste BMP-Datei (1x1Pixel) in Schwarz/Weiß, einmal mit einem schwarzen Pixel, einmal mit einem Weißen und Diffe damit a) Die Information, wo der Pixel gespeichert wird und wie. Anschließend machst Du eine 2x1 Pixel große Datei. Diffe dann in welcher Reihenfolge die Pixel gespeichert werden und im Vergleich zu der 1x1 Pixel großen Datei, wo Du die Breite des Bildes herausfinden kannst. Die Höhe des Bildes findest Du, wenn Du eine Datei mit 1x2 Pixel größe Diffst. Anschließend nimmst Du 4 statt 2 Farben und betrachtest, wie sich die Datei verändert und welche Rückschlüsse Du daraus ziehen kannst.

Ich habe von einem "Hello World" in ELF noch ein vier Seiten-Hex-Printout, das ich mit reichlich Text-Markern bunt gemalt habe, je nachdem wie ich die Zahlen verstanden habe, was ich davon als Assemblertext verstehe und wie statische Werte, z.b. der Text "Hallo Welt", abgelegt werden und was davon das Inhaltsverzeichnis bzw. die einzelnen Einträge darstellt usw. usw. usw.

Das verstehe ich unter Reverse Engineering von Daten.
cloidnerux hat geschrieben:Das Problem ist nicht, das ich nichts darüber weiß, sondern das es dafür fast keine kostenlose Helferlein gibt und man sich mit sehr viel Assembler beschäftigen muss.
Wenn Du Algorithmen zurückverfolgen willst.

Wer ein .NET Programm veröffentlicht, gibt seine Quellcodes in der Regel mit raus. Du könntest hier den C-Sharper vorstellen, welcher Dir von einer .NET-DLL den Quelltext in Klartext ausspuckt.

Wir haben so mal einen Bug in .NET selbst verfolgt.
cloidnerux hat geschrieben:Das würde ich aber gerne mit etwas praktischem verbinden und da fällt mir so konkret nur das Umgehen eines Kopierschutzes bzw Lizenssystems ein und das halte ich nicht für sinnvoll.
Daher würde ich mich über jede Idee freuen .
Die Umgehung eines Kopierschutzes zu beschreiben... da würde ich den Artikel gerne vorher lesen, bevor er veröffentlicht wird. ;-D
cloidnerux hat geschrieben:Es wurde auch Wireshark erwähnt. Ich halte es zwar auch für wichtig, aber eben erst wenn man wirklich Analysieren will, welches Programm welche Daten sendet, was ich in der Praxis entweder mit Trojaner-Suche oder Cracking verbinde.
Ich habe WireShark auch mal im Job benutzt. Die Diskussion war, ob der neue Passwort-Schutz auch wirklich Schutz vor Eindringlingen bietet. Ich habe das einfach mal bei dem Entwickler in Frage gestellt, ob er sich sicher wäre, dass die Passwörter sicher übertragen werden.
Mit Wireshark habe ich dann zwei, drei Monate Entwicklung ad absurdum geführt, weil die Passwörter in Klartext übertragen wurden.
Ja, es gibt Passwörter, die vor unberechtigtem Zugriff schützen, aber man darf sie nicht benutzen, weil sie sonst jeder kennen könnte.

Cracken funktioniert immer in zwei Richtungen: Wenn ich Progtall aufsetze, dann habe ich einen selbstgeschriebenen Webserver im Internet stehen. Sobald der läuft, werde ich alles daran setzen, ihn kaputt zu machen, ich werde versuchen ihn zu cracken und jeden von Euch bitten, den Server mit absurden Anfragen zu bombardieren und außer Gefecht zu setzen oder sogar zu Handlungen zu animieren, wie Code auszuführen.
Und wenn wir es nicht schaffen, dann werde ich hoffen, dass andere es auch nicht schaffen.

Selbst der Testserver, der unter einer Subdomain von proggen.org läuft und im Internet namentlich quasi gar nicht auftaucht, steht unter durchgehenden Attacken (witzigerweise sogar mehr als der eigentliche proggen.org-Server).

Der Versuch zu Cracken ist damit auch ein Teil der Qualitätssicherung. Das Umgehen eines Kopierschutzes zu üben, kann auch bedeuten, sich in die Lage zu versetzen, andere an der Umgehung eines Kopierschutzes zu hindern.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: theory:reverse_engineering

Beitrag von cloidnerux » Di Aug 09, 2011 5:13 pm

Sagen wir mal so... Du hast Dir eigentlich ein Thema ausgesucht, dass man eigentlich kaum beschreiben kann, denn es gibt eben kein "Tutorial", keinen Handlungsablauf, wie man Reverse Engineering betreibt. Im Prinzip ist "Reverse Engineering" ein Buzz-Wort für "Educated Guess".
Ein solcher Artikel kann also keinen Weg vorgeben, sondern nur für Möglichkeiten sensiblisieren.
Deswegen habe ich es auch nicht als Tutorial gestalten wollen.
Ich habe mich selbst aber auch nicht einigen können, wie ich es Präsentieren will.
Wenn Du einen Weg beschreiben möchtest, dann würde ich Dir als Beispiel das BMP-Format anraten. Schaumal, ob Du einen Hex-Diff findest. Speichere dann die kleinste BMP-Datei (1x1Pixel) in Schwarz/Weiß, einmal mit einem schwarzen Pixel, einmal mit einem Weißen und Diffe damit a) Die Information, wo der Pixel gespeichert wird und wie. Anschließend machst Du eine 2x1 Pixel große Datei. Diffe dann in welcher Reihenfolge die Pixel gespeichert werden und im Vergleich zu der 1x1 Pixel großen Datei, wo Du die Breite des Bildes herausfinden kannst. Die Höhe des Bildes findest Du, wenn Du eine Datei mit 1x2 Pixel größe Diffst. Anschließend nimmst Du 4 statt 2 Farben und betrachtest, wie sich die Datei verändert und welche Rückschlüsse Du daraus ziehen kannst.
Danke für das beispiel, ich werde das mal irgendwie verwenden.
Wenn Du Algorithmen zurückverfolgen willst.

Wer ein .NET Programm veröffentlicht, gibt seine Quellcodes in der Regel mit raus. Du könntest hier den C-Sharper vorstellen, welcher Dir von einer .NET-DLL den Quelltext in Klartext ausspuckt.

Wir haben so mal einen Bug in .NET selbst verfolgt.
Das stimmt so nicht ganz, es gibt auch Möglichkeiten Quellcode vor solchen tools zu "verstecken", was ich selbst schon gesehen habe.

Ich habe mich mal selbst mit dem ILasm Code eines Programms beschäftigt und es stimmt schon, das es bei .NET Sprachen ziemlich einfach ist, aber es gibt mehr Programme die nicht als .NET ausgeliefert werden.

Und es gibt mehr Tools als nur den C-Sharper, z.B den .NET Reflector, ildasm, diverse Speicher-Analysing Tools und Disassembler.
Die Umgehung eines Kopierschutzes zu beschreiben... da würde ich den Artikel gerne vorher lesen, bevor er veröffentlicht wird. ;-D
Hier habe ich mich wohl etwas falsch ausgedrückt, obwohl es sowas auch gibt, je nach dem wie der Kopierschutz ausgelegt ist, wie z.B bei DVDs, die egt nur mit einem Programm gelesen werden könnten, die sich einen Schlüssel dafür leisten können, oder VLC mit der libdvdcss, womit man den Kopierschutz umgeht.

Gemeint habe ich Schutzmechanismen gegen Software Piraterie, sprich Lizenssysteme und alles was dazugehört.
Ich habe WireShark auch mal im Job benutzt. Die Diskussion war, ob der neue Passwort-Schutz auch wirklich Schutz vor Eindringlingen bietet. Ich habe das einfach mal bei dem Entwickler in Frage gestellt, ob er sich sicher wäre, dass die Passwörter sicher übertragen werden.
Mit Wireshark habe ich dann zwei, drei Monate Entwicklung ad absurdum geführt, weil die Passwörter in Klartext übertragen wurden.
Ja, es gibt Passwörter, die vor unberechtigtem Zugriff schützen, aber man darf sie nicht benutzen, weil sie sonst jeder kennen könnte.
Man kann das ja mal einbauen.
Cracken funktioniert immer in zwei Richtungen: Wenn ich Progtall aufsetze, dann habe ich einen selbstgeschriebenen Webserver im Internet stehen. Sobald der läuft, werde ich alles daran setzen, ihn kaputt zu machen, ich werde versuchen ihn zu cracken und jeden von Euch bitten, den Server mit absurden Anfragen zu bombardieren und außer Gefecht zu setzen oder sogar zu Handlungen zu animieren, wie Code auszuführen.
Und wenn wir es nicht schaffen, dann werde ich hoffen, dass andere es auch nicht schaffen.
Aber es gibt immer noch die andere Richtung, das Menschen das Wissen Missbrauchen um Schaden anzurichten und das will ich egt nicht liefern. Vor allem habe ich keine lust auf "Scriptkiddis", weil eben diese einfach nur die Programme verwenden um schaden anzurichten, ohne sich Gedanken darüber zu machen was sie gerade egt tun.
Und ich habe genug von denen erlebt, wie du und wahrscheinlich jeder hier im Forum auch.
Dann wird eine Endlosschleife in einem Batchscript dazu genutzt per "net send" jedem PC im Netzwerk eine Nachricht zu senden, dauerhaft. Denen möchte ich nicht den Weg ebnen...

MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: theory:reverse_engineering

Beitrag von Xin » Di Aug 09, 2011 5:35 pm

cloidnerux hat geschrieben:Aber es gibt immer noch die andere Richtung, das Menschen das Wissen Missbrauchen um Schaden anzurichten und das will ich egt nicht liefern. Vor allem habe ich keine lust auf "Scriptkiddis", weil eben diese einfach nur die Programme verwenden um schaden anzurichten, ohne sich Gedanken darüber zu machen was sie gerade egt tun.
Ein Skriptkiddie kann einen Hex-Editor nicht bedienen. Das widerspricht sich einfach. Wer mehr als ein Skriptkiddie sein will, wird die Information, was ein Hexeditor ist auch so herausfinden.
cloidnerux hat geschrieben:Und ich habe genug von denen erlebt, wie du und wahrscheinlich jeder hier im Forum auch.
Dann wird eine Endlosschleife in einem Batchscript dazu genutzt per "net send" jedem PC im Netzwerk eine Nachricht zu senden, dauerhaft. Denen möchte ich nicht den Weg ebnen...
Und was willst Du dagegen tun?
Möchtest Du jetzt die Zeichenkette ":(){ : | :& };:" verbieten lassen?

Die Zeichenkette steht auf proggen.org nicht beschrieben, sie zu finden war allerdings überhaupt kein Problem. Ich gehe davon aus, dass Dir die Fork-Bombe bekannt ist und dass das ein größeres Problem als nur eine nervige Schleife ist, die man einfach so killen kann.

Informationen zu verstecken bedeutet nicht, dass Informationen unauffindbar sind. Das ist das gleiche wie mit OpenSource - proprietäre Software versteckt die Quellen, wird aber trotzdem gecrackt. Verstecken bringt nichts.

Im Gesetz gibt es die Unterscheidung zwischen Messern als Waffe und als Werkzeug. Menschen wurden schon mit Brieföffnern erstochen und mit Briefbeschweren erschlagen.
Alles, was man als Softwareentwickler entwickelt kann man notfalls ausdrucken und das jemanden an den Kopf knallen.

Wir können hier Werkzeuge anbieten, aber Missbrauch findet immer statt.
Wenn Du Missbrauch verhindern möchtest, musst Du die Menschen abschaffen, dann ist alles sicher. Solange wir das nicht tun, können wir von Missbrauch nur abraten und dafür Möglichkeiten anbieten, Energien positiv und konstruktiv zu nutzen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kaestchen
Beiträge: 24
Registriert: So Jul 31, 2011 7:17 pm
Wohnort: Ruhrgebiet

Re: theory:reverse_engineering

Beitrag von Kaestchen » Di Aug 09, 2011 9:53 pm

Moin.

Ich denke auch, dass die Hilfestellung solche Programme wie Bochs oder IDA zu verstehen, nicht per se zu Missbrauch führen wird, da es immernoch zu anstrengend sein dürfte (für das "SkripttKid"), das Wissen in etwas Negatives umzusetzen.

Außerdem lernt man reEngineering am Anfang, in dem man sich sein eigenes Geschwurbel anschaut. Was wiederum zur Verbesserung der eigenen Fähigkeiten führt. :ugeek:

Ich stelle mich als interessierter DAU für TutorialExperimente zur Verfügung. ;)


PS: diese FurchenTrulla kannte ich noch gar nicht, es gibt aber einen ausführlichen mit CodeSchnipseln ausgestatteten WikipediaArtikel dazu.
Um eine sinnvolle Frage stellen zu können, muss man die Ausmaße seines Unwissens kennen.

Antworten