Обзор обфускаторов для .NET
Смею полагать, %username%, что ты знаешь, что такое обфускация, зачем она нужна в мире .NET и чём отличие control flow-обфускации от шифрования MSIL-кода.
Предполагается также, что ты видел .NET Reflector и знаком с каким-либо символьным отладчиком, я приведу примеры на WinDbg.
Темой обфускаторов я занимаюсь довольно долго, но недавно пришлось таки актуализировать знания.
Не так давно передо мной стояла задача выбрать хороший обфускатор для .NET4. Просмотрев кучу софта, я составил небольшой обзор, куда постарался включить самые известные обфускаторы.
Под катом подробнее о каждом.
Записи в табличке идут по алфавиту, дабы никого не обижать.
Шифрует код при помощи NecroBit (название их технологии), на форумах ходят слухи о том, что NecroBit успешно крякнут. Возможно, я просто этого не нашёл, т.к. особых усилий не прилагал. Код разобрать не получилось, WinDbg тоже ничего не нашёл.
Reflector:

Что-то извлечь при помощи WinDbg можно, но IL-код методов не отдаётся.

Его не так давно купила компания RedGate. Честно говоря, выбора RedGate-а я не понял, {sa} не умеет даже шифровать MSIL. Посидев с отладчиком, можно разобраться в коде. Я не советую использовать этот обфускатор, цена $750 явно не соответствует качеству.
Всё, что делает этот обфускатор с кодом — это обфускацтя control flow в примерно таком виде:
Reflector в C# код не разбирает (хотя это сделать несложно), но в IL — отлично:

Скачал супер-пример с их сайта. Обещали, что Reflector не откроет. Reflector, в самом деле, обругался, но открыл:

Продукты одного класса, я считаю, что весьма подходят, если требуется защита кода от дальнейшего рефакторинга и излишнего любопытства.
Babel:

Однако, WinDbg с успехом показал, что внутри сборки, сделанной Babel (вероятно, потому, что у меня была community версия; полную, к сожалению, я не проверял):

На сайте пишут, что работает с исходниками, при этом получается заобфусцированный исходник. Очень интересный подход, но к сожалению, скачать сам обфускатор нельзя. Минус — при таком подходе невозможно шифрование MSIL и неверные инструкции.
На предыдущую версию этого обфускатора было много кряков, которые появлялись очень быстро. Что говорит о том, что хакеры знают, как работает этот обфускатор. На последнюю версию кряка я не видел, но есть нехорошая проблемы:
Использовать можно, но ждите сюрпризов.
Сборка получилась достаточно хорошая, но меня поджидала засада — со сборкой пришли 4 МБ DLL-ек от этого обфускатора:

Весьма известный продукт, я был удивлён, что полученные приложения так просто взломать:

Рефлектором сборку не открыть, она зашифрована. Косяк в том, что сборка зашифрована полностью, и расшифровывается она после того, как запустится приложение. После расшифровки никакой защиты в памяти:

Обфускатор бесплатный. Обидно, что умеет делать только простой rename. Что может порадовать (лично меня больше интересуют консольные или MSBuild-версии) — достаточно простой процесс обфускации, всё сводится к перетаскиванию файла сборки. Вот что получается в итоге

