- 1
Вопрос
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−10
Вопрос
Кто знает, как динамически выделить память, заполнить её нужными инструкциями, и исполнить этот код, не испытав при этом анальной боли и не получить Segmentation Fault ?
У меня получается только со статической.
Начиная с x64 прямо у страницы есть битик NX, а в 32 режиме такого битика не было, и в некоторых случаях можно было самомодифицировать код, но не везде.
К примеру OpenBSD защищала страницы софтварно еще до появления хардварной защиты от amd64.
Называлась эта защита W^X (запись-или-исполнение), кажется на нее намекал там снизу Санут:)
Анонимно замапить mmap и сказать что ты хочешь PROT_EXEC и PROT_WRITE, наверное, можно (хотя это конечно странное желание), однако
в Linux это должно сработать (во всяком случае mmap(2) ничего страшного не обещает), думаю что остальные обычные ОС поступят так же.
Ну а упомянутая выше obsd пошлет тебя нахуй (ENOTSUP), если ты явно не включишь режим пониженной безопастности.
На винде, емнип, нет анонимного мапинга (только в файл), но можно сделать HeapCreate со спец ключиком, и вся выделямая из этого хипа память будет разрешена для выполнения (ну и для записи самособой)
ЗЫ. Совсем без боли не бывает, про LLVM я знаю, просто хочу зопилить малипюзерный JIT, без всяких там LLVM'ов, чтобы самому с этим всем разобраться.
https://community.arm.com/processors/b/blog/posts/caches-and-self-modifying-code
Тут подробнее https://docs.python.org/2/extending/embedding.html
Факт.