Recherche d'une chaîne de caractères dans la mémoire

snobysmart Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 13 janvier 2008 - 8 janv. 2008 à 13:38
snobysmart Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 13 janvier 2008 - 13 janv. 2008 à 16:55
Bonjour chers amis assembleurs,

Je cherche assiduement une méthode pour faire une recherche de caractères ou de code dans la mémoire vive globale (Windows XP, 2000) comme le fait par exemple OllyDbg (fonction "search" dans le "memory map"), et obtenir l'adresse de cette chaîne. En désassemblant OllyDbg par IDA, je remarque que le débugger utillise la fonction CopyMemory mais je n'arrive pas à voir si c'est la bonne fonction utilisée pour faire le "search" en dumpant toute la mémoire.

Si quelqu'un a une idée...

Cordialement
smarty

4 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
8 janv. 2008 à 20:41
salut,

buff = GlobalAlloc(...)
.1
ReadProcessMemory(addr;buff,cbbuf,...)
http://msdn2.microsoft.com/en-us/library/ms680553(VS.85).aspx
si readok une fonction de recherche que tu peux faire toi meme
addr += cbbuf
->.1 si addrr < MAXADDR
GlobalFree(buff,...)

@++
0
snobysmart Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 13 janvier 2008
9 janv. 2008 à 09:50
Many thanks Patatalo pour tes lumières,


Si j'ai bien compris:

 1) je m'alloue une zone mémoire par GlobalAlloc (GMEM_FIXED,taille de la zone), en retour j'ai un pointeur sur cette zone pour mon dump


2) puis j'appelle ReadProcessMemory( __in  hProcess, __in  lpBaseAddress,  __out   lpBuffer,  __in    nSize,  Null)avec hProcessle handle du processus que je veux dumper et que j'ai obtenu par OpenProcess(..) en mode PROCESS_VM_READ, et lpBuffer le pointeur que j'ai obtenu en 1) avec la taille nSize

3) je teste si EAX!=0 et si oui, j'appelle ma fonction de recherche de chaîne dans mon dump à partir de lpBuffer

4) sinon j'incrémente lpBaseAdress++ tant que lpBaseAdress<MAXADDR et je retourne en 2)

J'ai cependant deux questions:
a) comment obtenir MAXADDR, l'adresse butoire du processus et lpBaseAdress, l'adresse où je peux commencer la lecture?
b) est-ce que le handle que j'ai obtenu par OpenProcess(..) me permet de dumper toutes les zones mémoires des objets créés par le module (dans ce cas on suppose que j'ai demandé le handle d'un module.exe avec OpenProcess)?
et si non comment procéder pour connaître l'adresse des zones mémoires des objets créés par le module pour faire ma recherche de chaîne dedans? 

Merki !




 






smarty
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
12 janv. 2008 à 11:57
re,


0x00000000 a 0x003FFFFF -> system memory (4Mo)
0x00400000 a 0x7FFFFFFF -> process memory (2Go-4Mo)
0x80000000 a 0xBFFFFFFF -> shared memory (1Go)
0xC0000000 a 0xFFFFFFFF -> system memory (1Go)

la fonction VirtualQueryEx te permettra d'obtenir des informations supplementaires pour optimiser la recherche.

@++
0
snobysmart Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 13 janvier 2008
13 janv. 2008 à 16:55
En effet, VirtualQueryEx (hProcess, lpAddress, lpBuffer, dwLength) me permet d'obtenir les champs: 
               BaseAddress;
               AllocationBase;
               AllocationProtect;
               RegionSize;
               State;
               Protect;
               lType;
dans la structure pointée par lpBuffer, en lui passant le Handle hProcess du processus demandé et obtenu précédemment.
Afin d'optimiser la recherche, on peut faire un mapping de la mémoire du processus en partant de BaseAddress = 0 et en incrémentant BaseAddress de RegionSize. Si AllocationBase != 0 ET que State = MEM_COMMIT (1000h), alors on est dans un segment du processus et on peut rechercher, voir modifier le code si on a le bon handle. Je suis en train d'écrire le module ... Ah oui, ne pas oublier de s'aligner sur 4 pour la structure MEMORY_BASIC_INFORMATION sous peine de défaut de la fonction (implémentation adresses paires).
J'étais parti sur le principe d'attacher le processus et de faire un GetProcessHeaps dessus, ou de lire ses tas à l'aide de son PEB (7FFDF000h), mais le VirtualQueryEx est beaucoup plus simple...
Merci encore à Patatalo

smarty
0
Rejoignez-nous