2016-08-06 3 views
-2

Я написал код для чтения данных с адреса. Этот адрес относится к сегменту кода (я разбираю свой двоичный файл и поиск, где находится главная, поэтому адрес оттуда). Основная цель - изменить контент. Когда я его распечатываю, это вызывает segfault. Это какая-то защита?segfault при печати памяти

void at(){ 


    char *p = 0x0000000100000f47; 
    printf("%c", p[0]); 

} 

int main(){ 

    at(); 

    return 0; 
} 
+0

Возможно, вы используете свой код в операционной системе, и эта операционная система не дает вашей программе доступа к физической памяти и не назначает виртуальный адрес 0x0000000100000f47 вашей программе/процессу. – nos

+1

См. Http://stackoverflow.com/q/38686502/4068338 – Matsmath

+0

Почему не 'char * p = (char *) main;'. Таким образом, вам не нужно беспокоиться об абсолютных адресах и переездах. – dxiv

ответ

2

Является ли это своего рода защита?

Да. Сегментация! Вот почему вы получаете ошибку сегментации.

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

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

Это довольно сложный процесс (и подверженный ошибкам), и он включает в себя libc/rtloader/вашу ОС/черную магию; там может быть даже ранняя ранжировка памяти, которая происходит здесь (вероятно, не для вашего кода), так что время выполнения преднамеренно гарантирует, что вы не можете «угадать» места памяти определенных вещей.

+0

ОК, я понял. это был фиктивный вопрос. вероятно, для компьютера невозможно найти мой двоичный файл в том же пространстве памяти. спасибо –

+0

можно, но это не то, что исполняемые загрузчики делают –

Смежные вопросы