Как отменить обфускацию в .NET?

Обфускация связана только с искажением имен непубличных переменных / членов? Если да, то нельзя ли было бы написать приложение, которое хотя бы изменило эти имена на более удобочитаемые, такие как «переменная1» и т. Д., А затем извлекло бы весь код, который еще можно скомпилировать?


person Joan Venge    schedule 08.03.2011    source источник
comment
Конечно, это возможно. Обычно это называется обратным проектированием / дизассемблированием / декомпиляцией и т. Д. (Если вы ищете инструмент).   -  person stefan    schedule 08.03.2011
comment
Пример такого инструмента см. На de4dot.com.   -  person gregmac    schedule 17.01.2017


Ответы (5)


Нет, речь идет о гораздо большем, особенно с более сложными обфускаторами. Они могут создавать IL, который невозможно выразить на большинстве языков, и где логический поток ужасно запутан, чтобы сбить с толку лучшие инструменты. Вы можете сделать это много времени (вероятно, много вручную), и определенно идет гонка вооружений между обфускаторами и деобфускаторами, но вы сильно недооцениваете технологию здесь.

Также обратите внимание, что многие обфускаторы смотрят на все приложение (а не только на одну сборку), поэтому они также могут изменять общедоступный API.

person Marc Gravell    schedule 08.03.2011
comment
Звучит круто, у вас есть для этого ссылка? Звучит совершенно круто! - person stefan; 08.03.2011
comment
@stefan проверьте brajeshmahor.blogspot.com/2010/11/ - person BrokenGlass; 08.03.2011
comment
@BrokenGlass ничего не делает, о чем писал Марк Гравелл. И я не предполагаю, что вы можете вернуть код 1: 1, но компилируемый и простой для анализа фрагмент кода. - person stefan; 08.03.2011
comment
Спасибо, но как могут обфускаторы так сильно измениться, не нарушая работу приложения, не меняя поведения, не снижая производительность и т. Д.? Также я думал, что им не разрешено изменять общедоступные API. Я предполагаю, что это вариант, который может использовать исходный разработчик, если он знает, что общедоступный API не предназначен? - person Joan Venge; 08.03.2011
comment
@Joan - обычно вы можете явно указать ему игнорировать определенные типы, но в целом на уровне приложения нет общедоступного API; но если вы запутываете библиотеку, тогда да - она ​​должна это сохранить. Повторное замедление; не совсем - CLI не волнует, является ли IL спагетти. - person Marc Gravell; 09.03.2011
comment
@Marc Gravell Опять же, можно мне посмотреть ссылки? Для вашего исходного сообщения и о том, что CLI (по скорости) не заботится, является ли IL спагетти? - person stefan; 09.03.2011
comment
@stafan - просто прочтите любой функции страница доступен - spaghatti === запутывание потока управления. Re CIL забота - с чего бы это? Фактически, я пишу IL на лету для поддерживаемого мною инструмента, а такие инструменты, как отражатель, не могут справиться с этим просто из-за некоторых конструкций IL, которые вы можете использовать ... IL - это странно но мощный. - person Marc Gravell; 09.03.2011
comment
Обфускация элементов управления @Marc Gravell, вероятно, может тормозить кучу дерьмовых оптимизаций в JIT, почему бы НЕ? Ваши ссылки все еще не по теме. - person stefan; 09.03.2011
comment
@stefan может быть какой-нибудь; Честно говоря, я бы не ожидал, что здесь будет много вреда от JIT. Ссылки безусловно относятся к теме сообщения - я так понимаю, вы сосредоточены на запросе производительности? В этом сценарии - YMMV, измерение в вашем локальном сценарии и т.д. - person Marc Gravell; 09.03.2011
comment
Шифрование строк @Marc Gravell и т. Д. Для меня не имеет значения. Я думаю только о потоке кода, и да, я твердо верю, что штрафы за скорость будут сильно варьироваться в зависимости от того, где и как вы запутываете. В конце концов, есть причина, по которой мы хотим глобальную оптимизацию :) - person stefan; 09.03.2011
comment
@Marc, что ты имеешь в виду, когда сказал, что такие инструменты, как рефлектор, не могут с этим справиться? Он не может показать код? Кроме того, если скрипты зашифрованы, как вы сказали, они будут расшифрованы, что потребует больше времени, а также будет несовместимо с интернированием строк и всем остальным, что компилятор C # делает за вас? - person Joan Venge; 09.03.2011
comment
@Joan действительно - рефлектор может показывать il, но не декомпилировать на любой язык; он не запутан сам по себе; просто использует уловки IL, которые вы не можете написать в коде. Полностью запутанный код обычно вообще не загружается в отражатель. повторная стажировка; это не функция компилятора, а JIT / CLI для кода операции ldstr, но на самом деле: он может работать по-другому. Насколько я понимаю, обфускаторы прилагают все усилия, чтобы минимизировать негативные последствия этого. - person Marc Gravell; 10.03.2011
comment
@Marc: Спасибо, если вам это удастся, то разве ваш метод не на шаг впереди обфускаторов? Поскольку у запутанного кода все еще есть структура, но чтение кода IL кажется гораздо менее интуитивным. Также, если вы не возражаете, я спрошу, почему вы это сделали? Просто обмануть рефлектор и перекомпилировать? - person Joan Venge; 10.03.2011
comment
@Joan - мои причины не имеют ничего общего с запутыванием; это некоторый код сериализации OSS, который использует метапрограммирование для написания наиболее подходящего кода сериализации во время выполнения, что может быть довольно ... грубым. Просто в некоторых случаях наиболее подходящим IL случается является то, что не имеет смысла с точки зрения языков. - person Marc Gravell; 10.03.2011
comment
@Marc Gravell, не могли бы вы добавить некоторые из тех обфускаторов, которые вы указываете как лучшие. Мне любопытно увидеть некоторые из имен. - person Prix; 26.04.2011

Это, безусловно, начало обфускатора. Хотя некоторые обфускаторы также шифруют строки и другие подобные уловки, чтобы сделать обратное проектирование сборки очень трудным.

Конечно, поскольку среда выполнения должна запускать сборку после всего этого, решительный хакер может перепроектировать ее :)

person Oded    schedule 08.03.2011

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

Один очень мощный инструмент - de4dot.

Но есть другие.

person Elmue    schedule 06.03.2014

Обфускация - это изменение значимых имен, таких как accountBalance, на бессмысленные, например a1. Приложение, очевидно, по-прежнему будет работать, но понять алгоритмы внутри него будет сложнее.

person Cosmin    schedule 08.03.2011
comment
Это один (глупый) способ запутывания ага. Представьте, что вы находитесь под действием ЛСД и все еще заставляете его работать. Это хорошее запутывание. - person stefan; 08.03.2011

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

Переименование переменных и полей также не поможет вам, так как наличие большого количества переменных1, переменных2 ... не поможет вам понять, что вы читаете.

person Eilistraee    schedule 08.03.2011