Autor |
Beitrag |
DarkPhenix
Hält's aus hier
Beiträge: 10
WIN XP, WIN Vista
Delphi 7, Delphi 2009, JBuilder 2008, Visual Studio 2008, C++ Builder 2009
|
Verfasst: So 21.12.08 15:57
Hallo,
ich hab in meiner Facharbeit über Steganographie einen Text in ein BMP File gespeichert. Dazu musste ich den Text in Binärcode umwandeln und dann im Bild das LSB (Least significant bit) dementsrechend 8 Mal ändern pro Buchstabe (1 Buchstabe = 8 bit).
Funktioniert alles super und hab auch 15 Punkte für die Facharbeit bekommen, aber jetzt würd mich interessieren wie ich eine x-beliebige Datei in Binärcode umwandel.
Also zum Beispiel eine *.jpg oder *.exe lade und dann in Memo1 den Binärcode ausgebe. Ich hab Google und die Forensuche benutzt, aber noch nichts hilfreiches gefunden.
Wäre nett wenn ihr mir ein bisschen helfen könnt, evtl. mit Beispielcodes oder Links o.ä.  Englisches Material wäre auch kein Problem. Vllt habt ihr ja auch Empfehlungen für Fachbücher, wäre super wenn ihr die dann postet.
Grüße
DarkPhenix
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: So 21.12.08 16:18
DarkPhenix hat folgendes geschrieben : | Hallo,
ich hab in meiner Facharbeit über Steganographie einen Text in ein BMP File gespeichert. ... |
Hallo,
deine Methode (eigentlich gibt es keine andere) funktioniert nur bei Bilddaten, in der Annahme, dass eine Farbveränderung um 1/256 nicht auffällt (was auch nur sehr begrenzt stimmt).
Du musst dich daher über den Aufbau der verwendeten Dateien informieren, indem du z.B. danach googelst. Ganz allgemein bestehen Dateien aus Headerdaten wie Version, Datum usw. und Verwaltungsdaten, z.B. Tabellen, welcher Abschnitt wo anfängt, und den Nutz-, in dem Fall Bilddaten.
Klar, dass du Header und Tabellen nicht verändern darfst, das macht die Datei i.d.R. unlesbar. Komprimierte Daten darfst du ebenfalls so nicht ändern, du kannst sie nur dekomprimieren, deine Bits einbauen und sie wieder komprimieren.
Andere als Bilddateien sind kaum verwendbar: ein ASCII-Text würde völlig verstümmelt und wäre also sehr auffällig, bei EXE-Dateien handelt es sich um Prozessorbefehle, die kannst du auch nicht um ein Bit ändern ohne das Programm zu zerstören.
Wenn du z.B. mit "jpeg format" googelst, findest du alles nötige, aber JPEG ist verglichen mit BMP schon recht komplex.
Gruss Reinhard
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 21.12.08 16:24
Ich glaube eher, dass die Frage damit zu tun hat, beliebige Dat(ei)en in Bitmaps verstecken zu können. Würde zumindest mehr Sinn machen.
Prinzipiell geht das genauso - denn ob Text oder andere Daten: Intern sind das alles Bits und Bytes. Eine Methode, an die Bytes (und damit auch an die Bits) beliebiger Dateien zu kommen, sind FileStreams. Damit kann man Dateien z.B. in ein Array of Byte einlesen, welches man dann einzeln abarbeiten kann. Genauso, wie du wahrscheinlich den String zeichenweise abgearbeitet hast.
_________________ We are, we were and will not be.
|
|
DarkPhenix 
Hält's aus hier
Beiträge: 10
WIN XP, WIN Vista
Delphi 7, Delphi 2009, JBuilder 2008, Visual Studio 2008, C++ Builder 2009
|
Verfasst: So 21.12.08 17:16
Ersma danke für die schnellen antworten
@Reinhard Kern:
Ich glaube du hast die Frage missverstanden, denn ich wollte den Binärcode einer Datei wieder in ein Bitmap packen. Vllt hab ich die Frage auch ungünstig formuliert. Was du geschrieben hast ist mir aber klar und ich wollt nur ergänzen, dass man zb in Musik Daten auch einzelne Bits ändern kann, ohne dass es groß auffällt. Darum kümmer ich mich dann, nachdem ich eine *.exe in einem Bitmap verschlüsselt habe
@Gausi:
Ich hab das jetzt mal porbiert, aber ich weiß jetzt nicht mehr weiter:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); var fs:TFileStream; Binary: Array of Byte; begin if Opendialog1.Execute then try fs:=TFileStream.Create(Opendialog1.FileName, fmOpenRead); setLength(Binary,fs.Size); finally fs.Free; end; end; |
Ich müsste jetzt in Binary die Bytes speichern, richtig? Wie lese ich sie denn nun aber aus?
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 21.12.08 17:28
Du hast schon fast alles.
Es fehlt nur noch fs.Read(Binary[0], fs.Size);, dann stehen die Daten aus der Datei in dem Array drin.
Und das zerlegst du dann Stück für Stück in die einzelnen Bits, wie du es vorher wahrscheinlich auch mit den einzelnen Buchstaben des Textes gemacht hast.
_________________ We are, we were and will not be.
|
|
DarkPhenix 
Hält's aus hier
Beiträge: 10
WIN XP, WIN Vista
Delphi 7, Delphi 2009, JBuilder 2008, Visual Studio 2008, C++ Builder 2009
|
Verfasst: So 21.12.08 18:00
Danke
Funktioniert alles einwandfrei! Den Rest macht meine Klasse KConvertToBinaer aus meiner Facharbeit^^
Ich danke euch vielmals!
Grüße
DarkPhenix
|
|
DarkPhenix 
Hält's aus hier
Beiträge: 10
WIN XP, WIN Vista
Delphi 7, Delphi 2009, JBuilder 2008, Visual Studio 2008, C++ Builder 2009
|
Verfasst: So 21.12.08 19:14
Sry für Doppelpost, aber mir ist grade was aufgefallen...
Das ganze ist UNENDLICH langsam. Ich habe eine 86.283 Bytes (84,2 kb) große Datei geöffnet und mit ner for Schleife in Binärcode umgewandelt. Also so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.Button1Click(Sender: TObject); var fs:TFileStream; Binary: Array of Byte; begin if Opendialog1.Execute then try fs:=TFileStream.Create(Opendialog1.FileName, fmOpenRead); setLength(Binary,fs.Size); fs.Read(Binary[0], fs.Size); for i:=0 to length(Binary) do begin s:=s+Binaer[Binary[i]]; end; Memo1.text:=s; finally fs.Free; end; end; |
Für obige Datei, brauch das Programm sage und schreibe 135.734 ms, also über 2 min! Jetzt such ich eine Möglichkeit die Zeit zu verkürzen, hoffe ihr wisst da was. Schön wäre schonmal wenn das Programm beide Cores meines CPU's nutzen würde, da mein CPU immer nur zu 50% ausgelastet ist.
Grüße
DarkPhenix
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 21.12.08 20:27
DarkPhenix hat folgendes geschrieben : | Schön wäre schonmal wenn das Programm beide Cores meines CPU's nutzen würde, da mein CPU immer nur zu 50% ausgelastet ist. |
Dazu müsstest du eine Möglichkeit finden, deinen Algorithmus sozusagen in zwei Algorithmen aufzuteilen die parallel laufen können, und unabhängig voneinander, dann kannst du ihn auf zwei THREADS verteilen.
Dein Array (Binaer) macht die ganze Sache vermutlich so langsam. Versuche mal, den mit char() zu ersetzen, das sollte das gleiche Ergebnis bringen.
Ausserdem sollte deine Schleife eine AV werfen, da du bis über den Array hinaus läufst. Setze für soetwas nicht Length sondern High ein: High gibt dir den Index des letzten Elements eines dynamischen Arrays zurück.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 21.12.08 20:31
Was die Sache so langsam werden lässt, ist mit 99%iger Wahrscheinlichkeit diese Zeile:
Delphi-Quelltext 1:
| s:=s + Binaer[Binary[i]]; |
Hier wird ein String sehr oft stückweise verlängert, was ein Umkopieren der Daten im Speicher erfordert. Macht man das ein paar tausendmal hintereinander, wird die zu kopierende Menge immer größer, und damit der Vorgang zeitaufwendiger. Der Zugriff auf das Array dürfte da kaum ins Gewicht fallen.
Warum willst du das denn überhaupt in einen String umwandeln? Das macht doch eigentlich gar keinen Sinn 
_________________ We are, we were and will not be.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 21.12.08 20:34
Vorallem das Anzeigen des Strings in einem Memo wird dir nicht viel Freude bereiten, wenn du eine Binärdatei öffnest, da das End of Text Zeichen vorkommen kann, ab da wird die Anzeige dann abgebrochen.
Gausi, wenn's das Verlängern ist, hilft dann nicht ein einmaliges SetLength auf den String vor der Schleife?
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 21.12.08 20:36
Dafür müsste man wissen, wie lang der String wird, und dann nicht mit "+" arbeiten, sondern per Zugriff auf die Zeichen. Ja, dann sollte das schneller gehen.
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 21.12.08 22:18
Man kann auch einfach vorher mehr Platz reservieren und dann am Ende auf die benötigte Länge verkürzen. Das geht immer noch schneller als zwischendrin die Größe zu verändern.
|
|
DarkPhenix 
Hält's aus hier
Beiträge: 10
WIN XP, WIN Vista
Delphi 7, Delphi 2009, JBuilder 2008, Visual Studio 2008, C++ Builder 2009
|
Verfasst: Mo 22.12.08 18:27
Ersmal danke euch allen
Also ich hab das jetzt so ausprobiert, dass ich den String auf eine Länge gestellt habe und danach dann immer einzeln zugwiesen habe:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure TForm1.BtOpenClick(Sender: TObject); var fs:TFileStream; Binary: Array of byte; i,k:integer; s:string; begin if ODDatei.Execute then try fs:=TFileStream.Create(ODDatei.FileName, fmOpenRead); setLength(Binary,fs.Size); fs.Read(Binary[0], fs.Size); k:=1; setLength(s,fs.Size*8+1); for i:=0 to high(Binary) do begin s[k]:=Binaer[Binary[i]][1]; inc(k); s[k]:=Binaer[Binary[i]][2]; inc(k); s[k]:=Binaer[Binary[i]][3]; inc(k); s[k]:=Binaer[Binary[i]][4]; inc(k); s[k]:=Binaer[Binary[i]][5]; inc(k); s[k]:=Binaer[Binary[i]][6]; inc(k); s[k]:=Binaer[Binary[i]][7]; inc(k); s[k]:=Binaer[Binary[i]][8]; inc(k); end; MBinaer.Text:=s; finally fs.Free; end; end; |
Jetzt bracuh das Programm "nur noch" 130735 ms, also 5sek weniger.
Als nächstes schau ich mir das mit den Threads an. Ich könnte doch einfach die Arbeit halbieren, also einen Thread so
Delphi-Quelltext 1: 2:
| for i:=0 to high(Binary) DIV 2 do |
und einen so
Delphi-Quelltext 1: 2:
| for i:=(high(Binary) DIV 2) +1 to high(Binary) do |
arbeiten lassen, oder?
Danke schonmal
Grüße
DarkPhenix
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 22.12.08 19:41
Ich würde überhaupt keinen String verwenden. Es geht dir doch nur darum, die einzelnen Bits zu benutzen um die in dem Bild einzubauen, dafür brauchst du aber keinen String. Wenn du direkt mit den Werten arbeiten würdest wäre das ganze x Mal schneller.
|
|
XUDO
      
