VB.NET - Externs Programm inhalt auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von noob98.

    VB.NET - Externs Programm inhalt auslesen

    Guten Abend,
    Ich hab ein kleines problem, und zwar möchte ich eine Datei auslesen, jedoch ist die Datei verschlüsselt.
    Das Programm was die Datei entschlüsselt ist nicht besonders bekannt.
    Öffnet man das Programm, kommt zuerst ein Dialog Fenster, wenn man da auf "Okay" klickt, kommt eine Editor der die Datei entschlüsselt. Nun möchte ich den Inhalt der Datei auslesen weiß jedoch nicht wie ich das machen soll.
    Mit Spy+++ kam ich auch nicht besonders weiter weil der Editor keine genaue Text/Richbox hat (Oder nicht gefunden, hab aber sehr genau geguckt), außerdem hab ich mit SendMessage noch nie gearbeitet.
    Hat jemand vielleicht eine Idee, oder soll ich noch besser ein Bild hochladen was mir Spy+++ anzeigt?

    Vielen dank für jede Antwort!

    noob98 schrieb:

    SendMessage
    Das Zauberwort heißt "Fernsteuerung".
    Auch wenn es hier um VB6 geht, ist doch das Prinzip dasselbe, Gugst Du hier.
    Die .NET-Deklarationen der API-Funktionen findest Du hier.
    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!

    noob98 schrieb:

    Wie bekomm ich
    Überleg Dir mal den genauen Ablauf, den musst D nachempfinden.
    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!

    noob98 schrieb:

    verändere
    Nix verändern.
    Du musst zunächst das Programm von Hand bedienen (können) und dann kannst Du diesen Ablauf per API nachempfinden.
    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!

    noob98 schrieb:

    wieso
    ?????!!!!!
    Sorry, meine Glaskugel ist gerade bei der Reparatur!!!!!
    Vielleicht postest Du mal ein Stück Code und wir sehen mal drauf?
    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!
    Hat sich an sich nichts geändert:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text
    3. Imports System.Runtime.InteropServices
    4. Imports System.Diagnostics
    5. Public Class Form2
    6. ' Methods
    7. Private Shared Function EnumWindow(ByVal handle As IntPtr, ByVal pointer As IntPtr) As Boolean
    8. Dim list As List(Of IntPtr) = TryCast(GCHandle.FromIntPtr(pointer).Target, List(Of IntPtr))
    9. If (list Is Nothing) Then
    10. Throw New InvalidCastException("GCHandle Target could not be cast as List<IntPtr>")
    11. End If
    12. list.Add(handle)
    13. Return True
    14. End Function
    15. Public Shared Function GetChildWindows(ByVal parent As IntPtr) As List(Of IntPtr)
    16. Dim result As New List(Of IntPtr)
    17. Dim listHandle As GCHandle = GCHandle.Alloc(result)
    18. Try
    19. Dim childProc As NativeMethods.EnumWindowProc = New NativeMethods.EnumWindowProc(AddressOf Form2.EnumWindow)
    20. NativeMethods.EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle))
    21. Finally
    22. If listHandle.IsAllocated Then
    23. listHandle.Free()
    24. End If
    25. End Try
    26. Return result
    27. End Function
    28. Public Sub SearchMyWindow()
    29. Me._Process = New Process
    30. Me._Process.StartInfo.FileName = "C:\Users\USERNAME\Downloads\DC_UP v1.5.exe"
    31. Me._Process.StartInfo.Arguments = "file.dat" 'Pfad findet er (Ist beim Programm so)
    32. Me._Process.StartInfo.CreateNoWindow = False
    33. Me._Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    34. Me._Process.StartInfo.UserName = Nothing
    35. Me._Process.StartInfo.Password = Nothing
    36. Me._Process.Start()
    37. Me._Process.WaitForInputIdle(&H2710)
    38. Me._hwndMain = Me._Process.MainWindowHandle
    39. Dim list As List(Of IntPtr) = Form2.GetChildWindows(Me._hwndMain)
    40. Dim list2 As New List(Of String)
    41. Dim Space As New StringBuilder(&H200)
    42. Dim ii As IntPtr
    43. For Each ii In list
    44. NativeMethods.GetWindowText(ii, Space, Space.Capacity)
    45. list2.Add(Space.ToString)
    46. MsgBox("TEST:" & Space.ToString)
    47. Next
    48. 'Debugger.Break()
    49. End Sub
    50. ' Fields
    51. Private _hwndMain As IntPtr
    52. Private _Process As Process
    53. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    54. SearchMyWindow()
    55. End Sub
    56. End Class
    57. Friend Class NativeMethods
    58. ' Methods
    59. <DllImport("user32")> _
    60. Public Shared Function EnumChildWindows(ByVal window As IntPtr, ByVal callback As EnumWindowProc, ByVal i As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    61. End Function
    62. <DllImport("user32.dll")> _
    63. Public Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal lpReturnedString As StringBuilder, ByVal nMaxCount As Integer) As Integer
    64. End Function
    65. ' Nested Types
    66. Public Delegate Function EnumWindowProc(ByVal hWnd As IntPtr, ByVal parameter As IntPtr) As Boolean
    67. End Class


    P.S:
    Entschuldigung das ich gerade etwas genervt bin, und vielen dank für deine Geduld!!!

    noob98 schrieb:

    helfen
    Das ist das falsche Fenster.
    Klick auf den Feldstecher, klick auf das Suchtool und zieh dann mit gedrückter Maustaste zu Deinem Zielfenster.
    Bilder
    • Spy.png

      22,31 kB, 333×301, 145 mal angesehen
    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!

    noob98 schrieb:

    Aber wie bekomm ich jetzt den Inhalt raus?
    Du musst das Fenster identifizieren, über EnumChildWindows(). Du klapperst alle Fenster durch, bis Du das richtige gefunden hast, hie Anzahl der "Klapper-Vorgänge" ist dann immer gleich.
    Sieh Dir den Link in Post #2 an.
    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!
    Guten Tag,
    Danke schonmal dafür (mal wieder eine danke)
    Ich hab jetzt gerade was anderes getestet, dabei findet er den Prozess/Handle jedoch kein Text, kann sein das der Editor das gut versteckt???

    CODE:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Public Class Form3
    4. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    5. Private Shared Function FindWindow( _
    6. ByVal lpClassName As String, _
    7. ByVal lpWindowTitle As String) As IntPtr
    8. End Function
    9. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    10. Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
    11. ByVal childAfter As IntPtr, _
    12. ByVal lpClassName As String, _
    13. ByVal lpWindowTitle As String) As IntPtr
    14. End Function
    15. Dim Hauptfenster As IntPtr = FindWindow("TForm1", "Fenster.dat")
    16. Dim TPlusMemo As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "TPlusMemo", Nothing)
    17. Private Declare Function SendMessageByInt Lib "user32.dll" Alias "SendMessageA" _
    18. (ByVal hWnd As IntPtr, _
    19. ByVal uMsg As Integer, _
    20. ByVal wParam As Integer, _
    21. ByVal lParam As Integer) As Integer
    22. Private Declare Function SendMessageByString Lib "user32.dll" Alias "SendMessageA" _
    23. (ByVal hWnd As IntPtr, _
    24. ByVal uMsg As Integer, _
    25. ByVal wParam As Integer, _
    26. ByVal lParam As StringBuilder) As Integer
    27. Const WM_GETTEXT As Integer = &HD
    28. Const WM_GETTEXTLENGTH As Integer = &HE
    29. Public Function GetText(ByVal hwnd As IntPtr) As String
    30. If (Not hwnd.Equals(IntPtr.Zero)) Then
    31. Dim length As Integer = SendMessageByInt(hwnd, WM_GETTEXTLENGTH, 0, 0)
    32. If length > 0 Then
    33. Dim SB As New StringBuilder(length)
    34. Dim Result As Int32 = SendMessageByString(hwnd, WM_GETTEXT, length + 1, SB)
    35. If Result <> 0 Then
    36. Return SB.ToString()
    37. Else
    38. Return String.Empty
    39. End If
    40. Else
    41. Return "Kein Text vorhanden"
    42. End If
    43. Else
    44. Return "Handle nicht gefunden"
    45. End If
    46. End Function
    47. Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    48. MessageBox.Show(GetText(TPlusMemo))
    49. End Sub
    50. End Class

    noob98 schrieb:

    kann sein das der Editor das gut versteckt?
    Probier das ganze mal mit einem ganz simplen Programm, z.B. Calc oder Notepad.
    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!
    Notepad++

    VB.NET-Quellcode

    1. Dim Hauptfenster As IntPtr = FindWindow("Notepad++", "*new 2 - Notepad++")
    2. Dim Tab As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "SysTabControl32", "Tab")
    3. Dim TextBox2 As IntPtr = FindWindowEx(Tab, IntPtr.Zero, "msctls_updown32", Nothing)

    "Kein Text vorhanden."

    Context
    Fehler: Handle nicht gefunden (Fehler nicht gefunden, jedoch steht in TConTEXTSynEdit alles(bei langen Texten werden sie abgeschnitten (Textblalal...)))

    VB.NET-Quellcode

    1. Dim Hauptfenster As IntPtr = FindWindow("TfmMain", "ConTEXT - [Edit1 *]")
    2. Dim Client As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "MDIClient", Nothing)
    3. Dim Edit As IntPtr = FindWindowEx(Client, IntPtr.Zero, "TfmEditor", "Edit1 *")
    4. Dim TextBox2 As IntPtr = FindWindowEx(Edit, IntPtr.Zero, "TConTEXTSynEdit", "Text")


    Notpad (Windows)
    Gleicher Fehler, aber auch sichtbar in "Edit"

    VB.NET-Quellcode

    1. Dim Hauptfenster As IntPtr = FindWindow("Notepad", "Encrypted.txt - Editor")
    2. Dim TextBox2 As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "Edit", "TEST")
    @noob98 Hole Dir mal das Handle des Hauptfensters, indem Du das Programm Prozess.Start() holst:

    VB.NET-Quellcode

    1. Dim pr As New Process
    2. pr.StartInfo.FileName = "C:\Program Files (x86)\Notepad++\notepad++.exe"
    3. pr.Start()
    4. pr.WaitForInputIdle(1000)
    5. Dim Hauptfenster As IntPtr = pr.MainWindowHandle
    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!
    "Kein Text vorhanden"
    Hier noch mal den Code, falls ich es falsch gemacht hab

    VB.NET-Quellcode

    1. Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim pr As New Process
    3. pr.StartInfo.FileName = "D:\Program Files (x86)\Notepad++\notepad++.exe"
    4. pr.Start()
    5. pr.WaitForInputIdle(1000)
    6. Dim Hauptfenster As IntPtr = pr.MainWindowHandle
    7. Dim Tab As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "SysTabControl32", "Tab")
    8. Dim TextBox2 As IntPtr = FindWindowEx(Tab, IntPtr.Zero, "msctls_updown32", Nothing)
    9. MessageBox.Show(GetText(TextBox2))
    10. End Sub

    VB.NET-Quellcode

    1. MessageBox.Show(GetText(Tab))
    funktioniert.
    "msctls_updown32"
    ist ein falscher Wert.
    Du musst mit EnumWindows() Dein Zielfenster identifizieren.
    Wenn Du insgesamt z.B. 17 (Child-)Fenster findest, ist Dein Zielfenster immer das (z.B.) 13.
    Das Feststellen dieses Index' (hier z.B. 13) ist ein Prozess, den Du vorher mit einem separaten Programm durchführen musst, in Deinem Zielprogramm wäre dann die 13 eine Konstante.
    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!