Изменение кода во времени выполнения

У меня есть указатель на функцию (который я получаю от vtable), и я хочу отредактировать функцию путем изменения ассемблерного кода (изменяющийся на несколько байтов) во времени выполнения. Я пытался использовать memset и также пытался присвоить новое значение непосредственно (что-то как mPtr[0] = X, mPtr[1] = Y и т.д.), но я продолжаю получать отказ сегментации. Как я могу изменить код?

(Я использую C++),

ОС является окнами.

8
задан sth 5 April 2010 в 21:50
поделиться

4 ответа

В общем: если память выделена с помощью API вызова VirtualAlloc, то вы можете изменить атрибуты памяти с помощью API вызова VirtualProtect. Проверьте первые атрибуты памяти с помощью вызова API VirtualQuery

6
ответ дан 5 December 2019 в 20:15
поделиться

В зависимости от операционной системы и / или архитектуры вы можете или не можете писать на исполняемые страницы.

Проверьте документацию о пометке страниц как исполняемых или доступных только для чтения в руководствах Intel (IA-32e). Код может быть расположен в разделе только для чтения, поэтому вы не можете писать в него.

Вы можете пометить код, чтобы он не размещался на страницах только для чтения, но он специфичен для компилятора (это делают JIT-компиляторы).

В MSVC вы можете использовать #pragma section , чтобы создать раздел чтения-записи, и использовать #pragma alloc_text , чтобы поместить в него функции.

3
ответ дан 5 December 2019 в 20:15
поделиться

В общем, вы пытаетесь писать в сегмент кода, что-то новые операционные системы вам не позволят сделать. Так работали некоторые вирусы.

Существуют API для снятия этой защиты, но они зависят от операционной системы.

0
ответ дан 5 December 2019 в 20:15
поделиться

Разделы памяти, в которых находится ваш код, обычно помечаются как доступные только для чтения. Вот почему вы получаете сбой сегментации. Вы можете попробовать удалить этот флаг из раздела либо специальными ключами для компилятора (не уверен в этом), либо изменив двоичный файл (опять же, не на 100%, что это возможно)

-1
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: