Если вы ограничите подмножество поддерживаемых инструкций, вы можете делать то, что хотите, более или менее легко.
Во-первых, вы должны проанализировать и декодировать инструкцию ввода, чтобы увидеть, находится ли она в поддерживаемом подмножестве (большая часть синтаксического анализа / декодирования может быть выполнена только один раз). Тогда вам нужно выполнить его.
Но перед выполнением, есть одна важная вещь, о которой нужно позаботиться. Основываясь на декодированных деталях команды и состоянии регистров ЦП, вы должны рассчитать адреса памяти, к которым команда будет обращаться как данные (включая расположения в стеке) или передавать управление. Если какой-либо из них выходит за установленные пределы, срабатывает пожарная сигнализация. В противном случае, если это инструкция передачи управления (например, jmp, jz), вы должны дополнительно убедиться, что адрес, на который она передает управление, находится не только в памяти, где находятся все эти инструкции, но также является адресом одной из этих инструкций и не адрес внутри любого из них (например, 1 или 2 байта от начала инструкции длиной 3+ байта). Передача контроля где-либо еще - нет-нет. Вы не хотите, чтобы эти инструкции передавали управление каким-либо стандартным библиотечным функциям, потому что вы не сможете контролировать их выполнение, и они не всегда безопасны при использовании поддельных / вредоносных входов. Кроме того, эти инструкции не должны быть в состоянии изменить сами.
Если все ясно, вы можете либо эмулировать инструкцию, либо выполнить ее более или менее непосредственно (инструкции по передаче управления, вероятно, придется всегда эмулировать, потому что вы хотите остановить выполнение после каждой инструкции). Для последнего вы можете создать модифицируемую функцию, содержащую эти вещи:
- Код для сохранения регистров процессора вызывающей стороны и загрузки их с состоянием для выполняемой инструкции.
- Инструкция.
- Обратная сторона шага 1: код для сохранения состояния регистра после выполнения и восстановления состояния регистра вызывающей стороны.
Вы можете попробовать этот подход.