DotPeek не правильно десериализовать dll
Я декомпилировал DLL с помощью dotPeek 1.4, чтобы увидеть, что происходит внутри, но есть что-то странное в коде C# (пожалуйста, посмотрите вложения). Есть
- Объявление var без имени var
- Я думаю, что некоторые вар это числа, у них нет названия
Почему этот код был сгенерирован? Может ли dll быть защищена от декомпиляции, или dll была опубликована в качестве релиза?
Та же проблема существует, когда я декомпилирую пробную версию Reflector
2 ответа
Во-первых, вы нарушаете лицензионное соглашение, пытаясь перепроектировать их код.
е. Разборка. Вы не можете перепроектировать, декомпилировать, дизассемблировать или иным образом пытаться получить доступ к информации, касающейся конструкции ПРОДУКТА.
Это потому, что.NET допускает намного больше, чем az в именах переменных. Вы можете прочитать об этом в разделе MSDN по идентификаторам (C#). Visual Studio не понравится переменные и будет жаловаться, но они совершенно действительны в IL (хотя они не действительны в C#).
Взглянув на другие инструменты или выгрузив в гекс, вы увидите, что переменные скрыты и выглядят как
который на самом деле ACK
символ ^F, за которым следует символ "НАЧАЛО ТЕКСТА", который выглядит как символ пробела, но не является символом пробела. Другие используемые символы включают символ возврата.
IL для приведенного выше кода будет что-то вроде
.field private static initonly string '\u0001'
.field private static initonly string '\u0002'
.field private static initonly string '\u0003'
.field private static initonly string '\u0004'
.field private static initonly string '\u0005'
.field private static initonly string '\b'
.field private static initonly string '\u0002\u2000'
.field private static initonly string '\u0003\u2000'
.field private static initonly string '\u0005\u2000'
.field private static initonly string '\b\u2000'
Вы поняли идею.
Я хотел бы на самом деле знать, что они специально использовали, чтобы запутать этот код (потому что выглядит весело!). Код был сгенерирован с использованием чего-то вроде http://reflexil.net/ что позволяет скомпилированной dll сохранять подсказки об имени переменной (но изменяет их на бессмысленные), поэтому декомпилятор отображает все странные имена (декомпилятор считает, что это быть умным, сохраняя имена переменных, упомянутых в dll).
В действительности нет никакой причины, по которой декомпилятор генерировал бы пустые имена полей и переменных, независимо от того, насколько запутана или оптимизирована сборка. Поля и сигнатуры методов являются частью метаданных сборки, которые нельзя удалить. Имена могут отсутствовать в запутанной сборке, но тип все еще должен быть там, и декомпилятор должен иметь возможность генерировать новые имена.
Может быть, этот декомпилятор не очень хорош?
"Умный" обфускатор может сделать что-то смешное, чтобы сбить людей с толку, например, используя невидимые символы Юникода в качестве имен идентификаторов, но видя, что ему удалось сгенерировать имя, такое как param0
скорее всего, декомпилятор просто не работает должным образом. Вы можете проверить это, посмотрев файл в текстовом редакторе, предназначенном для программирования, который отображает каждый символ.