Обфускаторы построены по схожему принципу, умеют исполнять код, внедряя в приложение предкомпилированные сборки .NET, что исключает вероятность перехвата вызовов JIT-компиляции.
Полученные приложения могут запускаться даже без установленного .NET на машине. Размер получившегося приложения — 10..50 МБ, в зависимости от того, какие библиотеки будете использовать.
Стоят эти решения очень дорого. Но, к сожалению, на PostBuild ходят кряки (даже на последний). Вероятно, в известных кругах есть и готовые распаковщики.
Однозначный ответ на этот вопрос не дать, всё зависит от того, что для тебя является ценностью в коде:
Ничего из вышеперечисленного. Я использую свой собственный обфускатор. Это платформенно-зависимое шифрование сборки по кусочкам, по типу .NET Reactor.
Затраты на его создание обошлись примерно $3000-$5000. Да, он ничем не лучше существующих, но есть одно но — принцип обфускации не объявлен публично, пощупать его нельщя. Чтобы его взломать, надо просто потратить больше времени.
Как говорится, думайте сами, решайте сами…
Предполагается также, что ты видел .NET Reflector и знаком с каким-либо символьным отладчиком, я приведу примеры на WinDbg.
Темой обфускаторов я занимаюсь довольно долго, но недавно пришлось таки актуализировать знания.
Не так давно передо мной стояла задача выбрать хороший обфускатор для .NET4. Просмотрев кучу софта, я составил небольшой обзор, куда постарался включить самые известные обфускаторы.
Общие выводы и рассуждения
- Бесплатные обфускаторы весьма слабые и пригодны только для простого переименования. О control flow знают из них лишь немногие;
- Существуют весьма неплохие решения (control flow, MSIL encryption) стоимостью до $500;
- Взрослые решения стоят около 5000, но к сожалению, для многих из них есть распаковщики. Некоторые из них крякнуты.
Крякнули обфускатор — значит поняли его систему защиты. На помойку такой обфускатор. - Есть решения «против быдлохакеров» — сборка шифруется полностью и расшифровывается на лету. Взломать символьным отладчиком такую сборку проще простого.
Под катом подробнее о каждом.
Записи в табличке идут по алфавиту, дабы никого не обижать.
| Название и URL | Стоимость | Control flow | Шифрование MSIL | Подробно... |
|---|---|---|---|---|
| .NET Reactor | $180 | + | + | Шифрует код, сломать его довольно трудно, но возможно, есть распаковщик |
| {SmartAssembly} | $795 | + | - | Используется RedGate-ом. Крякнут. |
| Aspose.Obfuscator | (-) | (-) | (-) | Проект более не поддерживается |
| Assemblur | Free | - | - | Плагин к студии + консоль. Почти ничего не обфускатится |
| Babel | $250 | + | ? | Что-то шифрует, но в рантайме можно выполнить DumlIL, возможно, полная версия работает хорошо |
| BitHelmet | $250 | ? | ? | Упал, сказав, что .NET отсутствует |
| C# Source Code Obfuscator | ? | - | - | Похоже, работает с исходниками .NET. Интересный подход, но кроме описания и примера я ничего не нашёл |
| CilSecure | > $1000 | ? | ? | Платный обфускатор, даже без триала. Кот в мешке. |
| CodeArmor | ? | ? | ? | Ещё один платный обфускатор, весьма мутный и тоже без триала. Поддержка не ответила. |
| CodeVeil | $900 | + | + | Известен тем, что палится в антивирусах. В целом, хорошая штука |
| CodeWall | $400 | + | + | Вменяемый обфускатор |
| Decompiler.NET | $550 | - | - | Заброшен 3 года |
| DeepSea | $200 | ± | - | Склонен делать много switch-ей. В целом, неюзабельно. |
| DesaWare | $1500 | + | ? | Нет .NET 4.0 |
| DNGuard HVM | $900 | ? | ? | Глючная инсталляха без половины кнопок, первое же приложение упало |
| Dotfuscator | $1900 | + | ? | Community-версия весьма скудная, а Enterprise дорогой, но возможно, оно того стоит |
| dotNetProtector | $500 | + | + | Добавил к проекту более 4 MB своих DLL-ек |
| Eazfuscator.NET | Free | - | - | Простой rename |
| Goliath.NET | $115 | + | ± | Сборка рефлектором не открывается, но в WinDbg видно весь исходник |
| NetOrbiter | Free | - | - | Смешной обфускатор. Сделал свой прокет, куда полностью скопировал мой exe-шник и что-то дописал в добавок. |
| Obfuscar | Free | - | - | Простой rename, основанный на Mono.Cecil. .NET 4.0 не поддерживает |
| Obfuscator.NET | $200 | ? | ? | Сделанная сборка сразу же упала. Даже на .NET 3.5. |
| PCGuard for .NET | $400 | ? | ? | Больше ориентирован на лицензирование, чем на обфускацию. Триал не прислали. Посмотреть было бы весьма интересно. |
| Phoenix Protector | Free | (-) | (-) | Даже .NET 3.5 не держит |
| Salamander.NET | $800 | - | - | На примере, приведённом на сайте, рефлектор, конечно, ругается, подозревая засаду, но дизассемблит на ура |
| SharpObfuscator | Free | - | - | По всей видимости, продукт давно заброшен |
| Skater.NET | $100 | - | - | Странная штука, переименовала несколько методов + искала старый ILDASM. Вероятно, заброшен. |
| Spices.NET | $400 | - | ± | Шифрует всю сборку целиком, что плохо |
| VMWare ThinApp | > $5000 | + | + | Полученное приложение может запускаться даже без .NET. Сурьёзная штуковина |
| Xenocode PostBuild | > $1000 | + | + | Сам обфускатор крякнут, что наводит на не очень хорошие мысли |
Подробнее об особо интересных особях
.NET Reactor
Шифрует код при помощи NecroBit (название их технологии), на форумах ходят слухи о том, что NecroBit успешно крякнут. Возможно, я просто этого не нашёл, т.к. особых усилий не прилагал. Код разобрать не получилось, WinDbg тоже ничего не нашёл.
Reflector:

