Я пытаюсь просканировать системную память.

Мой план: создавать указатели, указывающие на память, и перемещать этот указатель на один байт вверх в каждом цикле.

Вот что я придумал:

#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
Begah 11 Ноя 2014 в 20:02

2 ответа

Лучший ответ

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

ОС может предлагать некоторый API для доступа к памяти других процессов (предполагается, что у вас есть на это права). В Win32Api это ReadProcessMemory.

Может быть, какой-то другой API ОС позволяет прямое чтение из адресного пространства системы. Вы можете покопаться в Как вы читаете прямо из физической памяти?

2
Community 23 Май 2017 в 12:15

Разве ваш компилятор не выдал предупреждение ниже:

warning: cast to pointer from integer of different size

В функции MemAdressPointer() вы делаете:

void *p1 = (void*) n;/* which is wrong */
0
Gopi 11 Ноя 2014 в 17:35