Я пытаюсь просканировать системную память.
Мой план: создавать указатели, указывающие на память, и перемещать этот указатель на один байт вверх в каждом цикле.
Вот что я придумал:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char *MemAdressPointer(int n);
int main(void) {
int i = 0;
for(i = 0; i<100; i++)
{
const char* pAddr = MemAdressPointer(i+5000);
printf("%c hexadecimal value of : 0x%p with i at : %i\n", *pAddr, pAddr, i);
}
getchar();
return 0;
}
const char *MemAdressPointer(int n)
{
void *p1 = (void*) n;
const char* p2;
p2 = p1;
return p2;
}
Все, по крайней мере, что я знаю, работает.
Он печатает правильный адрес памяти.
Но когда я печатаю символ (% c), он просто перестает отвечать
Как ни странно, указатель, будучи персонажем,
Не должен указывать на один байт и получать двоичное значение этого байта
И получить из него соответствующий символ.
Спасибо за любую помощь, которую вы можете мне оказать.
2 ответа
Современные операционные системы работают не так. Вы не можете просто прочитать системную оперативную память, потому что память приложений виртуализирована, а также ОС запрещает прямой доступ из-за политик безопасности.
ОС может предлагать некоторый API для доступа к памяти других процессов (предполагается, что у вас есть на это права). В Win32Api это ReadProcessMemory
.
Может быть, какой-то другой API ОС позволяет прямое чтение из адресного пространства системы. Вы можете покопаться в Как вы читаете прямо из физической памяти?
Разве ваш компилятор не выдал предупреждение ниже:
warning: cast to pointer from integer of different size
В функции MemAdressPointer()
вы делаете:
void *p1 = (void*) n;/* which is wrong */
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
5000+100*sizeof(int)
и ожидаете, что это будет работать без проблем? Что ж, удачи с этим. Скорее всего, вы будете выполнять незаконный доступ к памяти в какой-то момент во время выполнения вашей программы (хотя вы только читаете, а не пишете, но это все равно выглядит довольно небезопасно). В любом случае, как формальный ответ на ваш вопрос - ваш код дает неопределенное поведение (незаконный доступ к памяти - это практический ответ).5000+100*sizeof(int)
там. Должно быть просто 5099 (включительно). Остальная часть комментария поддерживает...