У меня есть указатель на функцию (который я получаю от vtable), и я хочу отредактировать функцию путем изменения ассемблерного кода (изменяющийся на несколько байтов) во времени выполнения. Я пытался использовать memset и также пытался присвоить новое значение непосредственно (что-то как mPtr[0] = X, mPtr[1] = Y и т.д.), но я продолжаю получать отказ сегментации. Как я могу изменить код?
(Я использую C++),
ОС является окнами.
В общем: если память выделена с помощью API вызова VirtualAlloc, то вы можете изменить атрибуты памяти с помощью API вызова VirtualProtect. Проверьте первые атрибуты памяти с помощью вызова API VirtualQuery
В зависимости от операционной системы и / или архитектуры вы можете или не можете писать на исполняемые страницы.
Проверьте документацию о пометке страниц как исполняемых или доступных только для чтения в руководствах Intel (IA-32e). Код может быть расположен в разделе только для чтения, поэтому вы не можете писать в него.
Вы можете пометить код, чтобы он не размещался на страницах только для чтения, но он специфичен для компилятора (это делают JIT-компиляторы).
В MSVC вы можете использовать #pragma section , чтобы создать раздел чтения-записи, и использовать #pragma alloc_text , чтобы поместить в него функции.
В общем, вы пытаетесь писать в сегмент кода, что-то новые операционные системы вам не позволят сделать. Так работали некоторые вирусы.
Существуют API для снятия этой защиты, но они зависят от операционной системы.
Разделы памяти, в которых находится ваш код, обычно помечаются как доступные только для чтения. Вот почему вы получаете сбой сегментации. Вы можете попробовать удалить этот флаг из раздела либо специальными ключами для компилятора (не уверен в этом), либо изменив двоичный файл (опять же, не на 100%, что это возможно)