2016-06-13 7 views
0

J'ai besoin d'obtenir l'adresse d'adresse de base d'un .exe qui a une adresse de base aléatoire chaque fois qu'il a commencé. J'ai essayé ceci, mais cela ne semble pas fonctionner:Comment obtenir l'adresse de base d'un autre processus? (ASLR)

int Base = (DWORD)GetModuleHandle("Test.exe"); 

Qu'est-ce qui ne va pas?

+0

Je suppose que non? – Customality

+0

La méthode est correcte dans mon test. Pourriez-vous coller votre code entier? Ou essayez-vous d'obtenir l'adresse de base d'un autre processus? –

+2

Pourquoi pensez-vous que l'appel 'GetModuleHandle' est supposé faire ce que vous voulez? –

Répondre

2

Il semble que vous essayez d'obtenir l'adresse de base d'un autre processus. Malheureusement, GetModuleHandle ne fonctionne que pour les modules dans le processus actuel. Pour atteindre votre objectif, vous devez utiliser PSAPI ou CreateToolhelp32Snapshot pour extraire la liste des modules d'un autre processus. Et l'adresse de base est dans la liste.

+0

@Customality, voir ceci: http://stackoverflow.com/questions/14467229/get-base-address-of-process –

+1

Puisque l'OP va se débrouiller avec la mémoire de cet autre processus de toute façon, une solution plus directe injecterait une DLL (en utilisant [CreateRemoteThread] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms682437.aspx) par exemple). Une fois que vous avez fait irruption dans la maison de quelqu'un d'autre, vous pouvez appeler 'GetModuleHandle (NULL)' pour récupérer l'adresse de base de l'image exécutable qui a été utilisée pour créer le processus. – IInspectable

1

J'ai besoin d'obtenir l'adresse de base/l'adresse du point d'entrée d'un fichier .exe qui a une adresse de base aléatoire à chaque démarrage. Le programme utilise ASLR.

...

je vais l'utiliser pour modifier certains morceaux de mémoire à l'intérieur du processus correct

Afin d'écrire des données dans un autre processus, vous devez utiliser WriteProcessMemory(), qui vous oblige à Ouvrez un HANDLE dans le processus en cours d'écriture.

Vous obtenez ce HANDLE en utilisant OpenProcess(), en demandant PROCESS_VM_OPERATION et PROCESS_VM_WRITE autorisations. OpenProcess() prend un ID de processus en entrée, que vous pouvez obtenir à partir de:

Voir Process Enumeration et Enumerating All Processes.

À aucun moment, vous n'avez besoin de déterminer l'adresse de base du processus en cours d'écriture. Laissez le système garder une trace de cette information pour vous. Tout ce dont vous avez besoin est le HANDLE ouvert au processus.

+0

Euh ... vous avez sûrement besoin de l'adresse de base pour calculer l'adresse virtuelle de la variable statique ou du bloc de code que vous voulez lire ou modifier? (Ce que je suppose que vous pouvez faire en utilisant Module32First/Module32Next.) –

+0

@HarryJohnston: L'adresse passée à 'ReadProcessMemory()' et 'WriteProcessMemory()' est une adresse virtuelle qui est relative à l'adresse de base du processus représenté par le spécifié "POIGNÉE". Ce n'est pas relatif à un module particulier. Ainsi, vous n'avez toujours pas besoin de connaître l'adresse de base du processus, seulement l'adresse virtuelle relative du bloc de mémoire cible dans le processus. Comment obtenez-vous cette adresse est un problème différent. Il peut être statiquement connu à l'avance. Il peut être déterminé dynamiquement en traitant d'autres blocs de mémoire et des pointeurs suivants. C'est un sujet très vaste. –

+0

@HarryJohnston: Pour une variable statique, vous pouvez connaître son décalage fixe dans un module, et oui, vous pouvez récupérer l'adresse de base d'un module dans le processus. À partir de cela, vous pouvez déterminer l'adresse virtuelle de la variable dans le processus. –