• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

С# Написание собственного обфускатоора .NET на c#. Первая часть

malohog

Новичок
Сообщения
2
Реакции
0
0 руб.
Telegram
Доброго времени суток, уважаемые читатели. Сегодня у нас на повестке такая тема как написание обфускатора (для незнающих: программа, защищающая вашу программу от реверсеров, тем самым добавляя в ваш софт всякий говнокод (далее - джанк)). Это будет более разбор моего обфускатора, нежели чем изучение библиотеки с нуля (об этом вы можете посмотреть на гитхабе)



Сразу предупреждаю особых скептиков о том, что все это мое личное виденье реализации, я его ни в коем случае никому не навязываю. Вполне возможно, что качество кода вас не устроит, но суть в том, что я писал это на коленке для личных целей. Скорее даже не писал, а собирал по кусочкам. Сейчас я хочу же преподнести идею, что обфускатор может сделать каждый более-менее разбирающийся человек

Перед прочтением статью советую погуглить насчет следующих пунктов:

  1. IL инструкции, т.к. при создании обфускатора мы работаем именно с ними
  2. dnlib - это библиотека, с которой мы работаем при редактировании IL кода
Приступим же, друзья
Брифинг
Методы, к-ые нам нужны и реализованы практически во всех обфускаторах составляют из себя следующий перечень:

  1. Первым и, наверное, одним из самых важных, но в то же время простым, будет являться ренеймер, из функционала, как ни странно, выполняющий функцию переименовывания переменных, методов, классов
  2. Вторым по важности я посчитал обфускацию ресурсов (в основном это строчки string) приложения
  3. Далее идет ControlFlow, с осознанием функционала которого, у читателя может возникнуть проблемы. Поясню. Суть этого метода в том, что генерируется огромное кол-во не нужных if и while циклов, запутывающих код для прочтения и распознания со стороны антивирусов (далее АВ)
  4. Также я сделал генератор джанк кода (см. выше), который на сей момент не окончен
  5. Пятым, и заключающим наш список, будет метод дополнительных проверок (на дебагер и т.п)


Разбираем реализацию


Метод входа и загрузки самого бинарника
ab2fc338232e199bfae30.png

Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Тут мы получаем путь до ехешника из консоли и далее обрабатываем его, используя метод LoadAssembly(string). Выглядит он следующим образом:

cede6eeae36c4e72e2adf.png

Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Думаю здесь все понятно, теперь переходим непосредственно к протекторам

Renamer. Реализация
1b02380a0eb85f9d09b90.png

Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Этот метод рекурсивно проходит по всем неймспейсам (я прошу прощения за сей сленговые слова, просто сейчас уже ночь и я не могу думать в полную силу), т.е при обнаружении дочернего элемента, метод вызывает сам себя и продолжает цикл. Таким образом мы переименовываем все вышеперечисленные поля



StringObfuscation. Реализация
c479ffbd3941124c7fcd4.png

Извините за картинку, но я не очень и хочу, чтобы нубы брали и копировали эти значения. Скриншот сделан в хорошем разрешении, поэтому вы можете приближать картинку
Так, тут уже нужно объяснить поподробнее, т.к. тут идет работа непосредственно с IL инструкциями. Так вот, в методе Protect() мы ищем любую инструкцию типа ldstr (грубо говоря, string в c#). Далее мы внедряем (инжектируем) наш метод шифрации или дешифрации строк (вроде тут используется XOR). Т.е. мы динамически подружаем тип из кода нашего обфускатора и добавляем его в ехешник (стаб). Далее создаем переменную типа string и помещаем туда данные ключа шифрования

Код класса InjectHelper можно скачать тут

Пароль: cyberpunk



Конец первой части
Вот как-то так, друзья. При хоть каком-то отклике, я пойму, что вам действительно интересна эта тема и продолжу

По каким-то доп. вопросам и фидбеку писать: мне
 
Сверху Снизу