sous Windows 64 Bit, j'ai un processus de 32 bits qui lit la mémoire d'autres processus 32 bits et j'aimerais aussi lire les processus 64 bits aussi. P>
ReadProcessMemory est utilisé pour lire la mémoire, mais il a une limitation de 32 bits. Y a-t-il un moyen de faire l'équivalent d'une téléprocession de lecture sur un processus 64 bits? P>
Je sais que je pouvais écrire un processus 64 bits et le lancer de mon processus de 32 bits pour faire le travail, mais je me demande s'il y a une autre option afin que je n'ai pas besoin d'écrire un processus 64 bits. < / p>
merci. p>
5 Réponses :
Il n'y a aucun moyen de contourner cela. Une solution consiste à arrêter d'utiliser l'émulateur WOW64 et d'écrire un processus 64 bits. Une autre solution consiste à utiliser IPC plutôt que lecture directe de la mémoire. P>
Vous pouvez écrire un pilote qui le fait, mais compte tenu des alternatives qui suit. Il suffit d'écrire un processus d'assistance 64 bits.
En fait, il y a un moyen en utilisant le système WOW64. Github.com/RWFPL/rewolf-WOW64ext
la bibliothèque wow64ext semble avoir résolu ce problème et propose une fonction Quoi qu'il en soit, il ne devrait pas être impossible, car le débogueur (32 bits) Visual Studio gère très bien très bien. p> ReadProcessMemory64 code> L'extension Visual studio VSDebugTool semble Utilisez cette bibliothèque et travaille pour moi avec des processus 64 bits. P>
C'est possible.
Pour un exemple, vous pouvez vous référer à l'excellent échantillon de la réponse du tofucoder Pour expliquer pourquoi cela fonctionne réellement s'il vous plaît Vérifiez ce fil . P> Un autre échantillon peut être trouvé ici . p> Toute l'astuce consiste à appeler une version 64 bits de la fonction LectureProcessMemorory. Intuitivement, ce n'est pas une option de processus 32 bits, mais le lien ci-dessus explique: X64 version de L'adresse est de 64 bits longs et Ainsi, l'espace d'adressage virtuel total du processus 64 bits peut être référé. P> Vous pouvez vous demander comment obtenir l'adresse de cette fonction. C'est quand une autre fonction de ntdll.dll est utilisée à portée de main: Nous devons examiner le répertoire d'exportation de x64 Une autre question est laissée à découvert jusqu'à présent: comment obtenir une adresse de démarrage de x64 Tout cela est couvert dans l'échantillon du premier lien.
Variantes alternatives avec usage de < EM> Résumé: Il est possible d'interagir avec le processus X64 de X86 un. Il peut être fait soit avec appel direct à la version X64 de la fonction (à partir de x64 ps On peut dire que c'est sans papiers et ressemble plus à un piratage - mais cela n'est tout simplement pas officiellement documenté. Doux comme ntdll.dll code> est également chargée dans une partie du processus 32 bits dans Wow Wow64 Emulator. Il a une fonction appelée
ntreadvirtualmorior code> avec le même prototype que
readprocessmemory64 p>
ldrgetprocedeDreadddress code>. Son prototype est identique à celui de
getProcaddress code>: p>
ntdll.dll code> et manuellement trouvé cette fonction d'entrée de cette fonction. Ensuite, nous pouvons obtenir une adresse de toute autre fonction. P>
ntdll.dll code>? Nous devons marcher manuellement sur le X64
PEB CODE> STRUCTURE DE NOS PROCEDURE ET DE LA LISTE DES MODULES CHARGÉES DE TRAVERSE - Comme l'une des variantes. Et comment obtenir l'adresse de PEB? Veuillez vous référer aux liens ci-dessus, sans déborder cet article avec trop de détails. P>
NTREADVIRTUALMEMORY CODE> &
NTWOW64ReadVirtualMemory64 Code> Les fonctions sont fournies dans les secondes et troisième liaisons (ainsi que des moyens alternatifs d'obtenir une adresse de PEB). P>
ntdll.dll code> qui est chargé dans le cadre du processus WOW64) ou avec l'appel de la fonction X86 spécifique qui est destiné à travailler avec Processus X64 (nommément
NTWOW64ReadVirtualMemory64 code>). em> p>
Unlocker code>,
processhacker code> ou
ProcessExplorer code>, par exemple, utilise ces fonctionnalités non documentées (et bien d'autres), et c'est à vous de décider de décider, bien sûr. p> p>
ReadProcessMemory peut lire n'importe quelle taille de la mémoire comprenant des processus X86 Lecture des processus x64.
Vous pouvez sans problème, dans un programme X86, procédez comme suit: P>
DWORD64 test = 0; ReadProcessMemory(hProcess, (LPCVOID)lpBaseAddress, &test, sizeof(DWORD64), NULL);
NSIZE Spécifie le nombre d'octets à lire à partir du processus cible et non de la taille du pointeur, cf. MSDN.MicRosoft.com/fr -US / Bibliothèque / Windows / Desktop / ...
@hillu je n'ai jamais dit ça. Je lis les processus de X86 et X64 tout le temps sans problème.
Dans une application 32 bits, des pointeurs tels que LPCVoid code> sont 32 bits en taille max. Peu importe que vous stockiez l'adresse cible 64 bits dans une variable code> DWord64 CODE>, elle sera tronquée lors de la coulée de type sur un pointeur 32 bits. Vous ne pouvez donc pas simplement lire une adresse de mémoire cible de 64 bits supérieure à 0xFFFFFFFF à partir d'une application 32 bits à l'aide de la version 32 bits de
ReadProcessMemory () Code>, il ne correspond pas à un pointeur 32 bits.