Lendo o valor de um Endereço da memória em C++

Postado por Yoshio Iwamoto em 16/02/2009

Para quem está estudando C++ aqui vai uma dica de como ler o valor de um endereço de memória. Basicamente o que vamos fazer são apenas conversões ou “casts” com os valores numéricos.

Por exemplo, para converter um “float” para “int” fazemos assim:

  1. float a = 1.0;
  2. int b = (int) a; // cast

Para transformar um número em ponteiro é a mesma coisa, a diferença é que para ler a memória byte-a-byte o ponteiro deve ser um “char”. Por exemplo, um “(char*) 255” irá converter 255 para um ponteiro que aponta para o endereço 0xFF.

Mas nós só convertemos para ponteiro, para ler o conteúdo ainda é necessário colocar um “*” antes do ponteiro, como se faz normalmente para se ler o conteúdo de um ponteiro normal. Como é um ponteiro do tipo “char” o seu retorno pode ser exibido na tela.

Abaixo segue um programa que pede para o usuário digitar um endereço de memória em hexadecimal e quantidade de bytes que devem ser lidos, em seguida ele exibe o conteúdo da memória.

  1. #include<iostream>
  2. #include<sstream>
  3.  
  4. using namespace std;
  5.  
  6. // Funcao para exibir apenas caracteres imprimiveis
  7. char ChangeToPrintable(char C)
  8. {
  9. return ((C < 32) || (C > 126))?'?':C;
  10. }
  11.  
  12. int main(int argc, char** argv)
  13. {
  14. unsigned long addr_i, i, len;
  15. string addr_str;
  16.  
  17. cout<<"Endereço de memória em hex.: ";
  18. cin>>addr_str;
  19.  
  20. cout<<"Quantidade de bytes: ";
  21. cin>>len;
  22.  
  23. cout<<endl;
  24.  
  25. // Converte a string hex. em inteiro
  26. stringstream convert(addr_str);
  27. convert>>hex>>addr_i;
  28.  
  29. for(i = addr_i; i < (addr_i + len); i++)
  30. {
  31. cout<<ChangeToPrintable(*((char*) i));
  32. }
  33.  
  34. cout<<endl;
  35.  
  36. return 0;
  37. }

O interessante sobre o programa é que se ele rodar irá exibir um “segmentation fault”. Isso está correto, porque o sistema operacional não deve permitir que um programa leia (invada) a memória de outro. Mas você pode ler a memória alocada para o próprio programa que está rodando. Você pode tentar, por exemplo, ler a partir da área onde a função “main” está alocada, colocando o seguinte código antes do “for” que realiza a leitura dos dados:

  1. addr_i = (unsigned long) &main; // Converte o endereço para inteiro

2 Comentário para “Lendo o valor de um Endereço da memória em C++”

  1. fabio disse em 16/02/2009 as 23:30

    amigo, mude o C para maiusculo na linha 31 do changeToPrintable, fiquei 2 semanas pra descobrir esse erro maldito ahaha, agora rodou mas o programa nem deu em nada, mas valeu mesmo assim, abraços

  2. Yoshio Iwamoto disse em 16/02/2009 as 12:28

    Corrigido.

Trackback URI | RSS dos comentários

Deixe um comentário

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.