GRAFik Это байт-кодовый интерпретатор, штатный цикл fetch-decode-execute и формально циклический поток наследования через указатель в байткод. Всем известная printf - хороший пример простой байткодовой вирты.
Entropy wtf, все по теме не просто формулировано, а введены годные понятия, теория наследования. Та трудность с введением дельты в modrm, IDP, разобрана. Что такое кодовый анклав. Позже выложу кодес.
Мой эмулятор вымышленной 16-битной машины с экстремально простой системой команд - SimpX: Попробовать в онлайн: https://aa-dav.github.io/ Эмуляция работает сразу из ассемблерного кода - он транслируется в виртуальный образ машины при запуске и эмулятор включается на только что оттранслированный образ. Файлы с исходниками есть библиотечные и их бесполезно транслировать, надо выделить в левом списке файл с названием вида test-0X.asm и нажать меню Compile and Run. Исходники и описание архитектуры процессора тут: https://github.com/aa-dav/SimpX/blob/master/README_simpleton_ru.md Очень простая 16-битная трёхоперандная машина - каждая инструкция выполняет шаблон "назначение = операнд1 операция операнд2" с небольшими вариациями для оптимизации процесса.
я хотел сказать мне в общих чертах понятно что такое эмуляция,а если углубляться, это надо разбирать исходники эмуляторов
Research Unicorn Engine Обработка системных событий в обычных фильтрах примитивна - ядро выполняет выборку аргументов, видимую в юзер.
При выборке аргумента, его проверке try-fetch-except или ProbeFor() происходит дереференс ссылки, это приводит к прокидыванию #guard и разблокировки страницы. Отсутствие этого механизма делает детект эмуляции сервисов элементарным, можно автоматикой накопить размеры всех аргументов любого сискола. Тупо фильтрация это бесполезная шляпа, юзер апи эмулируют обычно адресными ловушками if rIp = *Api: emulate(Api). В таком виде тела функции нет - его нельзя прочитать/переместить. Более продвинутая аверская метода это вставить шлюз(атом) if [rIp] = SignatureId(Api): emulate(Id).