Как мне получить адрес в C? - PullRequest
       21

Как мне получить адрес в C?

3 голосов
/ 03 августа 2009

Вероятно, есть очень простой ответ на этот вопрос, но я просто не вижу его.

#include <stdio.h>

int main(void) {
int x = 0;
printf("\n%d\n%d\n",x,&x);
}

Хорошо, значит printf выдает 0 (x) и 2293752 (& x). Я пытаюсь найти способ посмотреть на любой адрес (&) и посмотреть, что там уже хранится. Это только для экспериментов. Любая помощь?

Ответы [ 6 ]

4 голосов
/ 03 августа 2009
void* memAddr = (void*)0xAABBCCDD; //put your memory address here
printf("int value at memory address %p is %i", memAddr, *((int*)memAddr));

Вы, вероятно, обнаружите, что проверка произвольных адресов памяти просто вызовет сбой.

2 голосов
/ 03 августа 2009

Есть много проблем с попытками сделать это, в первую очередь, как упомянул Уилсон, вы действительно не будете иметь никакого представления о том, что там хранится.

Уилсон немного выключен, однако вам действительно следует привести его к типу char вместо int, поскольку с помощью int вы увидите 4 байта, а не один байт, как это было бы с char.

Кроме того, если вы не можете прочитать 8-битные символы ASCII и сопоставить их с чем-то значимым в вашей голове, вы, вероятно, захотите преобразовать его в другую форму, такую ​​как base2, base8 или base16.

Вы можете сделать это несколькими способами - вероятно, лучший способ сделать это с помощью побитовых операторов и операторов двоичного сдвига, глядя в таблицу диспетчеризации, чтобы отобразить ее в видимый ASCII.

Однако вы все равно не будете знать, что там хранится, вы просто сможете увидеть некоторую зашифрованную форму необработанных двоичных данных. Причина в том, что C набирается только в отношении переменной, указывающей на этот адрес памяти. Обнаженный взгляд на эту память просто даст вам двоичный файл и не сможет посмотреть, с какими переменными связана эта память или какого типа эти переменные.

Вторая проблема заключается в том, что вам нужно соблюдать осторожность, чтобы просматривать только те части памяти, к которым у вас есть доступ. Если вы не будете осторожны с доступом к нему, сегменты кода памяти не могут быть просмотрены. Тебе повезет, если ты постараешься избежать ошибки сегментации.

Вероятно, наиболее эффективный способ заглянуть в память процесса - это сбросить его сегмент на диск. В UNIX это делается через дамп ядра. Затем вы можете загрузить его в отладчик и просмотреть содержимое своего сердца, и даже иметь возможность отобразить его на правильные типы с достаточным знанием стека. Вы также можете использовать бинарный редактор, чтобы проверить его нетипизированным способом - часто строки распознаются.

Удачи!

2 голосов
/ 03 августа 2009

Это будет разыменование указателя, которое является * оператором. Однако вы не можете сказать, что тип хранимых данных для случайного адреса.

#include <stdio.h>

int main(void) {
int x = 0;
printf("\n%d\n%d\n%d\n",x,&x,*(&x));
}

/* resulting output will be 0, some memory address, and 0 again */
1 голос
/ 03 августа 2009

Если вы хотите изучить память, я бы порекомендовал использовать отладчик низкого уровня, такой как OllyDbg .

0 голосов
/ 03 августа 2009

чтобы увидеть адрес вы можете использовать% p

printf("%p",&x);

Рекомендую начать читать об указателях, указатель - это переменная, в которой хранится адрес памяти

int x=10;
int *p; //this is a pointer to int
p=&x; //now p has the memory location of x
printf("%d\n",*p); //this will print 10
0 голосов
/ 03 августа 2009

Предполагая, что вы хотите просмотреть «необработанные» данные и знаете адрес внутри адресного пространства вашего процесса, вы сделаете следующее:

long x=<address>
printf("%x", *(int *)x);
...