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 :
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 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]
Les questions que je me posent alors sont :
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))
- 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
Partager