Bonjour à tous

Je cherche depuis plusieurs jours à récupérer l'adresse mémoire d'un processus. En utilisant la propriété "BaseAddress" du module principal de l'instance Process souhaitée, je n'obtient généralement que des valeurs égalent à &H400000. Après plusieurs recherches, j'ai appris que c'était une valeur "standard" que l'OS retourne pour tous les processus ; c'est une adresse virtuelle il me semble.
Cependant, je cherche l'adresse PHYSIQUE du processus dans la mémoire. Je ne peux pas donc pas utiliser les fonctions CLR pour arrivé à mes fins (du moins, je n'en connais pas).

Je me suis alors penché sur les fonctions systèmes, notamment le OpenProces() et le GetModuleInformation() qui semble être la fonction adhoc pour récupérer l'adresse. Cependant, quant je tente d'utiliser cette fonction (GetModuleInformation), j'obtiens un déséquilibre de la pile, le problème étant certainement que la déclaration du prototype est inexacte.

Voici la déclaration de la fonction externe que j'utilise :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
Imports System.Runtime.InteropServices
Imports System.Reflection
 
Public Structure MODULEINFO
        Public lpBaseOfDll As IntPtr
        Public SizeOfImage As UInt32
        Public EntryPoint As IntPtr
    End Structure
 
 <DllImport("psapi.dll")> _
    Private Function GetModuleInformation(<[In]> hProcess As IntPtr, <[In]> hModule As IntPtr, <Out> moduleInfo As MODULEINFO, <[In]> tailleModuleInfo As UInt32) As [Boolean]
Avec son utilisation :

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
 
'Objet processus standard
Dim  _targetProcess As Process 
 
'Pointeur obtenu par la fonction OpenProcess appelé dans la fonction TryAttachToProcess
Dim _targetProcessHandle As IntPtr
Dim result As Boolean = false
Dim info As New MODULEINFO
 
'Ouverture du process => pas de soucis ici
'Initialisation correcte de _targetProcess et _targetProcessHandle
TryAttachToProcess("foo.exe", _targetProcess, _targetProcessHandle)
 
'Récupération des données du module => Echec
result = GetModuleInformation(_targetProcessHandle,  _targetProcess.MainWindowHandle, info, Marshal.SizeOf(info.GetType))
Les questions que je me posent alors sont :
- Y a t-il une façon bien plus simple de récupérer l'adresse physique d'un processus (via le CLR) ?
- Est-ce que mon proto de GetModuleInformation est correcte, et si non, lequel est-ce ?
- Est-ce que j'utilise correctement la fonction (bons types de paramètre et de valeur, notamment sur le second paramètre) ?


Si quelqu'un pouvait éclairer ma lanterne et éventuellement me donner un exemple, je le remercie par avance

Bien cordialement