Изменение кода во время выполнения - PullRequest
8 голосов
/ 29 марта 2010

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

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

ОС - это окна.

Ответы [ 4 ]

6 голосов
/ 29 марта 2010

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

3 голосов
/ 29 марта 2010

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

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

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

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

0 голосов
/ 29 марта 2010

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

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

0 голосов
/ 29 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...