#c_sharp #обфускация
Экспериментирую с различными обфускаторами, чтобы защитить свой код от повторного использования. Основная задача - сделать анализ с целью повторного использования настолько трудоемким, чтобы дешевле было написать свой код, а не использовать мой. Уточню - не преследую цель сделать анализ НЕвозможным,- просто, максимально усложнить! Пока остановился на SmartAssembly (версии 6). Деобфусцировал с помощью de4dot. Результат оценивал в Reflector. В связи с этим есть ряд вопросов. В вопросах подразумевается, что анализируемый exe или dll был ранее обфусцирован SmartAssembly. Вопросы: Можно ли с помощью какого либо метода (деобфускация, создание дампа процесса, отладка или что либо другое) без значительных трудозатрат восстановить исходный код (можно без имен переменных) internal и private функций с условием, что они не вызываются из public функций? Если можно, то как? Аналогичный вопрос по поводу исходных имен параметров функций и локальных переменных, используемых в internal и private функциях. Какой обфускатор посоветуете использовать вместо SmartAssembly (только чтобы лицензия была не дороже 150-200$)? Несколько наблюдений (исходя из моих экспериментов): De4dot не восстанавливает имена локальных переменных после SmartAssembly (только переименовывает исходя из их типов для облегчения анализа). А вот структуру кода нормально восстанавливает. Еще восстанавливает имена параметров публичных функций. internal и private функций я не нашел в восстановленном с помощью De4dot файле. Причем, их код не находится даже если вызываешь прямо из него (из кода internal или private функции) public функцию (в то время как ее вызов из публик функции виден http://prntscr.com/78pxf8 и http://prntscr.com/78pxhs) Однако если приватная функция вызывается публичной, то ее можно обнаружить и распознать структуру .
Ответы
Ответ 1
Имена локальных переменных не хранятся в скомпилированной в IL сборке. Они будут уничтожены независимо от использования обфускации. Имена локальных переменных не извлекает деобфускатор, а генерирует декомпилятор. Аргументы функций являются частью публичного интерфейса, поэтому хранятся. Как и всё публичное, они могут быть обфусцированы, если обфускатор не совсем бесполезный. Что такое "приватная функция, которая не вызывается из публичной функции"? А откуда она тогда вызывается? Или функция в конце концов будет вызвана по цепочке публичным кодом (и тогда её код будет в сборке), или она будет полностью отсутствовать в сборке (обфускаторы могут выкидывать неиспользуемый код более дерзко, чем компиляторы). Какой обфускатор посоветуете использовать вместо SmartAssembly (только чтобы лицензия была не дороже 150-200$)? Никакой. Обфускаторы для .NET — пустая трата денег. Чем меньше вы заплатите денег, тем меньше потеряете. Если хочется затруднить декомпиляцию, найдите любой обфускатор, который умеет обфусцировать названия публичных методов. Остальное вообще мусор, потому что всё равно бОльшая часть кода не приватная.Ответ 2
Если функция/метод вызывается, то ее можно найти. Другое дело, что компилятор может ее заинлайнить и она станет частью вызывающей функции. Другой вариант - функция не вызывается и компилятор может ее выбросить. Соотвественно, ее потом никак не найти. То, что Вы не можете найти свою функцию ещё не значит, что ее там нет и ее сложно найти. Анализ все равно начинается с публичных функций и потом спускаются вниз. Имя функции/переменной для компилятора обычно ничего не значит. К примеру, если это переменная цикла, то главное, что бы совпадал тип. А ее имя не имеет никакого значения. Если функция используется локально (локально в понятии компилятора), то ее можно переименовать. Другое дело публичные методы, к которым могут обращаться с внешнего мира. Тут просто так не переименуешь - поломается весь код. Я не особо силен в .NET, но могу сказать, что самый лучший обсфукатор - это Ваш мозг. В большинстве случаев Ваш код понятен только Вам и туда внутрь мало кто будет смотреть. Если кому то нужно будет его использовать - главное будет разобраться с интерфейсом. А что там внутри и как оно обсфуцировано - это проблемы автора. Я лично против обсфукаторов. Это просто способ купить псевдоспокойствие за деньги, не более. Половина обсфукаторов только переименовывает имена переменных. Структуру кода даже не трогает. Некоторые делают простые преобразования (например, разворачивают условие if или переставляют инструкции, что бы запутать деобсфукаторы). Добавляя инструкции в код, они замедляют работу приложения. Также, иногда абсолютно не ведомо, что именно они там добавили. Может статистику считают, а может биткоины генерят. Если Вам страшно за свой код - удалите его с жесткого диска, сам диск сожгите. Так скорее всего никто никогда его не увидет и не сможет "повторно использовать". Менее параноидальный режим - использовать языки, которые меньше подвержены простому декомпилированию - С/С++ (только не CLI).Ответ 3
De4dot не восстанавливает имена локальных переменных Их и без обфускации не восстановить. А вот структуру кода нормально восстанавливает. Это же логично? Еще восстанавливает имена параметров публичных функций. Они являются частью интерфейса для возможности вызова по имени. Возможно, какой-нибудь обфускатор и решит их вычистить. internal и private функций я не нашел в восстановленном с помощью De4dot файле. Возможно, какой-то оптимизатор их просто удалил как неиспользуемые. Однако если приватная функция вызывается публичной, то ее можно обнаружить и распознать структуру . Всё, что может найти jit-компилятор, может найти и декомпилятор. А если не может найти jit, то этот код бесполезен. Возможно, можно запутать декомпилятор кодом, генерируемым компилятором при использовании различных фич C#. Например, вызов по именам параметров, создающий локальные managed-ссылки на переменные, использование iterator function, async-await, приводящих к генерации goto, невалидных для шарповского кода, а также fault-блоков. Необходимость восстановления изначальных конструкций из этого поднимет требования к декомпилятору, но я не думаю, что обфускаторы на такое способны. Это скорее требование к самому коду. Да и декомпиляторы-то развиваются. Однажды случится так, что прошлая версия не могла восстановить код, а новая уже может.
Комментариев нет:
Отправить комментарий