Для моей дипломной работы я хочу визуализировать остаточные данные памяти и то, как они сохраняются после перезагрузки системы.
У меня была простая идея: отобразить изображение в памяти, выключить компьютер, подождать x секунд, загрузить компьютер и посмотреть, все ли еще изображение.
int mmap_lena(void)
{
FILE *fd = NULL;
size_t lena_size;
void *addr = NULL;
fd = fopen("lena.png", "r");
fseek(fd, 0, SEEK_END);
lena_size = ftell(fd);
addr = mmap((void *) 0x12345678, (size_t) lena_size, (int) PROT_READ, (int) MAP_SHARED, (int) fileno(fd), (off_t) 0);
fprintf(stdout, "Addr = %p\n", addr);
munmap((void *) addr, (size_t) lena_size);
fclose(fd);
fclose(fd_log);
return EXIT_SUCCESS;
}
Я пропустил проверку возвращаемых значений для ясности.
Итак, после mmap я пытался каким-то образом получить адрес, но у меня обычно возникает ошибка сегментации, так как, как я понимаю, память защищена моей операционной системой.
int fetch_lena(void)
{
FILE *fd = NULL;
FILE *fd_out = NULL;
size_t lenna_size;
FILE *addr = (FILE *) 0x12346000;
fd = fopen("lena.png", "r");
fd_out = fopen("lena_out.png", "rw");
fseek(fd, 0, SEEK_END);
lenna_size = ftell(fd);
// Segfault
fwrite((FILE *) addr, (size_t) 1, (size_t) lenna_size, (FILE *) fd_out);
fclose(fd);
fclose(fd_out);
return 0;
}
Обратите также внимание, что я жестко закодировал адреса в этом примере, поэтому всякий раз, когда вы запускаете mmap_lena, значение, которое я использую в fetch_lena, может быть неправильным, поскольку операционная система принимает первый параметр в mmap только как подсказку (в моей системе это всегда по умолчанию 0x12346000).
Если есть какая-либо тривиальная ошибка кодирования, я прошу прощения, поскольку мои навыки C не полностью развиты.
Я бы хотел, чтобы, если есть какой-то способ получить нужные данные, не применяя перехватчики malloc или хаки распределения памяти.
Заранее спасибо,
David