Jump to content

Leitura de memória (ReadProcessMemory)


bornman

Recommended Posts

Olá, ontem estava codando um programa que realiza a leitura de um endereço(cujo valor é mudado ao longo da execução) e imprime o valor contido nele, porém não obtive sucesso.
O código para leitura é o seguinte: 

ReadProcessMemory(hwnd, (LPCVOID)address, &value, sizeof(value), NULL);

Andei lendo e vi que LPCVOID aponta para uma constante, sendo assim o certo seria eu usar LPVOID, certo? Existe a possibilidade do erro ser apenas isso ou o meu endereço também pode estar errado?

Link to comment
Share on other sites

  • Administrators

Você não disse qual o erro, mas na hora de chamar a função, você não precisa usar nem LPVOID nem LPCVOID. Este é o tipo de argumento (e pode ser constante sim, já que só vai ler), mas na hora de chamar, basta passar o endereço (não precisa do tipo dele).

Não sei qual o tamanho do value, mas como você tá debugando, seria legal usar um quinto argumento pra saber quantos bytes de fato foram lidos. Isso tem que bater com sizeof(value) no seu caso.

Abraço!

Link to comment
Share on other sites

3 horas atrás, Fernando Mercês disse:

Você não disse qual o erro, mas na hora de chamar a função, você não precisa usar nem LPVOID nem LPCVOID. Este é o tipo de argumento (e pode ser constante sim, já que só vai ler), mas na hora de chamar, basta passar o endereço (não precisa do tipo dele).

Não sei qual o tamanho do value, mas como você tá debugando, seria legal usar um quinto argumento pra saber quantos bytes de fato foram lidos. Isso tem que bater com sizeof(value) no seu caso.

Abraço!

Não está imprimindo o valor certo, então creio  que provavelmente o endereço que está errado. No caso value é um int, então no lugar de NULL eu deveria colocar 4(bytes)?
No site da microsoft está assim: 

ReadProcessMemory(
  _In_  HANDLE  hProcess,
  _In_  LPCVOID lpBaseAddress,
  _Out_ LPVOID  lpBuffer,
  _In_  SIZE_T  nSize,
  _Out_ SIZE_T  *lpNumberOfBytesRead
);
Citar

lpNumberOfBytesRead [out]

A pointer to a variable that receives the number of bytes transferred into the specified buffer. If lpNumberOfBytesRead is NULL, the parameter is ignored.

Pelo que entendi eu deveria definir um ponteiro e aponta-lo para value. Está certo?

 

Link to comment
Share on other sites

  • Administrators
18 horas atrás, bornman disse:

Pelo que entendi eu deveria definir um ponteiro e aponta-lo para value. Está certo?

Sim, mas tem que alocar antes. O mais rápido é simplesmente declara e passar o endereço, tipo:

SIZE_T bytes;

ReadProcessMemory(...., &bytes)

Posta o trecho de código onde você chama a função também, pra gente ver como tá. ;)

Abraço.

Link to comment
Share on other sites

4 horas atrás, Fernando Mercês disse:

Sim, mas tem que alocar antes. O mais rápido é simplesmente declara e passar o endereço, tipo:


SIZE_T bytes;

ReadProcessMemory(...., &bytes)

Posta o trecho de código onde você chama a função também, pra gente ver como tá. ;)

Abraço.

Já consegui resolver o problema, eu estava esquecendo de dar a permissão.
 

HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);

De qualquer maneira agradeço pela ajuda. Abraços!

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...