ZIP-Archiv auf Passwort prüfen...

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    ZIP-Archiv auf Passwort prüfen...

    Moin! :)
    Wie kann ich feststellen ob ein Zip-Archiv Passwort geschützt ist?
    Gibt es da im .NET Framework 2.00 eine Funktion?
    Oder in der „.NET Zip Component ZipForge.NET“ DLL?
    Weitere Infos, zur DLL habe ich nicht gefunden!
    Freue mich auf eure Hilfe!
    BIG THX

    Link:
    componentace.com/zip-vb.net.htm

    Ein Beispielcode:

    VB.NET-Quellcode

    1. Private Function ZipFilePasswortCheck() As Boolean
    2. Return True
    3. End Function
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. If ZipFilePasswortCheck() Then
    6. MessageBox.Show("Dieses Archiv ist Passwort geschützt!")
    7. Else
    8. MessageBox.Show("Dieses Archiv ist NICHT Passwort geschützt!")
    9. End If
    10. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o
    Versuch doch einfach die ZIP ohne Pw zu extrahieren. Wenn kein Fehler auftritt, dann hat sie keins.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator super Idee ... nicht! Das kann sehr schnell schief gehen (zb. bei größeren Archiven o.ö.).

    The structure of a PKZip file
    Lies die zwei Bytes an Position 6&7 und verarbeite die Flags, dann weißt du ob das File passwortgeschützt ist oder nicht.
    Moin! :)
    Ich habe den Code nun soweit, wie unten zu sehen ist.
    Leider dauert das bei Größen-Archiven ewig bis es geladen hat.
    Wie ist es möglich der Variable „Dateiinhalt()“ die zwei Byte gezielt auszulesen.
    Ohne das, die ganze Datei gelesen wird.
    BIG THX

    Problemcode:

    VB.NET-Quellcode

    1. Dim Dateiinhalt() As Byte = My.Computer.FileSystem.ReadAllBytes(strPfad)

    Der Code:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. ' Prüfe ob Zip-Archiv Passwort geschützt ist...
    3. If IsPasswordOnZipArchiv("F:\Temp\da\bild.zip") Then
    4. MessageBox.Show("Dieses Archiv ist Passwort geschützt!")
    5. Else
    6. MessageBox.Show("Dieses Archiv ist NICHT Passwort geschützt!")
    7. End If
    8. End Sub
    9. Private Function IsPasswordOnZipArchiv(strPfad As String) As Boolean
    10. Dim Dateiinhalt() As Byte = My.Computer.FileSystem.ReadAllBytes(strPfad)
    11. Dim Ergebnis As Byte
    12. For i As Byte = 6 To 7
    13. Ergebnis &= Dateiinhalt(i)
    14. Next
    15. If Ergebnis = 0 Then
    16. Return False
    17. Else
    18. Return True
    19. End If
    20. End Function
    Visual Basic.NET 8o
    MS-SQL
    8o
    Moin! :)
    Ich habe nun einen andern Code geschrieben.
    Könnte jemand diesen bitte testen?
    Ist dieser Code besser?
    BIG THX

    edit:
    Der Code war doch nicht richtig.
    Ich bin weiter am programmieren.
    Freue mich auf eure Hilfe!
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Nö, das kann so nicht funktionieren.

    BinaryReader ist in Ordnung, initialisier den aber mit einem FileStream.
    Danach setzt du den mit der Eigenschaft Position auf 6 und liest ab dort 2 Bytes wie @slice gesagt hat.
    Schau dir an wie du die Flags verarbeiten musst und dann musst du erst returnen, je nachdem wie die Flags gesetzt sind.

    Edit: Die Flags sind 2 Bytes welche du zersetzen musst. Schau dir dazu eventuell auch dies hier an.
    Du erstellst ein Enum mit Flag Attribut ([Flags] enum ZipFlags...), öffnest ein FileStream, benutzt Seek zum vorspulen, liest die benötigten Bytes, boxt (VarType v = (VarType)data) die in dein Enum und überprüfst das (HasFlag).
    Ist wahrscheinlich eine bessere Variante die du da parat hast, diese hier wäre jetzt die Alternative.

    C#-Quellcode

    1. static bool IsZipPasswordProtected(string file)
    2. {
    3. using (var stream = new FileStream(file, FileMode.Open))
    4. using (var reader = new BinaryReader(stream))
    5. {
    6. stream.Position = 6;
    7. ushort flags = reader.ReadUInt16();
    8. var bit = 0; // das ist das bit was geprüft werden soll, in dem fall das erste.
    9. return (flags & (1 << bit)) != 0;
    10. }
    11. }

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „seh“ ()

    @an alle
    Vielen Dank, an euch. :thumbsup:

    VB.NET-Quellcode

    1. Private Shared Function IsZipPasswordProtected(file As String) As Boolean
    2. Using stream = New FileStream(file, FileMode.Open)
    3. Using reader = New BinaryReader(stream)
    4. stream.Position = 6
    5. Dim flags As UShort = reader.ReadUInt16()
    6. Return (flags And (1 << 0)) <> 0
    7. End Using
    8. End Using
    9. End Function
    Visual Basic.NET 8o
    MS-SQL
    8o
    Aber das tust du ja nicht, und daher ists sinnlos.
    Mein Rat: machs weg, weil sinnloser Code ist am allerschwersten zu verstehen - sogar noch deutlich schwerer als falsch funktionierender.

    Oder mach einen Komment dazu, der erklärt, warum du's drin behalten willst.
    Andernfalls stösst sich jeder daran, der Code lesen kann, jedesmal, wenns ihm unter die Augen kommt.