Beiträge: 45
Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
|
Verfasst: Fr 26.12.08 11:41
DarkPhenix hat folgendes geschrieben : | Hallo,
wie ich eine x-beliebige Datei in Binärcode umwandel.
Also zum Beispiel eine *.jpg oder *.exe lade und dann in Memo1 den Binärcode ausgebe. |
Hallo DarkPhenix,
falls ich es richtig verstanden habe...
Vor vielen Jahren >> zu Zeiten von DOS-3 und Turbo-Pascal-3<< stand ich vor einem ähnlichen Problem und habe damals einen "Stereo"-Datei-Editor erstellt, der jedes Byte in den Code-Arten HEX / DEC / BIN anzeigt und Änderungen erlaubt.
Das Programm editiert ein bis zwei Dateien zu je max. 4 MB aus dem jeweils aktuellen Verzeichnis.
Nach dem Start wird zunächst das aktuelle Verzeichnis angezeigt und nach "irgendeiner Taste" das Eingabefeld für einen DOS-8.3-Dateinamen. Du mußt also ggf. die zu untersuchende Datei umbenennen, wobei es sowieso besser ist, mit einer Kopie zu arbeiten.
Nach der Eingabe des Dateinamens zeigt F1 ein Hilfefenster.
Das jeweils aktuelle Byte wird gelb, geänderte werden blau dargestellt und in den Anzeigefeldern dienen die Cursortasten zu Steuerung.
Unter dem Inhaltsfeld findest du die HEX / DEC / BIN-Werte des jeweils aktuellen Byte, das per Tastatur geändert werden kann. Näheres dazu in der Hilfe.
Da ich damit bisher alles erledigen konnte, gibts bei mir noch keine WIN-Version, aber wer weiß...
Bis zu WIN-XP/1 arbeitet das Programm einwandfrei - ob auch bei Vista - keine Ahnung!Allerdings ist es ein wenig gewöhnungsbedürftig, da eben nicht nur mental DOS-basiert.
XUDO
Einloggen, um Attachments anzusehen!
|
|
|