kostenloser Webspace werbefrei: lima-city


Datein in JPG verstecken

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    g****e

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    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.
  4. 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:
    // Ö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... */
    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.
    Der Code ist nur aus der Dokumentation zusammengestöpselt und nicht getestet. D.h. evtl. musst Du noch ein wenig nachbessern.

    Viel Glück!
  5. Autor dieses Themas

    g****e

    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
  6. 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
  7. Autor dieses Themas

    g****e

    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 :-D 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 :)
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!