Lendo o valor de um Endereço da memória em C++
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:
float a = 1.0; 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.
#include<iostream> #include<sstream> using namespace std; // Funcao para exibir apenas caracteres imprimiveis char ChangeToPrintable(char C) { return ((C < 32) || (C > 126))?'?':C; } int main(int argc, char** argv) { unsigned long addr_i, i, len; string addr_str; cout<<"Endereço de memória em hex.: "; cin>>addr_str; cout<<"Quantidade de bytes: "; cin>>len; cout<<endl; // Converte a string hex. em inteiro stringstream convert(addr_str); convert>>hex>>addr_i; for(i = addr_i; i < (addr_i + len); i++) { cout<<ChangeToPrintable(*((char*) i)); } cout<<endl; return 0; }
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:
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++”
Deixe um comentário |


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
Corrigido.