Recherche d'une chaîne de caractères dans la mémoire
snobysmart
Messages postés3Date d'inscriptionlundi 7 janvier 2008StatutMembreDernière intervention13 janvier 2008
-
8 janv. 2008 à 13:38
snobysmart
Messages postés3Date d'inscriptionlundi 7 janvier 2008StatutMembreDernière intervention13 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.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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,...)
snobysmart
Messages postés3Date d'inscriptionlundi 7 janvier 2008StatutMembreDernière intervention13 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?
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.
snobysmart
Messages postés3Date d'inscriptionlundi 7 janvier 2008StatutMembreDernière intervention13 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