HEX Editor - Ladezeiten fix?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von SeriTools.

    HEX Editor - Ladezeiten fix?

    Hallo,

    ich arbeite momentan an einem Programm das auch Dateien (meist .exe) wie ein HEX Editor öffnet, gestimmte Zeilen ändert und wieder speichert.

    Momentan sieht mein Code so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim HEX As String
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    6. Using File As New IO.FileStream(OpenFileDialog1.FileName, IO.FileMode.Open)
    7. Dim value As Integer = File.ReadByte
    8. Do Until value = -1
    9. HEX = HEX & (value.ToString("X2"))
    10. value = File.ReadByte
    11. Loop
    12. End Using
    13. Richtextbox1.text = HEX
    14. End If
    15. End Sub
    16. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    17. Try
    18. If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    19. Dim fs As New IO.FileStream(SaveFileDialog1.FileName, IO.FileMode.Create)
    20. For x As Integer = 0 To HEX.Length - 1 Step 8
    21. Dim ui As UInt32
    22. ui = Convert.ToUInt32(HEX.Substring(x, 8), 16)
    23. Dim b() As Byte = BitConverter.GetBytes(ui)
    24. fs.Write(b, 0, b.Length)
    25. Next
    26. fs.Close()
    27. End If
    28. Catch
    29. End Try
    30. End Sub
    31. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    32. Dim DOSmode As String = "546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F6465"
    33. Dim noDOSmode As String = "0000000000000000000000000000000000000000000000000000000000000000000000000000"
    34. RichTextBox1.Text = Replace(RichTextBox1.Text, DOSmode, noDOSmode)
    35. End Sub
    36. End Class


    Wenn ich jedoch eine größere Datei öffne, braucht diese zu lange (ich habe immer abgebrochen) um zu laden.
    Gibt es eine einfachere möglichkeit?
    Danke im Vorraus. :)
    Oder Du liest die Datei blockweise (hier ohne Blockhandling):

    VB.NET-Quellcode

    1. Dim bb As Byte() = New Byte(255) {}
    2. Using fs As New IO.FileStream("c:\Temp\xxx.yyy", IO.FileMode.Open, IO.FileAccess.Read)
    3. fs.Read(bb, 0, 256)
    4. End Using
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @milaim: Threads zu verwenden löst zwar das Problem, dass die GUI nicht mehr reagiert, aber die lange Ladezeit würde natürlich bleiben.

    Was die Ausführungsgeschwindigkeit des Codes erhöhen würde, wäre z. B. die Verwendung eines StringBuilders. Wenn du aber wirklich große Dateien lesen möchtest, solltest du dich allerdings von deinem Ansatz komplett verabschieden und immer nur (dynamisch) die Range lesen, die tatsächlich angezeigt werden soll.

    ErfinderDesRades schrieb:

    naja, da will doch jemand den Byte-Code einer Exe verändern, und sie anschließend trotzdem starten.
    Oft ein Versuch von Crackern, Beschränkungen von Shareware-Versionen zu unterlaufen.


    Nein, ich möchte lediglich dass das Programm diesen Teil:


    automatisch in diesen ändert:


    Und falls gelegentlich, diesen Teil:


    ebenfalls unsichtbar macht:


    Abgesehen davon soll es nur eine von mehreren Funktionen sein.
    Bitte sag jetzt nicht ich sollte den Code obfuscaten oder sonstiges tun, ich möchte es so lösen. :)
    Hat sich erledigt, funktionierender Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim FileX As String
    4. Dim DOSmode As String = "54-68-69-73-20-70-72-6F-67-72-61-6D-20-63-61-6E-6E-6F-74-20-62-65-20-72-75-6E-20-69-6E-20-44-4F-53-20-6D-6F-64-65"
    5. Dim noDOSmode As String = "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00"
    6. Private Function StreamFile(ByVal filename As String) As Byte()
    7. Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read)
    8. Dim FileData As Byte() = New Byte(fs.Length - 1) {}
    9. fs.Read(FileData, 0, System.Convert.ToInt32(fs.Length))
    10. fs.Close()
    11. Return FileData
    12. End Function
    13. Private Function UnStreamFile(ByVal filename As String, ByVal FileBytes() As Byte)
    14. Try
    15. Dim FS As New FileStream(filename, FileMode.Create, FileAccess.Write)
    16. FS.Write(FileBytes, 0, FileBytes.Length)
    17. FS.Close()
    18. FS.Dispose()
    19. Return True
    20. Catch ex As Exception
    21. Return False
    22. End Try
    23. End Function
    24. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    25. OpenFileDialog1.ShowDialog()
    26. End Sub
    27. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    28. If CheckBox1.Checked = True Then
    29. FileX = Replace(FileX, DOSmode, noDOSmode)
    30. End If
    31. SaveFileDialog1.ShowDialog()
    32. End Sub
    33. Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    34. Dim FileByt() As Byte
    35. FileByt = StreamFile(OpenFileDialog1.FileName)
    36. FileX = BitConverter.ToString(FileByt)
    37. End Sub
    38. Private Sub SaveFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    39. Dim FileByt() As Byte
    40. FileByt = FileX.Split("-"c).Select(Function(n) Convert.ToByte(Convert.ToInt32(n, 16))).ToArray()
    41. UnStreamFile(SaveFileDialog1.FileName, FileByt)
    42. End Sub
    43. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    44. FileX = Replace(FileX, DOSmode, noDOSmode)
    45. End Sub
    46. End Class
    Hey,
    das "This program cannot be run in DOS mode" gehört zur PE dazu. Da istn kleines Dos Programm am Anfang dass diesen Text ausgibt, falls es im DOS Modus ausgeführt wird. Der Dateipfad ist der Pfad zur Debuginfo, da hat entweder der Entwickler geschlammt oder die Debugversion veröffentlicht.