Как написать инструмент для изменения. net код (в целях запутывания) - PullRequest
1 голос
/ 04 марта 2020

Для своей диссертации я создаю инструмент / скрипт, который запутывает. NET код. Цель состоит в том, чтобы использовать метод, называемый выравниванием потоков управления, перед компиляцией кода и таким образом запутывать поток управления программой.

Пример изменения кода, которое должно произойти, это (не мой изображение):

https://i.stack.imgur.com/hnlzc.png

На данный момент моя проблема заключается в том, что я не знаю, как автоматически изменять код в определенных ситуациях. Могу ли я использовать инструменты, позволяющие указать, что следует изменить? Должен ли я сосредоточиться на чем-то вроде python?

1 Ответ

1 голос
/ 04 марта 2020

Я автор или ArmDot , инструмент, который также поддерживает запутывание потока управления. Идея обфускации потока управления состоит в том, чтобы скрыть фактический поток выполнения.

Я не уверен насчет python, я думаю, что это хорошая идея использовать. net для создания такого инструмента. Взгляните на dnlib и mono / cecil , которые предоставляют одинаковый API для чтения, записи и манипулирования IL-кодом. Кажется, что популярность dnlib растет, но я предпочитаю cecil.

Просто разбейте оригинальные инструкции на последовательности в точках, где изменяется поток выполнения (есть инструкции, которые изменяют поток выполнения, например br, br.false, beq и другие, вам определенно следует использовать ECMA-335 в качестве ссылки).

Затем введите переменную, в которой хранится текущий индекс последовательности. Сделайте большой switch, который выполняет последовательности в зависимости от текущего индекса последовательности.

Замените инструкции, которые изменяют поток выполнения, на инструкции, которые вычисляют следующий индекс последовательности. Для br следующий индекс последовательности очевиден, для br.false вам нужно извлечь значение из стека, чтобы получить следующий индекс в зависимости от извлеченного значения.

...