IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lire une adresse avec VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 33
    Par défaut Lire une adresse avec VBA
    Bonjour tout le monde

    Il y a quelque temps, j'ai demandé comment on déclare un byte sur VBA, et j'ai bien eu ma réponse (c'était ici : http://www.developpez.net/forums/d16...e-via-vba-vb6/ )
    Depuis, j'essaie d'utiliser ce que l'on m'a appris pour faire une fonction universelle qui me permettra de trouver une "adresse dynamique" à partir d'une adresse statique (c'est à dire une base address + des pointers).

    Donc comme vous vous en doutez... J'ai essayé de le faire tout seul, en vain...
    Je pense vraiment ne pas être loin :

    Mon avancement VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Public Const PROCESS_ALL_ACCESS = &H1F0FFF
     
    Public Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal SomeValueIsStoredHere As Long, lpdwProcessId As Long) As Long
    Public Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare PtrSafe Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Public Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long
    Public Declare PtrSafe Function GetKeyPress Lib "user32" Alias "GetAsyncKeyState" (ByVal key As Long) As Integer
    Public Declare PtrSafe Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
     
     
     
    Sub AppelerMacrotestGetPointed()
    Dim SomeValueIsStoredHere As Long, SomeValueIsStoredHereToo As Long, SomeValue As LongPtr   ' Ici on déclare tout ce qui va me permettre de trouver le Handle du jeu en question : Assault Cube
    SomeValueIsStoredHere = FindWindow(vbNullString, "AssaultCube")
    GetWindowThreadProcessId SomeValueIsStoredHere, SomeValueIsStoredHereToo
    SomeValue = OpenProcess(PROCESS_ALL_ACCESS, False, SomeValueIsStoredHereToo)
    Call GetPointedAddr(SomeValue, &H50F4F4, &H34) 'Appel de la fonction pour trouver l'adresse dynamique du jeu "AssaultCube" dont la base address est "50F4F4" et le pointer est "34"
    End Sub
     
     
    Public Function GetPointedAddr(ByVal BFhandle As LongPtr, ByVal BaseAddr As LongPtr, ByVal Offs0 As Long) As Long
    Dim TempBuf(4) As Byte 'Big up à Jouad et Docmarti
    Dim Message1 As String ' Lecture de ce que l'on vient de lire dans Tempbuf.
     
            ReadProcessMemory BFhandle, BaseAddr, TempBuf, 4, 0&
     
     
     
    '''''''''''''''''''''Encore merci à Docmarti, grâce à ce passage j'ai pu voir si j'arrivais à lire quoique ce soit''''''''''''''''''''''''''
     
    Message1 = ""
    For i = 0 To 4
            Message1 = Message1 & "TempBuf(" & i & ")= " & Hex$(TempBuf(i)) & _
                    "          décimale : " & TempBuf(i) & _
                    "          octale : " & Oct(TempBuf(i)) & vbCrLf
    Next i
    MsgBox Message1
     
     
        End Function
    Je pense que mon code est bon, le problème doit très probablement venir de ma déclaration de "Read Process Memory", j'avais essayé quelque chose comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare PtrSafe Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As LongPtr, ByVal lpBaseAddress As LongPtr, ByVal lpBuffer() As Byte, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Boolean
    Voila tout, j'espère avoir été clair Si ça peut aider, il y a le code que j'essaie de faire en VB.net et en C# sur le lien que j'ai donné en haut, message #3

    PS: Je fais ça sur le jeu AssaultCube, je m'en fiche de ce jeu. Je le prends car c'est une "plateforme" très pratique pour faire mes tests. Je pourrais faire mes tests sur un logiciel de compta, mais j'ai pas envie de foutre le bordel dans ma boite ^^

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    sans conviction!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     Public Const PROCESS_ALL_ACCESS = &H1F0FFF
     #If vba7 Then
        Public Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal SomeValueIsStoredHere As Long, lpdwProcessId As Long) As Long
        Public Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
        Public Declare PtrSafe Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
        Public Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
        Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long
        Public Declare PtrSafe Function GetKeyPress Lib "user32" Alias "GetAsyncKeyState" (ByVal key As Long) As Integer
        Public Declare PtrSafe Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    #Else
        Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal SomeValueIsStoredHere As Long, lpdwProcessId As Long) As Long
        Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
        Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
        Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long
        Public Declare Function GetKeyPress Lib "user32" Alias "GetAsyncKeyState" (ByVal key As Long) As Integer
        Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    #End If
     
    Sub AppelerMacrotestGetPointed()
    Dim SomeValueIsStoredHere As Long, SomeValueIsStoredHereToo As Long, SomeValue As Long   ' Ici on déclare tout ce qui va me permettre de trouver le Handle du jeu en question : Assault Cube
    SomeValueIsStoredHere = FindWindow(vbNullString, "AssaultCube")
    GetWindowThreadProcessId 10, SomeValueIsStoredHereToo
    SomeValue = OpenProcess(PROCESS_ALL_ACCESS, False, SomeValueIsStoredHereToo)
    Call GetPointedAddr(SomeValue, &H50F4F4, &H34)   'Appel de la fonction pour trouver l'adresse dynamique du jeu "AssaultCube" dont la base address est "50F4F4" et le pointer est "34"
    End Sub
    Public Function GetPointedAddr(ByVal BFhandle As Variant, ByVal BaseAddr As Variant, ByVal Offs0 As Variant) As Long
    Dim TempBuf 'Big up à Jouad et Docmarti
    Dim Message1 As String ' Lecture de ce que l'on vient de lire dans Tempbuf.
     
     
            ReadProcessMemory BFhandle, BaseAddr, TempBuf, 4, 0&
     
     
    '''''''''''''''''''''Encore merci à Docmarti, grâce à ce passage j'ai pu voir si j'arrivais à lire quoique ce soit''''''''''''''''''''''''''
     
     
    Message1 = ""
    For i = 0 To 4
            Message1 = Message1 & "TempBuf(" & i & ")= " & Hex$(TempBuf(i)) & _
                    "          décimale : " & TempBuf(i) & _
                    "          octale : " & Oct(TempBuf(i)) & vbCrLf
    Next i
    MsgBox Message1
    End Function
    voilà ce que j'ai trouvé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByRef lpBaseAddress As Long, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
     
    Private Sub UserForm_Initialize()
    Dim hwnd As Long ' Holds the handle returned by FindWindow
    Dim pid As Long ' Holds the Process Id
    Dim pHandle As Long ' Holds the Process Handle
    Dim str As String * 20 ' String to hold display text
    Dim test As Long ' this var is supposed to hold the value in the memory address
    Dim TempBuf, BaseAddr, BFhandle
    ' First get a handle to the "game" window
    hwnd = FindWindow(vbNullString, Me.Name)
    If (hwnd = 0) Then Exit Sub
    ' We can now get the pid
    GetWindowThreadProcessId hwnd, pid
    ' Use the pid to get a Process Handle
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
     
     
    ' Now we can read from memory
    ' ReadProcessMemory BFhandle, &H50F4F4, TempBuf, 4, 0&
    test = ReadProcessMemory(pHandle, &H80B910, str, 0&, 20)
    ' And display the string in our textboxes
    Text1.Text = hwnd
    Text2.Text = pid
    Text3.Text = pHandle
    Text4.Text = str
    Text5.Text = test
    End Sub
    Dernière modification par Invité ; 25/10/2016 à 11h02.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 33
    Par défaut
    Merci beaucoup pour le temps consacré.

    Je suis impatient de pouvoir jeter un coup d'œil (suis au travail), car vraiment ça commençait à me peser :/

    Y a quelques petits trucs que je comprends pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim str As String * 20 ' String to hold display text
    Comment peut-on faire du texte *20?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TempBuf, BaseAddr, BFhandle
    Je savais pas qu'on peut déclarer des variables sans donner de type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = ReadProcessMemory(pHandle, &H80B910, str, 0&, 20)
    je comprends pas pourquoi le str est un string, ça devrait être un byte, on essaie de trouver comment l'adresse "s'appelle" (Par exemple "50F4F4") , non pas la valeur de cette adresse, je me trompe?


    Encore merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Windows Xp par exemple dispose de 850 Api, qu'il faut connaitre ou pas!

    en tout cas difficile de les appréhender!

    disposant de Visual studio 6 j'utilise l’exportateur d'Api et je récupère le code , si je trouve pas je passe par google.

    je ne me pose pas trop de question dans ces cas là, en général a fonctionne.

    dans le cas prisent, je dirai ça manchote d'ou mon sans conviction.

    Comment peut-on faire du texte *20?
    Code ici je taille le bufer à 100 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    Dim a As String * 100
    Debug.Print Len(a)
    End Sub

    je savais pas qu'on peut déclarer des variables sans donner de type.
    par défaut les variable sont variant! un Byte me jetait sur lpBuffer As Any alors j'ai mis variant et ReadProcessMemory se débrouille avec ça!

    dans mas tests, ReadProcessMemory(pHandle, &H80B910, str, 0&, 20)str me retourne vide pas fière!

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 33
    Par défaut
    Merci pour les infos.

    Ah mince ça me fait un mauvais ascenseur émotionnel le fait que ton test ne marche pas :/

    À vrai dire je me rends compte qu'à aucun moment je ne t'ai donné la déclaration de read process memory du code VB.net qui marche.
    Peut être qu'en se contentant de traduire ça pourrait marcher?

    Je pars du boulot je te donne ça dès que j'arrive.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ok

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Géolocalisation d'une adresse avec Excel et Google sans VBA
    Par Philippe Tulliez dans le forum Contribuez
    Réponses: 9
    Dernier message: 09/06/2019, 15h10
  2. [XL-2010] Changer l'adresse d'une cellule dans une formule avec VBA
    Par Danner dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2016, 10h12
  3. [C#] Lire une video avec axwindowsmediaplayer
    Par padodanle51 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/05/2006, 12h37
  4. Pb pour encoder une adresse avec des &
    Par fpouget dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2006, 10h41
  5. Insertion d'une date dans une table avec vba
    Par skeut dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2006, 09h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo