До GCC 5 (1) я не знаю способа запуска произвольного машинного кода, если вы фактически не введете машинный код в память, а затем запустите его.
Если вы хотите запустить в памяти код, который уже , вы можете просто установить указатель инструкции на начало, точку останова в конце и затем перейти. Затем, после точки останова, верните указатель инструкции к его первоначальному значению.
Но я на самом деле не вижу варианта использования для этого. Это не значит, что не , просто то, что все, что вы можете сделать, запустив код, вы также можете достичь, напрямую изменив регистры, флаги, память и т. Д.
Например, команда:
info registers
сбросит текущие значения регистров, в то время как:
set $eax = 42
изменит регистр eax
на 42
.
Вы также можете изменить память следующим образом:
set *((char*)0xb7ffeca0) = 4
Это записывает один байт в ячейку памяти 0xb7ffeca0
, и вы можете использовать этот же метод для хранения более широких типов данных.
(1) GCC 5 позволяет вам скомпилировать и выполнить произвольный код с помощью команды compile code
, как документировано здесь .