Como ler a memória de outro processo com ReadProcessMemory

Tempo de leitura: 2 minutos

No artigo passado, falei sobre ponteiros e mostrei como acessar a memória local(do processo atual). Mas, isso não é o suficiente para acessar a memória de outros processos, pois, como mencionado anteriormente, o sistema operacional não permite que acessemos de forma direta, através de ponteiros. Para isso, existe uma excelente alternativa que é a função ReadProcessMemory.

Neste artigo lhe apresentarei a função da API do Windows chamada ReadProcessMemory.

Leitura e tratamento de memória é uma poderosa ferramenta. Muitos gostariam de saber, mas poucos sabem como fazê-lo e, principalmente, tratar o resultado.

Com esta API torna-se capaz a leitura de dados da memória de um processo específico. Exatamente, poderemos ler e tratar a memória de outro processo.

ReadProcessMemory é um problema para muitos programadores inexperientes que almejam grandes criações, em sua maioria Memory Scanners(Cheat Engine, por exemplo).

Segundo o MSDN, as especificações da ReadProcessMemory são:

BOOL WINAPI ReadProcessMemory(
  __in   HANDLE hProcess,
  __in   LPCVOID lpBaseAddress,
  __out  LPVOID lpBuffer,
  __in   SIZE_T nSize,
  __out  SIZE_T *lpNumberOfBytesRead
);

Sendo:

  • hProcess – Handle do processo alvo
  • lpBaseAddress – Ponteiro do Address alvo
  • lpBuffer – Pointeiro do buffer alocado no processo atual para receber os dados lidos
  • nSize – Tamanho, em bytes, da memória para ser lida
  • lpNumberOfBytesRead – Pointeiro para uma variável DWORD que retornará a quantidade de bytes lidos 

OBS: hProcess deve ter acesso do tipo PROCESS_VM_READ. (Para isso, utiliza-se a API OpenProcess).

ReadProcessMemory lê dados (bytes) de uma área da memória em um processo, se esta área estiver acessível (Com uma das seguintes permissões: PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY).

Se a função tiver êxito, o retorno é diferente de zero. Se falhar, o retorno é zero.

Funciona da seguinte forma:

jbqyyCW3iwbhyF

Após a leitura, faz-se o tratamento de dados conforme as necessidades do usuário. Nesta parte está o problema da maioria. Os tipos Byte, Word, DWORD, QWORD, ANSI String e UNICODE String podem ser tratados diretamente. Porém, quando se trata tudo como um data stream, deve-se ter em mente que o processador armazena os bytes na ordem inversa.

Vale observar que mesmo com retorno zero, lpNumberOfBytesRead pode ter retornado diferente de zero e os dados podem, e devem, ser tratados.

Para facilitar o aprendizado, irei disponibilizar abaixo uma Source Code em Pascal feita no Delphi7 pelo Yuh L. a qual exemplifica muito bem a leitura e tratamento de dados(de todos os tipos citados anteriormente) com ReadProcessMemory.

Faça o download do projeto de exemplo:

Quaisquer dúvidas comentem abaixo que lhe ajudarei.
Abraço,
Lipinf.

23 Comentários


  1. Valew mais uma vez, tinha uma duvida a respeito disso.. eu tentei fazer de outra maneira não dava certo, agora eu vi onde era o erro !!

    Responder

      1. Cara, estou sem palavras, a anos venho tentando e desistindo, mas você é a luz no fim do túnel, parabéns, muito ansioso pelo próximo tutorial, um forte abraço.

        Responder

  2. Parabens ! Ancioso para os proximos artigos!
    Vlw por deixar uma source para estudos 🙂

    Responder

  3. Obrigado Lipinf mesmo eu não entendendo nada sobre como fazer hack ou aprender sobre Delphi 7 vc esta me dando uma luz Obrigado 🙂

    Responder

  4. OQUE VC FALOU ATÉ AGORA EU JA SEI QUERO VER O AVANÇADO MAIS TA TOP CONTINUE ASSIM .VLW E UM ABRAÇO…

    Responder

  5. Parabéns cada vez mas to ansioso pelas futuras vídeo aulas para começar coloca em praticas obrigado por nos ajuda (y) forte abraço

    Responder

  6. Cara eu tive sorte de encontrar suas aulas! Até agora eu acredito estar fluindo bem, material mt bem preparado, bem explicado, fazer esse tipo de coisa foi algo q sempre pensei mas nunca coloquei pra frente, agora que é possivel eu n posso desperdiçar essa chance!! obg Felipe Abraço!

    Responder
    1. Filipe Torres

      Fala Maurilio, beleza? =]
      Ele serve para você ler a memória de outro processo, você digita o nome do processo que alvo, o endereço de memória que deseja ler (address) e o tamanho de bytes que deseja ler de uma vez. =)
      É quase um programa base para se fazer um scanner de memória, como o Cheat Engine, por exemplo.
      Se tiver mais dúvidas é só escrever aqui ou me mandar um e-mail que lhe explico melhor ou quem sabe até não faço mais artigos explicando as dúvidas 🙂
      Abraço!

      Responder

  7. Estou ansioso para que vc possa me ajudar todos os comentários elogiando espero que vc possa me ajudar em que estou procurando

    Responder

  8. Opa ate que enfin um tutorial interessante na net sobre cheating,parabens cara vai me ajuda muito

    Responder

  9. Cara, teus textos sao bem explicativos, porem to muito perdido, MUITO MESMO! Estou tipo cego em tiroteio, nunca vi nada disso, nada mesmo. Entao seria bom video aulas explicando, assim por texto pra mim nao ta sendo bom, acho que nao so pra mim, mas pra alguns tambem que deve ter desistido ou nao, peço que faça video aula e tals explicando junto com o texto, porque estou perdidin da silva :/

    Responder
    1. Filipe Torres

      Oi Lincoln, tudo bom?
      Na verdade, eu já tenho um curso completo em video-aulas: o Treinamento Online de Cheats.
      Nesse curso você vai aprender um método eficiente, testado e aprovado por mais de 90 alunos do treinamento, a desenvolver seus próprios cheats, começando do zero, em 4 semanas, através de video-aulas passo-a-passo.
      Se tiver interessado, manda um e-mail para [email protected], ok?
      Abraço!

      Responder

  10. Olá eu comprei mas não recebi nada ainda. Comprei segunda-feira !

    Responder

  11. Bom dia amigo , estou iniciando agora na programação e tenho uma dúvida a respeito de leitura e escrita na memória. é o seguinte eu tenho um endereço que peguei no cheat engine, e este endereço aponta para outro endereço , onde está o dado que preciso coletar , porém esse segundo endereço altera toda vez que fecho o game , além disso quando faço a leitura do primeiro endereço , é me retornado um valor, ao invés do segundo endereço, então gostaria de saber se existe uma forma de ler o primeiro endereço e obter o segundo endereço

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *