Datein in JPG verstecken
lima-city → Forum → Programmiersprachen → C/C++ und D
bad
bild
brauche
code
dank
datei
dialog
ende
file
header
hilfe
input
list
nutz
offset
output
paket
problem
teil
text
-
Heyhoo
Ich brauche mal eure Hilfe. Eigentlich hat es auch etwas mit der logik zu tun, vllt bin ich auch zu dämlich um es zu verstehen, aber ich brauche mal Hilfe.
Unzwar geht es darum, dass ich ein zip Packet in eine JPG schreiben will, unzwar möchte ich es per Hex hinten an das Ende ranhängen. Dafür nutze ich, dass ein JPG bild mit ffd8 anfängt und mit ffd9 aufhört, sonst ist es kein JPG Bild.
Und hier jetzt eine Frage: Stimmt das?
Weiter, ich nutze Qt und habe mir eine Funktion geschrieben, die wie Folgt ausgebaut ist:
QFile inpic( ui->openjpgj->text() ), infile( ui->openfilej->text() ), outfile( ui->savefilej->text() ); inpic.open(QIODevice::ReadOnly); infile.open(QIODevice::ReadOnly); outfile.open(QIODevice::WriteOnly | QIODevice::Truncate); QByteArray output = inpic.readAll() + infile.readAll(); outfile.write( output ); QMessageBox dialog(this); dialog.setText("Injected"); dialog.exec(); inpic.close(); infile.close(); outfile.close();
Damit öffne ich die Files, und schließe sie wieder, das funktioniert wunderbar. Ich schreibe in ein QByteArray und schreibe den Output, das geht auch denke ich alles wunderbar. Ich kann das Bild ohne wieteres als JPG anschauen. Doch vllt gibt es hier ja schon einen Gedankenfehler?
Nun gut, der Hauptteil kommt jetzt:
QFile input( ui->openfilee->text() ), output( ui->savefilee->text() ); input.open(QIODevice::ReadOnly); output.open(QIODevice::WriteOnly | QIODevice::Truncate); QString text = input.readAll().toHex().toLower(); QStringList list = text.split("ffd9"); list.first() = ""; text = list.join(""); output.write( QByteArray().fromHex( QByteArray( text.toStdString().c_str() ) ) ); QMessageBox dialog(this); dialog.setText("Extracted"); dialog.exec(); input.close(); output.close();
Damit öffne ich die Datei, Teile sie auf an der ffd9 Grenze auf und lösche den ganzen ersten Teil. Der erste teil müsste, so meine Gedanken, nur das Bild sein. Ist das so richtig? Eigentlich sollte im Bild selbst ja kein solcher Teil vorkommen, denke ich, oder denke ich da Falsch?
Wenn ich das *.zip Paket entpacken will krieg ich allerdings folgendes:
warning [***/test.zip]: 155534 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 155534
(attempting to re-compensate)
file #1: bad zipfile offset (local header sig): 155534
file #2: bad zipfile offset (local header sig): 69
(attempting to re-compensate)
file #2: bad zipfile offset (local header sig): 69
Das bedeutet also, dass da zu viel am Anfang ist? Und nun stehe ich vor einem Punkt wo ich nicht weiß wie weiter... Wie löse ich dieses Problem?
Freue mich auf Antwort und Hilfe
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich hab schon länger kein C oder C++ mehr programmiert, kämpfe aber auch des öfteren mit derartigen Logik-Problemen. Irgendwann ist man zu tief drinnen und kennt sich nicht mehr aus bzw. übersieht offensichtliches.
Ich würde mal ein wenig auf Abstand gehen und mir auf Papier überlegen wie die Informationen gespeichert werden sollen. Dann auch mit Debug-Ausgaben überprüfen ob sie richtig geschrieben und gelesen werden...
So hab ich die meisten Probleme in den Griff bekommen. -
Hallo ggamee,
da ich mich mit dem Jpeg-Format noch nie alzu intensiv auseinandergesetzt habe erst mal eine einfache Frage:
Bist Du Dir wirklich sicher, dass die Zeichenkombination 'ffd9' nur am Ende des Bildes stehen kann und nirgends sonst?
Ich vermute, dass dem nicht so ist und der Marker nur als letztes Prüfkriterium nach dem Dekodieren dient.
Am besten ist, wenn Du erst mal in dem Jpeg-File nach 'ffd9' suchst und wenn das öfter vorkommt, dann weißt Du ja wo das Problem ist.
Um das Problem zu lösen könnte man evtl. folgendes versuchen:
Wenn Du Glück hast ist die Position im 'in'-Stream jetzt genau der Anfang der angehängten Datei. Alles was Du jetzt aus dem Stream liest sollte dann das Zip-File sein.// Öffne die Datei und erzeuge ein Stream-Objekt: QFile file("combined.jpg"); file.open(QIODevice::ReadOnly); QDataStream in(&file); // Lese das Bild aus dem Stream: QImage *img = new QImage(); in >> *img; delete img; /* lesen der übrigen Daten... */
Der Code ist nur aus der Dokumentation zusammengestöpselt und nicht getestet. D.h. evtl. musst Du noch ein wenig nachbessern.
Viel Glück! -
Oh Mist -.-
Du hast recht, das ffd9 begrenzt es nicht nur, es kommt öfters vor. Ich habe dieses Vid geschaut:
http://www.youtube.com/watch?v=-rsNXUq2b_w
Und bin davon ausgegangen, dass es so passt, aber da kann ich dann ja garnicht so drauf aufbauen... :( Ach wie dämlich... Mein Fehler. Dann muss ich umdenken. Ich habe da schon eine Idee, vielleicht muss ich die Headerstrukturen ein wenig mehr beachten.
Da hätt ich auch selbst drauf kommen können... grml.... Trotzdem Danke :) Daran hab ich noch garnicht gezweifelt...
Liebe Grüße -
Es geht anscheinend auch einfacher.. ich hab noch kein eigenes Bild mit Datei drinn erstellt, aber ich habe das Testbild von dieser Seite hier: http://blog.der-link.de/archives/1229-Dateien-in-jpg-Bildern-verstecken.html
runtergeladen und konnte es mit 7zip öffnen und entpacken! und in den Kommentaren wird mehrfach genauer beschrieben wie es geht
Edit:
Das Problem wovon einige auf dieser Seite berichten, ist wohl das sie vorher nicht mit "cd C:\..." in das Verzeichnis gewechselt haben in dem das Bild und die Datei liegt. Habs jetzt ausprobiert, und es geht wirklich! Sogar auch mit PW geschützten Zip Dateien.
Beitrag zuletzt geändert: 14.9.2011 11:07:16 von nick8719 -
Die Technik kenn ich schon lange, da wird ein Binäres anneinander Kopieren veranstalltet.
Das funktioniert, weil eine Bildsoftware vorne anfängt mit einlesen, Pakete, so auch zip, zum entpacken aber von hinten angefangen werden zu lesen. Damit können beide Datein koexistieren, damit kann man Theoretisch auch ein Zippaket in eine *.dll Datei packen. Nur dachte ich die Eigenschaft ffd8 bis ffd9 nutzen zu können, weil ich einfach geglaubt habe es sei fest... so dämlich kann auch nur ich sein naja, aus Fehlern lernt man.
Dafür werd ich aber auch noch eine Fixlösung erstellen, und mit glück wollte ich damit auch ein Entpackungsprogramm integrieren, daran werd ich noch ne Weile Arbeiten^^ Aber nur versuch macht kluch.
Trotzdem Danke :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage