IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

ReadMemoryProcess, 0 byte lu


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    zaz
    zaz est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut ReadMemoryProcess, 0 byte lu
    Bonjour,

    Je débute en asm sous FAT ASSEMBLEUR et cherche un peu d'aide pour lire le contenu d'une région de mémoire dans "buffer"
    La fonction ReadMemoryProcess() me retourne 0 au lieu de la taille de la région. Il semblerait que mon buffer ne soit pas initialisé à la bonne taille mais je ne sais pas comment m'y prendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    FORMAT PE GUI 4.0
    entry start
     
    include 'win32ax.inc'
     
    ; Structure pour VirtualQuery()
    struct MEMORY_BASIC_INFORMATION 
       BaseAddress        dd  ? 
       AllocationBase     dd  ? 
       AllocationProtect  dd  ? 
       RegionSize         dd  ? 
       State              dd  ? 
       Protect            dd  ? 
       Type               dd  ? 
    ends
     
     
    section '.data' data readable writeable
     
       mbi          MEMORY_BASIC_INFORMATION
       hwnd         dd ?
       procid       dd ?
       phandle      dd ?
       procname     db 'MonAppli',0
       appname      db 'TEST',0
       noprocmsg    db 'Veuillez lancer MonAppli !',0
       scanaddr     dd ?
       buffmsg      db ?
       bytelu       dd ?
       buffer       db ?
     
     
    section '.code' code readable executable
     
       start:
            invoke  FindWindowA,0,addr procname
            cmp     eax,0
            je      noprocess
            mov     [hwnd],eax
            invoke  GetWindowThreadProcessId,[hwnd], addr procid
            invoke  OpenProcess,PROCESS_ALL_ACCESS, 0, [procid]
            mov     [phandle],eax
            mov     [scanaddr],0
     
       scan:
            cmp     [scanaddr],7FFFFFFFh
            ja      endscan
            invoke  VirtualQueryEx,[phandle],[scanaddr],mbi,4*7
            cmp     [mbi.State],MEM_COMMIT
            jne     incscan
            invoke  ReadProcessMemory,[phandle],[mbi.BaseAddress],buffer,[mbi.RegionSize],bytelu
            invoke  sprintf,buffmsg,"Adresse %x Taille %x  Byte lu: %d",[mbi.BaseAddress],[mbi.RegionSize],[bytelu]
            invoke  MessageBox,0,buffmsg,appname,MB_OK
     
       incscan:
            mov     eax,[scanaddr]
            add     eax,[mbi.RegionSize]
            mov     [scanaddr],eax
            jmp     scan
     
       endscan:
            invoke  MessageBox,0,"Fin du scan !",appname,MB_OK
            jmp exit
     
       noprocess:
            invoke  MessageBox,0,noprocmsg,appname,MB_OK
            jmp exit
     
       exit:
            invoke  ExitProcess,0
     
     
    section '.idata' import data readable writeable
     
       library kernel,'KERNEL32.DLL',\
               user,'USER32.DLL',\
               msvcrt,'MSVCRT.DLL'
     
       import kernel,\
              OpenProcess,'OpenProcess',\
              VirtualQueryEx,'VirtualQueryEx',\
              ReadProcessMemory,'ReadProcessMemory',\
              WriteProcessMemory,'WriteProcessMemory',\
              ExitProcess,'ExitProcess'
     
       import user,\
              FindWindowA,'FindWindowA',\
              GetWindowThreadProcessId,'GetWindowThreadProcessId',\
              MessageBox,'MessageBoxA'
     
       import msvcrt,\
              sprintf,'sprintf'

  2. #2
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    comme il n'y a pas des masse de commentaires (et que j'ai un peu la flemme de faire de la rétro ingéniérie) j'arrive pas a comprendre ce que réalise ton programme.....

    selon la doc que j'ai trouvé ici https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx la fonction ne lit que si elle a l'autorisation de la faire qu'est ce que tu essaye de lire comme zone mémoire exactement?

  3. #3
    zaz
    zaz est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Je cherche à lire les régions mémoires d'un processus.

    Par exemple, remplace ligne 25
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procname     db 'MonAppli',0
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procname     db 'Solitaire',0
    pour examiner le processus solitaire.exe.

    Pour faire simple, je recherche la fenêtre du solitaire, je récupère son PID et j'ouvre le process avec les droits adéquats. Ensuite, pour la mémoire allouée au process, de 0000000 à 7FFFFFFF, je récupère les attributs de chaque région de mémoire que me retourne VirtualQueryEx dans MEMORY_BASIC_INFORMATION.
    Cela fonctionne jusque là

    Cependant, je voudrais lire dans buffer le contenu de chaque région et c'est là que ça va pas. ReadProcessMemory me retourne zero byte lu ...
    Si j'initialise le buffer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer       db 500000 dup (?)
    ça fonctionne. Mais il me semble préférable d'allouer la taille juste nécessaire à buffer, soit [mbi.regionSize].
    La fonction ReadMemoryProcess() va me retourner le contenu de la région mémoire dans buffer et une nouvelle région peut avoir une taille différente de la précédente. buffer doit donc être initialisé avec la nouvelle taille avant chaque appel de ReadMemoryProcess(). Et je ne sais pas comment faire ça ...

  4. #4
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    je comprend mieux...

    d'abord quelques précisions (ptêtre que t'est déja au courant mais je préfère préciser)
    l'instruction: reserve 1 octet d'une valeur initiale aléatoire a l'adresse "buffer"
    l'instruction: reserve 5000 octet d'une valeur intiale aléatoire a l'adresse "buffer"

    ce qui se passe lorsque que tu as réservé qu'un seul octet pour ta zone tampon, c'est que la sous fonction detecte qu'il n'y as pas assez de place pour y ecrire les datas, et pour eviter l'ecran bleu la sous fonction n'y ecrit rien. dans l'autre cas tu as probablement reservé plus de mémoire qu'il n'en faut donc la sous fonction accepte d'y écrire les data

    ce que je te conseillerai de faire c'est de rechercher si il existe un moyen de modifier la taille de ton segment de data si oui tu place ton buffer a la fin de la zone data (c'est déja le cas en plus) et une fois que tu as determiné ce dont tu avait besoin tu augmente la taille de ta zone de data d'autant que tu en as besoin pour pouvoir y lire/écrire les données de ton choix

    la solution la plus simple c'est de reserver une zone bien plus grande qu'il y a besoin mais ça consomme des ressources....

  5. #5
    zaz
    zaz est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    J'ai résolu mon problème en modifiant dynamiquement la taille du buffer à l'aide de GlobalAlloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     invoke  GlobalAlloc,GMEM_MOVEABLE,[mbi.RegionSize]
            mov     [buffer], eax
            invoke  GlobalLock, eax
            invoke  ReadProcessMemory,[phandle],[mbi.BaseAddress],eax,[mbi.RegionSize],bytelu
            invoke  sprintf,buffmsg,"Adresse %x Taille %x  Byte lu: %x",[mbi.BaseAddress],[mbi.RegionSize],[bytelu]
            invoke  MessageBox,0,buffmsg,appname,MB_OK
            mov     eax,[buffer]
            invoke  GlobalFree,eax
    Merci encore de ton aide.
    Bon code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Socket][File] Envoyer un tableau de byte
    Par itsmii dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 30/01/2014, 09h10
  2. [VB6]ecrire une chaine de byte dans la base de registre
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 17/12/2008, 10h50
  3. [C#] Conversion d'un byte[] en byte *
    Par karsh dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/12/2004, 10h53
  4. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42
  5. transtyper ^dword en ^byte ?
    Par - Robby - dans le forum Langage
    Réponses: 3
    Dernier message: 28/10/2003, 00h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo