Я автор или ArmDot , инструмент, который также поддерживает запутывание потока управления. Идея обфускации потока управления состоит в том, чтобы скрыть фактический поток выполнения.
Я не уверен насчет python, я думаю, что это хорошая идея использовать. net для создания такого инструмента. Взгляните на dnlib и mono / cecil , которые предоставляют одинаковый API для чтения, записи и манипулирования IL-кодом. Кажется, что популярность dnlib растет, но я предпочитаю cecil.
Просто разбейте оригинальные инструкции на последовательности в точках, где изменяется поток выполнения (есть инструкции, которые изменяют поток выполнения, например br
, br.false
, beq
и другие, вам определенно следует использовать ECMA-335 в качестве ссылки).
Затем введите переменную, в которой хранится текущий индекс последовательности. Сделайте большой switch
, который выполняет последовательности в зависимости от текущего индекса последовательности.
Замените инструкции, которые изменяют поток выполнения, на инструкции, которые вычисляют следующий индекс последовательности. Для br
следующий индекс последовательности очевиден, для br.false
вам нужно извлечь значение из стека, чтобы получить следующий индекс в зависимости от извлеченного значения.