Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : recherche d'une chaîne de caractères dans la mémoire [ Processeurs / X86 ] (snobysmart)

mardi 8 janvier 2008 à 13:38:30 | recherche d'une chaîne de caractères dans la mémoire

snobysmart

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

mardi 8 janvier 2008 à 20:41:25 | Re : recherche d'une chaîne de caractères dans la mémoire

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

buff = GlobalAlloc(...)
.1
ReadProcessMemory(addr;buff,cbbuf,...)
[ Lien ]
si readok une fonction de recherche que tu peux faire toi meme
addr += cbbuf
->.1 si addrr < MAXADDR
GlobalFree(buff,...)


@++

mercredi 9 janvier 2008 à 09:50:20 | Re : recherche d'une chaîne de caractères dans la mémoire

snobysmart

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 hProcess= le 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


samedi 12 janvier 2008 à 11:57:32 | Re : recherche d'une chaîne de caractères dans la mémoire

patatalo

Membre Club Administrateur CodeS-SourceS
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. @++

dimanche 13 janvier 2008 à 16:55:21 | Re : recherche d'une chaîne de caractères dans la mémoire

snobysmart

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



Cette discussion est classé dans : fonction, recherche, mémoire, caractères, chaîne


Répondre à ce message

Sujets en rapport avec ce message

Chaîne de caractères [ par ghuysmans99 ] Bonjour à tous.Je voudrais savoir comment extraire UN SEUL caractère d'une chaine.Comment fait-on ?Pourriez-vous m'aider ?Merci !! charger n octets en mémoire [ par faresas ] Bonjour;je veux savoir comment lire n octets depuis un flash disque puis les charger en mémoire en utilisant les intérruptions bios en mode réel (16 b Allouement de la mémoire et protection [ par bilaloch ] Bonjour à tous,J'aimerais connaître s'il y a un moyen de savoir si telle adresse de la mémoire vive est protegée, si telle adresse est vide et égaleme Vesa en mode Protégé [ par epineurien ] Voila , ca fait un moment que je souhaite quitter le mode réel , pour passer en mode protégé (faire tenir mon environnement 3d RayTracing dans moins d clavier [ par aboulkhir ] salutla fonction IN al,60 permet de recuperer le scan code de la touche presse est ce qu il n y a pas une autre qui permet de recuperer le code ascii saisie et affichage de caractères [ par SHEPHERD1988 ] salut je viens tout juste de commencer la programmation assembleur depuis une semaine et je veux que mon programme m'affiche un caractère que j'entre aidez moi à ecrire mon tp en masm 6.15 [ par scharapova ] alors  salut à tous je suis une débutante (une vrai débutante) en programmation assembleur,bon  si vous pouvez m aider à :Ecrire un programme assemble Probleme de dll! (arguments...) [ par BlackWizzard ] salut les pro!voila, G une fonction contenu dans une dll mais cette fonction, je ne sait pas comment lui ajouter des arguments...voici un extrait du c Fonction Download [ par Stormy ] StormyQuelqu'un aurait'il connaissance d'une fonction permettant le passage de données (de fichiers plutôt) par le fait d'un socket? Merci et @+ recherche entre 2 chaines de caracteres + VB [ par pilsner31 ] Je vais essayer d'être claire : J'ai 2 liste déroulantes de chaines de caractères et je souhaite effectuer une recherche entre ces 2 chaines. Or le BE


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.