haegar75
Goto Top

In Binärdatei suchen und Teile ausschneiden

Hallo,
vielleicht kann mir jemand helfen.. Ich möchte mit vb.net in einer Binärdatei nach dem Vorkommen von drei Zeichen suchen und den Bereich dazwischen ausschneiden und als eine neue Datei abspeichern. Hat jemand ne Idee/Snippet wie ich an die Sache rangehen könnte?
Gruß Haegar

Content-Key: 290110

Url: https://administrator.de/contentid/290110

Printed on: April 24, 2024 at 00:04 o'clock

Mitglied: 122990
122990 Dec 04, 2015 updated at 18:08:53 (UTC)
Goto Top
z.B. so ...
Imports System.IO
Imports System.Text
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Datei welche druchsucht wird  
        Const FILEIN = "C:\ordner\binary.exe"  
        'Datei in welche der Ausschnitt geschrieben wird  
        Const FILEOUT = "C:\ordner\binary_cut.exe"  
        'Suchstring  
        Const SEARCHSTRING = "DOS"  
        'Suche Offset des Strings im 'ASCII' Modus  
        Dim offset As Long = FindOffset(FILEIN, SEARCHSTRING)
        Try
            'Wurde String gefunden  
            If offset > -1 Then
                'Lösche Ausgabedatei wenn vorhanden  
                If File.Exists(FILEOUT) Then Kill(FILEOUT)

                'Anzahl Bytes in einen FileStream einlesen  
                Dim block(offset) As Byte
                Using fIn As FileStream = New FileStream(FILEIN, FileMode.Open)
                    fIn.Read(block, 0, offset)
                    fIn.Close()
                End Using

                'Auschnitt Bytes in neue Datei schreiben  
                Using fOut As FileStream = New FileStream(FILEOUT, FileMode.CreateNew)
                    fOut.Write(block, 0, offset)
                    fOut.Close()
                End Using
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    Public Function FindOffset(filePath As String, strPattern As String) As Long
        Try
            Dim pattern() As Byte = Encoding.ASCII.GetBytes(strPattern)
            If Not File.Exists(filePath) Then
                Return -1
            End If
            Dim fb() As Byte = File.ReadAllBytes(filePath)
            For i = 0 To fb.Length - 1
                Dim found As Boolean = True
                For j = 0 To pattern.Length - 1
                    If fb(i + j) <> pattern(j) Then
                        found = False
                        Exit For
                    End If
                Next
                If found Then
                    Return i
                End If
            Next
            Return -1
        Catch ex As Exception
            Return -1
        End Try
    End Function
End Class

Gruß grexit
Member: Haegar75
Haegar75 Dec 04, 2015 at 19:13:17 (UTC)
Goto Top
Danke für die schnelle Hilfe!! Ich denke ich sehe jetzt klarer, allerdings habe ich noch folgende Probleme/Unklarheiten..
-der String den ich jeweil suche ist eine binäre Zeichenfolge beispielsweise für 0x05h kann ich kein Ascii-Zeichen angeben, oder?
-ich weiß nicht wieviel bytes mein gewünschter Bereich groß ist. Ich müsste dann weitersuchen bis zum nächsten "Suchstring" und die offsets subtrahieren?
Gruß Haegar
Mitglied: 122990
122990 Dec 05, 2015, updated at Dec 06, 2015 at 12:53:13 (UTC)
Goto Top
der String den ich jeweil suche ist eine binäre Zeichenfolge beispielsweise für 0x05h kann ich kein Ascii-Zeichen angeben, oder?
Klar geht das wußte halt nicht wie die Daten vorliegen, im Skript siehst du ja das die ASCII Strings in ein Byte-Array umgewandelt werden, das lässt sich natürlich alles anpassen. Im folgenden Beispiel gibst du die HEX-Werte als Array an {&H5,&H44} usw.

Folgendes Skript sucht also nun zuerst vom Anfang der Datei aus nach SEARCHBYTES1, wird dieser gefunden wird von diesem Offset aus nach SEARCHBYTES2 gesucht. Wenn dieser ebenfalls gefunden wird. Werden die Offsets voneinander abgezogen, womit wir die Länge des Blocks kennen. Diesen schreiben wird nun in die Zieldatei, feddich.

Mit ein bißchen nachdenken hätte man sich das auch selbst erarbeiten können wenn man hier schon Code zum Nulltarif geliefert bekommt face-confused
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Datei welche druchsucht wird  
        Const FILEIN = "C:\ordner\binary.exe"  
        'Datei in welche der Ausschnitt geschrieben wird  
        Const FILEOUT = "C:\ordner\binary_cut.exe"  
        'Suchstrings  
        Dim SEARCHBYTES1() As Byte = {&H44, &H4F, &H53}
        Dim SEARCHBYTES2() As Byte = {&H50, &H45}

        Dim offset1 As Long, offset2 As Long
        'Suche ersten Offset des Sucharrays  
        offset1 = FindOffset(FILEIN, SEARCHBYTES1)
        If offset1 > -1 Then
            ' Suche den zweiten Offset des zweiten Sucharrays  
            offset2 = FindOffset(FILEIN, SEARCHBYTES2, offset1 + SEARCHBYTES1.Length)
        Else
            MsgBox("Sucharray 1 wurde nicht gefunden", vbExclamation)  
            Exit Sub
        End If
        Try
            'Wurde String gefunden  
            If offset1 > -1 And offset2 > -1 Then
                Dim blockLength As Long = offset2 - offset1
                'Lösche Ausgabedatei wenn vorhanden  
                If File.Exists(FILEOUT) Then Kill(FILEOUT)

                'Anzahl Bytes in einen FileStream einlesen  
                Dim block(blockLength - 1) As Byte
                Using fIn As FileStream = New FileStream(FILEIN, FileMode.Open)
                    fIn.Seek(offset1, 0)
                    fIn.Read(block, 0, blockLength)
                    fIn.Close()
                End Using

                'Auschnitt Bytes in neue Datei schreiben  
                Using fOut As FileStream = New FileStream(FILEOUT, FileMode.CreateNew)
                    fOut.Write(block, 0, block.Length)
                    fOut.Close()
                End Using
            Else
                MsgBox("Sucharray 2 wurde nicht gefunden", vbExclamation)  
                Exit Sub
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Function FindOffset(filePath As String, arrPattern() As Byte, Optional startOffset As Long = 0) As Long
        Try
            If Not File.Exists(filePath) Then
                Return -1
            End If
            Dim fb() As Byte = File.ReadAllBytes(filePath)
            For i = startOffset To fb.Length - 1
                Dim found As Boolean = True
                For j = 0 To arrPattern.Length - 1
                    If fb(i + j) <> arrPattern(j) Then
                        found = False
                        Exit For
                    End If
                Next
                If found Then
                    Return i
                End If
            Next
            Return -1
        Catch ex As Exception
            MsgBox(ex.Message)
            Return -1
        End Try
    End Function
End Class
So, damit hast du alle Werkzeuge an der Hand welche du für dein Vorhaben brauchst!

Gruß und schönes zweites Adventswochenende
grexit
Mitglied: 122990
122990 Dec 23, 2015 updated at 11:30:37 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen.