10
votes

Est-il possible de lire la mémoire de processus d'un processus 64 bits à partir d'une application 32bits?

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.

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?

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.


0 commentaires

5 Réponses :


-4
votes

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.


2 commentaires

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




3
votes

la bibliothèque wow64ext semble avoir résolu ce problème et propose une fonction ReadProcessMemory64 L'extension Visual studio VSDebugTool semble Utilisez cette bibliothèque et travaille pour moi avec des processus 64 bits.

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.


0 commentaires

15
votes

C'est possible.

Pour un exemple, vous pouvez vous référer à l'excellent échantillon de la réponse du tofucoder . Pour un autre exemple, vous pouvez renvoyer à ce lien .

Pour expliquer pourquoi cela fonctionne réellement s'il vous plaît Vérifiez ce fil .

Un autre échantillon peut être trouvé ici .

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 ntdll.dll est également chargée dans une partie du processus 32 bits dans Wow Wow64 Emulator. Il a une fonction appelée ntreadvirtualmorior avec le même prototype que readprocessmemory64 xxx

L'adresse est de 64 bits longs et Ainsi, l'espace d'adressage virtuel total du processus 64 bits peut être référé.

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: ldrgetprocedeDreadddress . Son prototype est identique à celui de getProcaddress : xxx

Nous devons examiner le répertoire d'exportation de x64 ntdll.dll et manuellement trouvé cette fonction d'entrée de cette fonction. Ensuite, nous pouvons obtenir une adresse de toute autre fonction.

Une autre question est laissée à découvert jusqu'à présent: comment obtenir une adresse de démarrage de x64 ntdll.dll ? Nous devons marcher manuellement sur le X64 PEB 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.

Tout cela est couvert dans l'échantillon du premier lien. Variantes alternatives avec usage de NTREADVIRTUALMEMORY & NTWOW64ReadVirtualMemory64 Les fonctions sont fournies dans les secondes et troisième liaisons (ainsi que des moyens alternatifs d'obtenir une adresse de PEB).

< 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 ntdll.dll 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 ).

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 Unlocker , processhacker ou ProcessExplorer , 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.


0 commentaires

-4
votes

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);


3 commentaires

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 sont 32 bits en taille max. Peu importe que vous stockiez l'adresse cible 64 bits dans une variable DWord64 , 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 () , il ne correspond pas à un pointeur 32 bits.