Interner externer Patternscanner

Discussion in 'Source Code' started by hoschi111, May 1, 2014.

  1. hoschi111

    hoschi111 Active Member Inventar

    Joined:
    Dec 19, 2017
    Messages:
    1,149
    Likes Received:
    8
    Hallo zusammen,
    vor einiger Zeit habe ich einen externen Patternscanner hier veröffentlicht.
    Mit einem kleinen Trick kann man diesen Patternscanner aber um ein vielfaches beschleunigen.

    Wie funktioniert das?
    Ganz einfach: Wir dumpen ein Stück Arbeitsspeicher als Bytearray und führen dann in unserem eigenen Speicher den Patternscan aus.

    Da man meistens ganze Module dumpen möchte (client.dll, steamui.dll, etc...), habe ich dafür eine weitere Funktion geschrieben, die Startadresse und Größe vom gewünschten Modul auslesen kann.

    Code:
     Public Function GetModuleInfo(ByVal modul As String, ByVal returnsize As Boolean) As IntPtr
            Dim Address As IntPtr
            Dim tmp(IntPtr.Size - 1) As Byte
    
            Try
                Dim running As Process() = Process.GetProcessesByName(TargetProcess)
                If running.Length > 0 Then
                    Dim target As Process = running(0)
                    Dim targetModule As ProcessModule = (From pm In target.Modules _
                                                         Where pm.ModuleName.ToLower().Equals(modul.ToLower()) _
                                                         Select pm).FirstOrDefault()
                    If targetModule IsNot Nothing Then
                        If returnsize Then
                            Address = targetModule.ModuleMemorySize
                        Else
                            Address = targetModule.BaseAddress
                        End If
    
                        If IntPtr.Size = 4 Then
                            Address = New IntPtr(Address.ToInt32)
                        Else
                            Address = New IntPtr(Address.ToInt64)
                        End If
                  
                        Return Address
                    End If
                Else
                    Return IntPtr.Zero ' Throw New ArgumentOutOfRangeException("Target process is not running")
                End If
    
            Catch ex As Exception
                ' MessageBox.Show(TargetProcess.ToString & " is not running!")
            End Try
            Return IntPtr.Zero
        End Function
    

    Nun müssen wir ein Modul dumpen:
    Code:
    Dim granddump() as Byte = ReadMemory(Of Byte())(GetModuleInfo("steamui.dll", False), GetModuleInfo("steamui.dll", True), False)
    In Granddump befindet sich nun die komplette steamui.dll (Steam.exe) so wie sie im Augenblick des Dumpens im Arbeitsspeicher war.


    Nun definieren wir unser Pattern (Beispiel):
    Code:
    Dim pattern As Byte() = {&H0, &H0, &H0, &H60, &H9D, &H0}
    Danach die Maske (Beispiel):
    Code:
    Dim mask As String = "x??xx?"

    Jetzt die modifizierte Patternscan-Funktion:
    Code:
     Private Function patternscan(ByVal startindex As Long, ByVal pattern As Byte(), ByVal mask As String, ByVal bytearraytoscan() As Byte) as IntPtr
            Dim maskk(0 To mask.Length - 1) As String
            For i As Integer = 0 To mask.Length - 1
                maskk(i) = mask.Substring(i, 1)
            Next
    
            For i As Integer = 0 To bytearraytoscan.Length
                Dim n(pattern.Length - 1) As Byte
                Array.Copy(bytearraytoscan, i, n, 0, pattern.Length)
                For k As Integer = 0 To n.Length - 1
                    If maskk(k).ToLower = "x" Then
                        If pattern(k) = n(k) Then
                            If k = n.Length - 1 Then
                                Return startindex + i
                            Else
                                Continue For
    
                            End If
                        Else
                            Exit For
                        End If
                        Continue For
                    End If
                Next
    
            Next
            Return 0
    
        End Function
    

    Unsere Adresse, die wir mit dem Pattern suchen wollen, finden wir dann so:
    Code:
    Dim address As Integer = patternscan(0, pattern, mask, granddump)


    VIel Spaß!
     
  2. hoschi111

    hoschi111 Active Member Inventar

    Joined:
    Dec 19, 2017
    Messages:
    1,149
    Likes Received:
    8
    [fix] Rückgabewert der Function "patternscan" hatte keinen definierten Rückgabewert (as Object), geändert in "as IntPtr".
    // IntPtr kann mit ".ToInt32" bzw ".ToInt64" in die gewünschte Größe konvertiert werden.
     
  3. Papa2007

    Papa2007 Guest

    Danke :3
     
  4. hoschi111

    hoschi111 Active Member Inventar

    Joined:
    Dec 19, 2017
    Messages:
    1,149
    Likes Received:
    8
    [update] "Return startindex + i + pattern.Length" in "Return startindex + i" geändert.
    -> Jetzt ist die ausgegebene Adresse der Beginn des Patterns und nicht mehr das Ende.
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.