copy /b und VB?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von csys222.

    copy /b und VB?

    Hallöle,

    ich versuche grade mal, den CMD-Befehl copy (genauer copy /b) in VB zu realisieren.....es geht mir darum, zwei Dateinen in einer neuen zu vereinen, das ist ja damit (wenn ich alles richtig verstanden habe) zu machen.

    VB.NET-Quellcode

    1. Shell("cmd /c " & Chr(34) & "copy /b C:\Users\ich\Desktop\test\Versteck.jpg + C:\Users\ich\Desktop\test\Testarchiv.zip C:\Users\ich\Desktop\test\blabla.jpg" & Chr(34))


    Einfach mal so probiert...allerdings wird Datei blabla zwar erstellt, ist aber genau so groß wie die Ausgangsdatei, von der Struktur sind sie ebenfalls identisch.
    Normalerweise navigiert man sich im CMD ja so runter, hab ich das hier richtig gelöst, bzw. was ist falsch?
    Normalerweise müsste doch dann "Testarchiv.zip" versteckt sein, so dass es immernoch so aussieht wie das Ausgangsbild.

    P.S: Ich will das nicht mit batches(?) machen....also rein in VB
    Hoffe ihr könnt mir helfen ;)
    Wenn du rein VB machen willst, wieso nutzt du dann Commandline Befehle? Zumal der Shell bereits sowas wie cmd ist, müsstest es also nicht nochmal extra starten.

    Soweit ich weiß kopiert der Parameter /b 2 Dateien Binär, also fügt sie einfach zusammen, ist das richtig?
    Wenn ja, nun dann mache das mit den .NET Klassen wie BinaryRead() und BinaryWrite. Lese beide dateien in ein Array vom Typ Byte, füge beide Arrays zusammen und speichere es wieder ab. Das wäre das gleiche was der Copy befehl macht.

    VB.NET-Quellcode

    1. Private Sub ConcatFiles(ByVal output As String, ByVal ParamArray inputs() As String)
    2. Using fsOut As New FileStream(output, FileMode.Create)
    3. Dim buf(1023) As Byte
    4. For Each input As String In inputs
    5. Using fsIn As New FileStream(input, FileMode.Open)
    6. Dim read = buf.Length
    7. Do
    8. read = fsIn.Read(buf, 0, read)
    9. fsOut.Write(buf, 0, read)
    10. Loop While read = buf.Length
    11. End Using
    12. Next
    13. End Using
    14. End Sub


    gugge auch Stream-Konzepte
    Danke erstmal...wa beschäftight und hatte keine Zeit für das hier, aber:
    Ich habe mir die Binary-Klassen mal angeschaut..diverse Codescnippsel habe ich ausprobiert und auch versucht mir mal was selbst zu scheiben, nur:

    • Der Reader versucht ständig über das Ende hinaus weiterzulesen und hängt sich auf
    • Eine Datei wird eingelesen, aber die Ausgabe ist keinesfalls binär...ich lasse mir eine .txt mit 200 mal dem Zeichen q einlesen und er gibt mir 12 mal q aus...nich so das wahre :(
    Wär ganz nett wenn ihr mir das nochmal erklären/zeigen könntet damit ichs auch mal verstehe, zumal ich das mit der Ausgabe des Eingelesenen Probleme habe. Also ganz von vorne @ ErfinderDesRades: Also das verstehe ich auch grade ma nich...und sobald ich da irgendwas zuweise sagt er mir das der Variablentyp heruntergesetzt wurde?

    Danke schonmal.
    Ich fürchtefast, du hast noch nicht gelernt, eine Methode korrekt aufzurufen.
    Also zu sehen: "Aha, die und die Parameter werden erwartet, dann geb ich ihr doch das und das".

    Vor diesem Hintergrund kannichdir vmtl. nix erklären, was du verstehst, also empfehle ich Grundlagenstudium: dieses Buch Lesen

    Und darin vlt. nach ParamArray suchen, vlt. isses ja nur dieses Detail, was du nicht kennst. (Aber vorher muß man auch Array verstanden haben, also nimm dir Zeit - zu gründlich kannstes nicht machen.)

    Wovon ich eher abrate ist, ohne Sinn und Verstand herumzugooglen, da wird dir vieles vorgemacht (und vieles davon auch noch falsch), und erklärt wird nix.

    Aber ich kann ein AufrufeBeispiel geben

    VB.NET-Quellcode

    1. ConcatFiles("C:\NeuText.txt", "C:\Text1.txt", "C:\Text2.txt")

    Noch ein AufrufeBeispiel ?

    VB.NET-Quellcode

    1. ConcatFiles("C:\GanzNeuText.txt", "C:\Text1.txt", "C:\Text2.txt", _
    2. "C:\Text3.txt", "C:\Text4.txt", "C:\Text5.txt")


    Deinen Einlassungen von wegen "sagt er mir das der Variablentyp heruntergesetzt wurde" kannich ühaupt nicht folgen.
    Fehler beschreibt man besser mit Codebeispiel, unter Angabe von Fehlerzeile und genauem Fehler-Meldetext.

    Nun habichdich schon viel zu sehr bedient, und üblicherweise, wenn ich in einem Post mehrere Gedanken äußere, kommt nur der unwichtiger an.
    Also hier der wichtigere war: dieses Buch Lesen, Array und ParamArray nachschlagen.
    Doch, wie ich eine Methode aufrufe is mir schon klar, allerdings..diese nicht, d.h. ich habe es falsch gemacht. :S
    So eingelsen ist es jetzt, das ganze ist in einem Bytearray gespeichert. bis grade ben war ich mir sicher was nun zu tun is, aber jetzt bin ich verwirrt. Beide (Container- und zu versteckende Datei) sind eingelesen.
    Jetzt zum copy /b...die werden ja praktisch binär zusammengefügt, sehe ich das richtig?
    Was passiert genau?
    Ja, Nein, Egal....nehme ich deinen Code. Nachdem isch das nun richtig hinbekommen habe, frage ich mich wie genau der copy /b Befehl nun funktioniert. Wiegesagt, eingelsen ist es, nur was nun?
    In der CMD.exe sähe das dann z.B. so aus:

    Quellcode

    1. copy /b Containerbild.jpg + ZuVersteckendeDatei.zip BildundVersteckteDatei.jpg

    Jetzt beinhaltet BildundVersteckteDatei.jpg die ZuVersteckendeDatei.zip aber sieht aus wie Containerbild.jpg.
    "Manuell" hab ich das alles schon proboert, aber wie automatisier ich das ist die Frage.

    Soweit ich weiß kopiert der Parameter /b 2 Dateien Binär, also fügt sie einfach zusammen, ist das richtig?
    Wenn ja, nun dann mache das mit den .NET Klassen wie BinaryRead() und BinaryWrite. Lese beide dateien in ein Array vom Typ Byte, füge beide Arrays zusammen und speichere es wieder ab. Das wäre das gleiche was der Copy befehl macht.

    zusammenfügen? Nur zusammenfügen?
    Du möchtest eine ZIP-Datei in einer JPEG-Datei verstecken.
    Das ist auch kein Problem, weil normale Bildanzeigeprogramme streng nach dem JFIF-Protokoll arbeiten und nur Werte zwischen dem SOI-Flag und dem EOI-Flag als Bild interpretieren.

    Wenn du also dein ZIP ans Ende der JPG anhängst, ist es versteckt.
    Das geht mit copy/b oder auch mit dem Code von ErfinderDesRades.
    Wichtig ist lediglich, dass du die Daten zwischen SOI (FF D8) und EOI (FF D9) 1:1 übernimmst.

    Du kannst aber auch den Ansatz nehmen, dass du die Bilddatei einfach mit Append öffnest und dort deine ZIP-Daten anhängst.

    zusammenfügen? Nur zusammenfügen?
    Auch copy/b fügt nicht zusammen, sondern kopiert (wie der Name schon sagt) den Inhalt beider Dateien in eine neue.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Hallo!

    Ich beschäftige mich auch mit dem Thema und habe auch mal was versucht. Ich habe 2 Arrays erstellt und dort die Containerdatei und die zu versteckende Datei eingelesen. Dann habe ich sie zusammengefügt und mit Writeallbytes geschrieben.
    Es entsteht zwar die Datei, allerdings ist sie irgendwie nicht öffenbar und auch sonst komisch.
    Ich kann sie zwar mit WINrar öffnen und die eingefügte Datei entnehmen, aber da das Bild nichtmehr verwendbar ist...verstößt es ja sozusagen gegen die Grundsätze der Steganographie, hier ersma mein Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ' Zu versteckende Datei einlesen
    3. Dim zuversteckendedatei(1) As Byte
    4. Dim textdatei As String = "C:\Users\PC\Desktop\cache\zip.zip"
    5. zuversteckendedatei = System.IO.File.ReadAllBytes(textdatei)
    6. ' Containerdatei in Array lesen
    7. Dim Versteck(1) As Byte
    8. Dim zipdatei As String = "C:\Users\PC\Desktop\cache\Bild.jpg"
    9. Versteck = System.IO.File.ReadAllBytes(zipdatei)
    10. ' Arrays vereinen
    11. Dim Vereint(zuversteckendedatei.LongCount + Versteck.LongCount) As Byte
    12. Dim zähler As Integer
    13. For i As Integer = 0 To zuversteckendedatei.LongCount - 1
    14. Vereint(zähler) = zuversteckendedatei(i)
    15. zähler += 1
    16. Next
    17. For i2 As Integer = 0 To Versteck.LongCount - 1
    18. Vereint(zähler) = Versteck(i2)
    19. zähler += 1
    20. Next
    21. System.IO.File.WriteAllBytes("C:\Users\PC\Desktop\cache\BildNEU.jpg", Vereint)
    22. End Sub


    Wie schon geschrieben, kann es ein das ich den Start of Image misachtet habe und somit die Datei zerstört habe?
    Wenn ja, wie ermittle ich den "verbotenen" Bereich?