Ковыряю обфусцированный .NET-стилер для внутреннего отчёта (прилетел в фишинге коллеге, машину изолировали). Хочу вытащить конфиг и адреса C2 для блокировки и индикаторов.
Проблема: de4dot на нём складывает лапки — строки зашифрованы, поверх control-flow flattening, методы развёрнуты в один большой switch по стейту, читать невозможно. Похоже на ConfuserEx-производную, маркеры стандартного профиля de4dot не подходят.
Чем разворачиваете CFF и снимаете шифрование строк в таких? Интересует и статический, и динамический путь — что в 2026 реально работает, кроме 'руками по байтам'.
Разбираю обфусцированный .NET-стилер: de4dot сдался на control-flow flattening
Рейтинг: 34.2% · 2 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
✔ Лучший ответ сформирован автоматически — HaskellGuru
@tsav, Я бы не упирался в статику, по стилерам динамика почти всегда быстрее. Распишу свой обычный маршрут. Запускаешь сэмпл в изолированной виртуалке (без сети или с fakedns/inetsim, чтобы он считал, что дозвонился до C2). Многие .NET-стилеры распаковывают и дешифруют реальный пейлоад в память — то, что лежит на диске, часто просто лоадер. Снимаешь распакованные сборки из памяти: pe-sieve/hollow…
Re: Разбираю обфусцированный .NET-стилер: de4dot сдался на control-flow flattening
По описанию это почти наверняка ConfuserEx 2 или его форк (их сейчас десяток). Порядок такой:
1) de4dot-cex (форк de4dot именно под ConfuserEx) — снимает базовый proxy-call и часть строк лучше, чем ванильный de4dot.
2) Если CFF остаётся — есть отдельные деобфускаторы flattening под ConfuserEx, либо пишешь свой проход на dnlib: находишь switch-диспетчер, восстанавливаешь порядок блоков по константам стейта.
3) Строки часто расшифровываются одним статическим методом-декриптором с int-ключом. Найди его в dnSpyEx и прогони все вызовы оффлайн через тот же dnlib, подставляя реальные литералы прямо в IL.
После этого ILSpy 9 читается уже по-человечески.
1) de4dot-cex (форк de4dot именно под ConfuserEx) — снимает базовый proxy-call и часть строк лучше, чем ванильный de4dot.
2) Если CFF остаётся — есть отдельные деобфускаторы flattening под ConfuserEx, либо пишешь свой проход на dnlib: находишь switch-диспетчер, восстанавливаешь порядок блоков по константам стейта.
3) Строки часто расшифровываются одним статическим методом-декриптором с int-ключом. Найди его в dnSpyEx и прогони все вызовы оффлайн через тот же dnlib, подставляя реальные литералы прямо в IL.
После этого ILSpy 9 читается уже по-человечески.
- HaskellGuru
- Сообщения: 12
- Зарегистрирован: 17 май 2026, 00:52
Re: Разбираю обфусцированный .NET-стилер: de4dot сдался на control-flow flattening
✔ Лучший ответ — сформирован автоматически
@tsav, Я бы не упирался в статику, по стилерам динамика почти всегда быстрее. Распишу свой обычный маршрут.
Запускаешь сэмпл в изолированной виртуалке (без сети или с fakedns/inetsim, чтобы он считал, что дозвонился до C2). Многие .NET-стилеры распаковывают и дешифруют реальный пейлоад в память — то, что лежит на диске, часто просто лоадер. Снимаешь распакованные сборки из памяти: pe-sieve/hollows_hunter по процессу либо managed-дамперы вроде ExtremeDumper. Получаешь уже расшифрованные модули, где строки лежат открыто.
Конфиг и C2: у большинства семейств конфиг расшифровывается на старте в строку или JSON. Ставишь бряк в dnSpyEx на строковый декриптор или на сетевые вызовы (HttpClient/WebClient/Socket.Connect) и просто читаешь аргументы в рантайме. Часто C2 виден прямо в стеке параметров до всякого реверса логики.
Если совсем лень — снимаешь сетевой дамп при коннекте к фейковому C2, адрес и формат бикона видно в трафике. Для отчёта с IOC этого обычно достаточно, а полную логику дореверсишь уже статикой по дампу из памяти.
По семействам: если это что-то из ветки RedLine и наследников — там конфиг обычно прямолинейный, декриптор один. Если новодел — может быть многослойно, тогда динамика экономит часы.
Запускаешь сэмпл в изолированной виртуалке (без сети или с fakedns/inetsim, чтобы он считал, что дозвонился до C2). Многие .NET-стилеры распаковывают и дешифруют реальный пейлоад в память — то, что лежит на диске, часто просто лоадер. Снимаешь распакованные сборки из памяти: pe-sieve/hollows_hunter по процессу либо managed-дамперы вроде ExtremeDumper. Получаешь уже расшифрованные модули, где строки лежат открыто.
Конфиг и C2: у большинства семейств конфиг расшифровывается на старте в строку или JSON. Ставишь бряк в dnSpyEx на строковый декриптор или на сетевые вызовы (HttpClient/WebClient/Socket.Connect) и просто читаешь аргументы в рантайме. Часто C2 виден прямо в стеке параметров до всякого реверса логики.
Если совсем лень — снимаешь сетевой дамп при коннекте к фейковому C2, адрес и формат бикона видно в трафике. Для отчёта с IOC этого обычно достаточно, а полную логику дореверсишь уже статикой по дампу из памяти.
По семействам: если это что-то из ветки RedLine и наследников — там конфиг обычно прямолинейный, декриптор один. Если новодел — может быть многослойно, тогда динамика экономит часы.
Re: Разбираю обфусцированный .NET-стилер: de4dot сдался на control-flow flattening
Плюсую dnlib для своего деобфускатора — это в итоге самый надёжный путь, когда готовые тулзы спотыкаются. CFF снимается так: строишь граф блоков метода, находишь переменную-стейт и диспетчерский switch, эмулируешь переходы по константам, перелинковываешь базовые блоки в восстановленном порядке и выпиливаешь диспетчер. Сотня строк кода, и метод снова читаемый.
Строковый декриптор оборачиваешь и зовёшь рефлексией прямо из своего инструмента, заменяя ldstr-цепочки на готовые литералы. Сохраняешь сборку — дальше ILSpy/dnSpyEx. Один раз написал каркас под ConfuserEx, потом переиспользуешь на всех его форках.
Строковый декриптор оборачиваешь и зовёшь рефлексией прямо из своего инструмента, заменяя ldstr-цепочки на готовые литералы. Сохраняешь сборку — дальше ILSpy/dnSpyEx. Один раз написал каркас под ConfuserEx, потом переиспользуешь на всех его форках.
Re: Разбираю обфусцированный .NET-стилер: de4dot сдался на control-flow flattening
Главное — все манипуляции только в отдельной ВМ со снапшотом и без проброса в рабочую сеть, стилеры любят хапать всё подряд из окружения и токены. И не запускай managed-дамп на хосте. А для блокировки прямо сейчас не жди полного реверса: подними фейковый C2, сними индикаторы из памяти и трафика, отдай в блок — разбор логики доделаешь потом спокойно.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
- Kubernetes на Hetzner стоит ли использовать hetzner-cloud-controller-manager в продакшне
6 ответов · 20 просмотров
-
- ControlNet в 2026 — какой тип использовать для анимации персонажа по видео-референсу?
8 ответов · 20 просмотров
-
-
- Flux 1.1 Pro Ultra против SDXL + ControlNet — у кого реально лучше контроль над композицией?
5 ответов · 6 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей