LINUX.ORG.RU

Рефлексия, кто-нибудь сталкивался?


0

1

Вот тут, собственно, написано что это, а тут имеется следующее предложение:

«Так, в ОС Linux и Solaris при использовании отладочных инструментов Kprobes и DTrace в некоторые места кода ядра или программ вставляются последовательности инструкций nop. При включении инструмента некоторые из этих последовательностей заменяются на безусловный переход на процедуру отладки.»


Правда ли это? Как можно изменить код, ведь вроде в защищенном режиме процессора код можно только читать, а писать в него нельзя?
Имею в виду, что запущенная программа изменяет сама себя, а не изменяется какой-либо другой программой.
Просто наткнулся на эту статью и стало очень интересно, мб из присутствующих здесь кто-то что-то знает по данной теме, был бы очень признателен, спасибо.

В python это работать не будет.

XoFfiCEr ★★☆☆
()

Читать доки по защищённому режиму. Это:

ведь вроде в защищенном режиме процессора код можно только читать, а писать в него нельзя?

Имею в виду, что запущенная программа изменяет сама себя, а не изменяется какой-либо другой программой.

работает только потому, что ядро так распоряжается. А когда ты его отлаживаешь (и соответственно, запускаешь изменённое ядро), ничто не мешает хоть всё память замапить на rwx.

anonymous
()
Ответ на: комментарий от anonymous

Так вот же статья на WASM про это и там написано следующее:

Как видите, сегмент кода может быть доступен как только для исполнения, так и для исполнения/чтения. Для исполнения/чтения он может быть доступен в том случае, когда мы храним какие-либо константы или другие статические данные в памяти, непосредственно в сегменте кода. Ну это и так понятно. А теперь ВНИМАНИЕ! В ЗАЩИЩЕННОМ РЕЖИМЕ В СЕГМЕНТ КОДА ПИСАТЬ НЕЛЬЗЯ! Если ты заметил, даже нет такого битика, чтоб никто и не пытался…

Glaciuse
() автор топика

Программа в Linux может менять сама себя. Для нужной область системным вызовом mprotect() изменяются права доступа и туда пришется машинный код.

Это если я правильно понял про что вы спрашиваете. С точки зрения сегментной оргранизации, то, ЕМНИП, в Линуксе сегмент кода и сегмент данных отображаются в одну память, поэтому пишут в сегмент данных, а mprotect() меняет права доступа у страниц памяти.

mky ★★★★★
()
Ответ на: комментарий от mky

mky, спасибо за исчерпывающий ответ, теперь все понятно :)

Glaciuse
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.