Доброго времени суток, уважаемые читатели. Сегодня у нас на повестке такая тема как написание обфускатора (для незнающих: программа, защищающая вашу программу от реверсеров, тем самым добавляя в ваш софт всякий говнокод (далее - джанк)). Это будет более разбор моего обфускатора, нежели чем изучение библиотеки с нуля (об этом вы можете посмотреть на гитхабе)
Сразу предупреждаю особых скептиков о том, что все это мое личное виденье реализации, я его ни в коем случае никому не навязываю. Вполне возможно, что качество кода вас не устроит, но суть в том, что я писал это на коленке для личных целей. Скорее даже не писал, а собирал по кусочкам. Сейчас я хочу же преподнести идею, что обфускатор может сделать каждый более-менее разбирающийся человек
Перед прочтением статью советую погуглить насчет следующих пунктов:
Методы, к-ые нам нужны и реализованы практически во всех обфускаторах составляют из себя следующий перечень:
Разбираем реализацию
Метод входа и загрузки самого бинарника
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Тут мы получаем путь до ехешника из консоли и далее обрабатываем его, используя метод LoadAssembly(string). Выглядит он следующим образом:
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Думаю здесь все понятно, теперь переходим непосредственно к протекторам
Renamer. Реализация
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Этот метод рекурсивно проходит по всем неймспейсам (я прошу прощения за сей сленговые слова, просто сейчас уже ночь и я не могу думать в полную силу), т.е при обнаружении дочернего элемента, метод вызывает сам себя и продолжает цикл. Таким образом мы переименовываем все вышеперечисленные поля
StringObfuscation. Реализация
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Так, тут уже нужно объяснить поподробнее, т.к. тут идет работа непосредственно с IL инструкциями. Так вот, в методе Protect() мы ищем любую инструкцию типа ldstr (грубо говоря, string в c#). Далее мы внедряем (инжектируем) наш метод шифрации или дешифрации строк (вроде тут используется XOR). Т.е. мы динамически подружаем тип из кода нашего обфускатора и добавляем его в ехешник (стаб). Далее создаем переменную типа string и помещаем туда данные ключа шифрования
Код класса InjectHelper можно скачать тут
Пароль: cyberpunk
Конец первой части
Вот как-то так, друзья. При хоть каком-то отклике, я пойму, что вам действительно интересна эта тема и продолжу
По каким-то доп. вопросам и фидбеку писать: мне
Сразу предупреждаю особых скептиков о том, что все это мое личное виденье реализации, я его ни в коем случае никому не навязываю. Вполне возможно, что качество кода вас не устроит, но суть в том, что я писал это на коленке для личных целей. Скорее даже не писал, а собирал по кусочкам. Сейчас я хочу же преподнести идею, что обфускатор может сделать каждый более-менее разбирающийся человек
Перед прочтением статью советую погуглить насчет следующих пунктов:
- IL инструкции, т.к. при создании обфускатора мы работаем именно с ними
- dnlib - это библиотека, с которой мы работаем при редактировании IL кода
БрифингПриступим же, друзья
Методы, к-ые нам нужны и реализованы практически во всех обфускаторах составляют из себя следующий перечень:
- Первым и, наверное, одним из самых важных, но в то же время простым, будет являться ренеймер, из функционала, как ни странно, выполняющий функцию переименовывания переменных, методов, классов
- Вторым по важности я посчитал обфускацию ресурсов (в основном это строчки string) приложения
- Далее идет ControlFlow, с осознанием функционала которого, у читателя может возникнуть проблемы. Поясню. Суть этого метода в том, что генерируется огромное кол-во не нужных if и while циклов, запутывающих код для прочтения и распознания со стороны антивирусов (далее АВ)
- Также я сделал генератор джанк кода (см. выше), который на сей момент не окончен
- Пятым, и заключающим наш список, будет метод дополнительных проверок (на дебагер и т.п)
Разбираем реализацию
Метод входа и загрузки самого бинарника
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Тут мы получаем путь до ехешника из консоли и далее обрабатываем его, используя метод LoadAssembly(string). Выглядит он следующим образом:
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Думаю здесь все понятно, теперь переходим непосредственно к протекторам
Renamer. Реализация
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Этот метод рекурсивно проходит по всем неймспейсам (я прошу прощения за сей сленговые слова, просто сейчас уже ночь и я не могу думать в полную силу), т.е при обнаружении дочернего элемента, метод вызывает сам себя и продолжает цикл. Таким образом мы переименовываем все вышеперечисленные поля
StringObfuscation. Реализация
Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Так, тут уже нужно объяснить поподробнее, т.к. тут идет работа непосредственно с IL инструкциями. Так вот, в методе Protect() мы ищем любую инструкцию типа ldstr (грубо говоря, string в c#). Далее мы внедряем (инжектируем) наш метод шифрации или дешифрации строк (вроде тут используется XOR). Т.е. мы динамически подружаем тип из кода нашего обфускатора и добавляем его в ехешник (стаб). Далее создаем переменную типа string и помещаем туда данные ключа шифрования
Код класса InjectHelper можно скачать тут
Пароль: cyberpunk
Конец первой части
Вот как-то так, друзья. При хоть каком-то отклике, я пойму, что вам действительно интересна эта тема и продолжу
По каким-то доп. вопросам и фидбеку писать: мне