Передайте шестнадцатеричный адрес в переменную Pointer - PullRequest
2 голосов
/ 28 апреля 2011

Я знаю, как работать с указателями. Но я не знаю, как это сделать:

У меня есть шестнадцатеричный адрес, который, конечно, имеет любое значение из любого приложения.

Я знаю, чтобы найти адрес, который я хочу. Я хочу написать C-код для передачи этого адреса в переменную-указатель, а затем я могу получить значение из этого адреса и т. Д.

Например:

hex 0x00010010
int *pointer;

Как я могу передать этот адрес указателю, каков синтаксис для этого?

Ответы [ 2 ]

6 голосов
/ 28 апреля 2011

Используя int*, вы предполагаете, что данные, на которые вы указываете, равны int (4 байта, в большинстве ОС).

Разве мы не должны вместо этого использовать void*? Позже, если вы хотите получить доступ к его данным с использованием определенного типа, все, что вам нужно сделать, это привести.

void *addr = (void*)0x0023FF74; // valid memory address within my app

printf("Address: %p\n", addr);
getchar();

printf("Data (4bytes): %d\n", *(int*)addr); // print the first 4 bytes of data as int
getchar();

EDIT

Помогите мне понять, что вы пытаетесь сделать, потому что это утверждение смутило меня:

Есть приложение, использующее этот адрес, я знаю значение в нем, но указатель (int) не имеет доступа к значению.

Вы пытаетесь написать приложение, которое будет изменять память другого приложения, на котором работает ваша система? Ваш текущий подход не сработает, и вот почему: когда операционная система загружает ваше приложение в процесс, она резервирует область памяти для использования процессом и назначает диапазон виртуальных адресов этому региону. Эти виртуальные адреса не отображаются напрямую на адреса памяти в ОЗУ, поэтому ОС должна хранить для этого внутреннюю таблицу.

В Windows каждый загруженный процесс получает одинаковый диапазон виртуальных адресов, но эта область видна только процессу, выполняющемуся внутри него. Например, (в Windows) процессы загружаются в адрес памяти 0x00400000, что означает, что каждый процесс имеет свой собственный адрес памяти 0x00400000 , и поэтому вы не можете назначить адрес памяти X указателю в вашем приложении и ожидать Windows волшебным образом знает, что вы ссылаетесь на адрес X, который находится внутри другого приложения.

То, что вы пытаетесь выполнить, называется Внедрение кода , и в Интернете много информации об этом.

4 голосов
/ 28 апреля 2011

В типичных современных операционных системах вы не можете получить доступ к адресному пространству другого процесса (приложения). Адреса виртуальные , поэтому одно и то же числовое значение означает разные вещи для разных процессов.

Если вы работаете в системе с истинным «плоским» адресным пространством (где процессы напрямую работают с реальными адресами физической памяти), например, с Amiga OS на 680x0, вы можете сделать что-то вроде:

int *pointer = (int *) 0x00010010;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...