Здравствуйте. Родилась идея создания метаморфного движка. Пусть у нас есть накоторый исполняемый код. Пусть мы умеем заменять одну инструкцию на эквивалент, то есть реализован кодоэмулятор/дизассемблер. Например, инструкцию mov eax,4 заменяем на push 4 / pop eax. Основная проблема, возникающая при этом - пересчет адресов переходов и данных. Предлагаемое решение: - замена относительных адресов абсолютными - пересчет переходов вперед на необработанный код: Запоминаем данную команду перехода, при обработке последующих команд, возвращаеся к запомненной позиции и увеличиваем целевой адрес на разницу размеров команды до и после обработки. - пересчет переходов назад, в обработанный код: заводим таблицу вида: -=адрес команды в исходной программе | смещение до текущей обрабатываемой командой с учетом изменения размера команд=- Точнее, во вторую позицию пишется разница размеров. Например, была у нас 5-ти байтная команда, заменили ее на 8-ми байтную. В нужный элемент таблицы довавляем разницу, то есть 3 байта. Таблица включает все обработанные команды. Дойдя до команды перехода назад, извлекаем из нее целевой адрес, смотрим соответствующий элемент таблицы, складываем и получаем новую каманды перехода. с незначительными изменениями, алгоритм подходит и для пересчета адресов операндов в памяти. Теоретически, эта штука должна работать. Или я чего-то не понимаю в этом мире...
Вопрос в том, стоит ли браться за реализацию. Может, кто подобным занимался, какие подводные камни обнаружил.