Что-то извлечь при помощи WinDbg можно, но IL-код методов не отдаётся.

{SmartAssembly}
Его не так давно купила компания RedGate. Честно говоря, выбора RedGate-а я не понял, {sa} не умеет даже шифровать MSIL. Посидев с отладчиком, можно разобраться в коде. Я не советую использовать этот обфускатор, цена $750 явно не соответствует качеству.
Всё, что делает этот обфускатор с кодом — это обфускацтя control flow в примерно таком виде:
L_1 br.s L_4
L_2 br.s L_3
L_3 ret
L_4 push
L_5 ldc.i4.1
L_6 br.s L_2
Reflector в C# код не разбирает (хотя это сделать несложно), но в IL — отлично:

Salamander.NET
Скачал супер-пример с их сайта. Обещали, что Reflector не откроет. Reflector, в самом деле, обругался, но открыл:

Babel (тот, который не free), CodeWall, dotNetProtector
Продукты одного класса, я считаю, что весьма подходят, если требуется защита кода от дальнейшего рефакторинга и излишнего любопытства.
Babel:

Однако, WinDbg с успехом показал, что внутри сборки, сделанной Babel (вероятно, потому, что у меня была community версия; полную, к сожалению, я не проверял):

C# Source Code Obfuscator
На сайте пишут, что работает с исходниками, при этом получается заобфусцированный исходник. Очень интересный подход, но к сожалению, скачать сам обфускатор нельзя. Минус — при таком подходе невозможно шифрование MSIL и неверные инструкции.
XHEO CodeVeil
На предыдущую версию этого обфускатора было много кряков, которые появлялись очень быстро. Что говорит о том, что хакеры знают, как работает этот обфускатор. На последнюю версию кряка я не видел, но есть нехорошая проблемы:
- Приложения не нравятся антивирусу, обфускатор зашифровывает сборку и записывает в себя (что радует, сборка шифруется по кусочкам)
- После этого обфускатора, приложения надо очень хорошо тестировать, баги могут упасть в самых неожиданных местах.
Использовать можно, но ждите сюрпризов.
dotNetProtector
Сборка получилась достаточно хорошая, но меня поджидала засада — со сборкой пришли 4 МБ DLL-ек от этого обфускатора:

Spices.NET
Весьма известный продукт, я был удивлён, что полученные приложения так просто взломать:

Goliath.NET
Рефлектором сборку не открыть, она зашифрована. Косяк в том, что сборка зашифрована полностью, и расшифровывается она после того, как запустится приложение. После расшифровки никакой защиты в памяти:

Eazfuscator.Net
Обфускатор бесплатный. Обидно, что умеет делать только простой rename. Что может порадовать (лично меня больше интересуют консольные или MSBuild-версии) — достаточно простой процесс обфускации, всё сводится к перетаскиванию файла сборки. Вот что получается в итоге

VMWare ThinApp, Xenocode PostBuild
Обфускаторы построены по схожему принципу, умеют исполнять код, внедряя в приложение предкомпилированные сборки .NET, что исключает вероятность перехвата вызовов JIT-компиляции.
Полученные приложения могут запускаться даже без установленного .NET на машине. Размер получившегося приложения — 10..50 МБ, в зависимости от того, какие библиотеки будете использовать.
Стоят эти решения очень дорого. Но, к сожалению, на PostBuild ходят кряки (даже на последний). Вероятно, в известных кругах есть и готовые распаковщики.
Что же тебе выбрать, %username%?
Однозначный ответ на этот вопрос не дать, всё зависит от того, что для тебя является ценностью в коде:
- Весь код в совокупности — важна не одна «фишечка» в коде, а код полностью. Зашифруй код каким-нибудь простым обфускатором, лучше зашифровать MSIL. Если важен действительно весь код, расшифровать его полностью будет сложнее написания заново, и никто этим не будет заниматься;
- Отдельная «фишечка» — например, проверка ключа. Я бы посоветовал такой код вообще в паблик не давать, лучше резать функционал в trial-версии. В полной версии ключ проверить обязательно, но риск воровства меньше. Тем не менее, я бы посоветовал использовать обфускатор посерьёзнее.
А что использую я?
Ничего из вышеперечисленного. Я использую свой собственный обфускатор. Это платформенно-зависимое шифрование сборки по кусочкам, по типу .NET Reactor.
Затраты на его создание обошлись примерно $3000-$5000. Да, он ничем не лучше существующих, но есть одно но — принцип обфускации не объявлен публично, пощупать его нельщя. Чтобы его взломать, надо просто потратить больше времени.
Как говорится, думайте сами, решайте сами…



комментарии (68)