rechercher array to byte comme cheat engine

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

debutent

Membre
Dec 30, 2015
10
0
21
39
Bonjour,

j'ai refait mon code mais j'arrive pas avoir le mème offset comme cheat engine :
Code:
Public Class Form1
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
    Private Declare Function ReadProcessMemory4 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Byte, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Byte

    Public Function FindPattern(ByVal Process As String, ByVal HEXA As String) As Long
        For dwCurrentAddress As Long = &H1000000 To &H7FFFFFFF Step 1
            If Compare(Process, dwCurrentAddress, HEXA) Then
                Return dwCurrentAddress
            End If
        Next
        Return -1
    End Function

    Private Function Compare(Process As String, Address As Long, HEXA As String) As Boolean
        Dim pTemp As Byte = Nothing
        For i As Integer = 0 To HEXA.Length - 1 Step 1
            pTemp = ReadByte(Process, (Address + i), 4)
            If pTemp = Nothing Then
                Return False
            End If
        Next
        Return True
    End Function
    Public Function ReadByte(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Byte
        If ProcessName.EndsWith(".exe") Then
            ProcessName = ProcessName.Replace(".exe", "")
        End If
        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
        If MyP.Length = 0 Then
            MessageBox.Show(ProcessName & " isn't open!")
        End If
        Dim hProcess As IntPtr = OpenProcess(&H10, 0, MyP(0).Id)
        If hProcess = IntPtr.Zero Then
            MessageBox.Show("Failed to open " & ProcessName & "!")
        End If
        Dim hAddress As Integer
        Dim vBuffer As Byte = Nothing

        hAddress = Address
        ReadProcessMemory4(hProcess, hAddress, vBuffer, nsize, 0)

        Return vBuffer
    End Function


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim HEXA As String = "54 3D 6A 10 00 24 B9 03 8C 48 C9 03 5A 00 00 00"
        Dim MonAddress As Long = FindPattern("Template", HEXA)
        TextBox1.Text = MonAddress.ToString("X8")
    End Sub

Voici en image en dessous,
Comment faire par rapport a mon code avoir le mème offset comme cheat engine?
Merci de votre aide,
 

Attachments

  • Search.jpg
    Search.jpg
    64 KB · Views: 6

Misuki

Git Wizard en freelance
V
Ancien staff
Jun 15, 2012
2,303
66
954
Tu confonds "offset" et "address"
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
Un jour faudrait faire un cours sur les structures de données et les méthodes d'accès.
 

debutent

Membre
Dec 30, 2015
10
0
21
39
ok, merci Evaelis pour cette critique mais les commentaires gardes les pour vous.
je demande comment trouver l'adresse par rapport a mon code hexadécimale = "54 3D 6A 10 00 24 B9 03 8C 48 C9 03 5A 00 00 00"?
Merci de votre réponse,
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
ok, merci Evaelis pour cette critique mais les commentaires gardes les pour vous.
je demande comment trouver l'adresse par rapport a mon code hexadécimale = "54 3D 6A 10 00 24 B9 03 8C 48 C9 03 5A 00 00 00"?
Merci de votre réponse,
Ce n'est pas un commentaire, c'est juste que ta question est souvent posée donc un tutoriel complet pourrait être utile. Tu cherches la réponse non? Donc ça ne devrait pas te déranger si on écrivait un tutoriel là dessus.
Cheat Engine est un outil bien pratique pour trouver facilement l'offset, mais ce n'est pas obligatoirement une chose simple à refaire si tu ne connais pas la structure de la mémoire. Ce commentaire n'est en aucun cas offensif ou dégradant, ce n'est pas comme si la mémoire et ses accès étaient obligatoirement évident.
 

Astropilot

The Lord
V.I.P
V
Jan 6, 2011
9,285
18
1,254
France
Ton code déjà est complètement faux, qui plus est, tu ne ferme pas le handle que tu as ouvert avec OpenProcess.
Au lieu de passer un String en paramètre, converti le en un Array de bytes. Ensuite tu pourra mieux utiliser la fonction de comparaison.
En passant je déconseille le FindPattern en .NET, c'est extrêmement lent selon la taille de l'array & de la mémoire du programme a fouiller (lecture externe de la mémoire c'est lent)
Pour optimiser la vitesse tu peux passer par la lecture de block de mémoire, et ainsi comparer en interne ce qui prendra bien moins de temps.
 

Astropilot

The Lord
V.I.P
V
Jan 6, 2011
9,285
18
1,254
France
j'ai mis en fichier joint un module vb.net contant tout ce qu'il faut pour faire un findpattern.

Tout ce que tu as a faire c'est l'importer dans ton projet et de l'utiliser comme suit (attention au mask !):
Code:
Dim Pattern As Byte() = Array.ConvertAll("MonTextAChercher".ToCharArray(), Function(c) CType(Asc(c), Byte))
Dim Address As Long = FindPattern("MonProcess", &H200000, &H7FFFFF, Pattern, "xxxxxxxxxxxxxxxx")
Console.WriteLine("Addresse du texte: " & Address.ToString("X8"))
 

Attachments

  • FindPattern.zip
    907 bytes · Views: 4

debutent

Membre
Dec 30, 2015
10
0
21
39
Merci de votre réponse, votre code ne fonctionne pas avec mon hexadécimale.
j'avais un deuxième code pour rechercher plus rapidement un texte mais il faut utiliser ManagedWinapi.dll.
voici mon code :
Private Shared Function GetMemoryAddressOfString(searchedBytes As Byte(), p As Process) As Integer
Dim addr As Integer = 0
Dim speed As Integer = 1024 * 64
Dim j As Integer = &H200000
While j < &H7FFFFFFF
Dim mem As ManagedWinapi.ProcessMemoryChunk = New ManagedWinapi.ProcessMemoryChunk(p, j, speed + searchedBytes.Length)

Dim bigMem As Byte() = mem.Read()

For k As Integer = 0 To bigMem.Length - searchedBytes.Length - 1
Dim found As Boolean = True
For l As Integer = 0 To searchedBytes.Length - 1
If bigMem(k + l) <> searchedBytes(l) Then
found = False
Exit For
End If
Next
If found Then
addr = k + j
Exit For
End If
Next
If addr <> 0 Then
Exit While
End If
j += speed
End While
Return addr
End Function

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim tmpByte() As Byte = Encoding.ASCII.GetBytes("vaultLevel91")
Dim p As Process() = Process.GetProcessesByName("Template")
TextBox1.Text = GetMemoryAddressOfString(tmpByte, p(0))
End Sub

je voudrais rechercher en hexadécimale mais je sais pas comment ?
je voudrais ce code pour trouver l'adresse par rapport en hexadécimale(ex: 76 00 61 00 75 00 6C 00 74 00 4C 00 65 00 76 00 65 00 6C 00 39 00 31)?
Merci d'avance,
 

Astropilot

The Lord
V.I.P
V
Jan 6, 2011
9,285
18
1,254
France
Merci de votre réponse, votre code ne fonctionne pas avec mon hexadécimale.

Il faut remanier ton code hexa de string en byte()

Exemple:
Code:
Dim codeHex As String = "55 8E 45"
Dim mArray As String() = codeHex.Split(" ")
        Dim mPattern(mArray.Length - 1) As Byte
        For i As Integer = 0 To mArray.Length - 1
            mPattern(i) = Convert.ToByte(mArray(i), 16)
        Next

Il te reste plus qu'a passer mPattern en argument dans mon FindPattern ^^
 

debutent

Membre
Dec 30, 2015
10
0
21
39
n'oublier pas utiliser "ManagerWinapi.dll"
voici mon code modifier :
Public Class Form1
Dim valeur As String
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim p As Process() = Process.GetProcessesByName("Template")
If p.Length = 0 Then
MessageBox.Show(p(0).Id & "Is not Open")
Else
Dim search() As Byte = {&H76, &H0, &H61, &H0, &H75, &H0, &H6C, &H0, &H74, &H0, &H4C, &H0, &H65, &H0, &H76, &H0, &H65, &H0, &H6C, &H0, &H39, &H0, &H31}
TextBox1.Text = "&H" & Hex(GetMemoryAddressOfString(search, p(0))).ToString
valeur = "&H" & Hex(TextBox1.Text - 64).ToString
TextBox2.Text = valeur
End If
End Sub

Private Shared Function GetMemoryAddressOfString(searchedBytes As Byte(), p As Process) As Integer
Dim addr As Integer = 0
Dim speed As Integer = 1024 * 64
Dim j As Integer = &H200000
While j < &H7FFFFFFF
Dim mem As ManagedWinapi.ProcessMemoryChunk = New ManagedWinapi.ProcessMemoryChunk(p, j, speed + searchedBytes.Length)
Dim bigMem As Byte() = mem.Read()
For k As Integer = 0 To bigMem.Length - searchedBytes.Length - 1
Dim found As Boolean = True
For l As Integer = 0 To searchedBytes.Length - 1
If bigMem(k + l) <> searchedBytes(l) Then
found = False
Exit For
End If
Next
If found Then
addr = k + j
Exit For
End If
Next
If addr <> 0 Then
Exit While
End If
j += speed
End While
Return addr
End Function

End Class
voici en image :
Search.jpg

dans valeur comment convertir adresse pas la valeur?
Merci de votre réponse,