C# декомпиляторы?
Это правда? Может кто-нибудь декомпилировать код, который я написал в C# из MSIL? Из файла.exe?
4 ответа
Это в основном правда. Очень умный программист по имени Лутц Редер написал отличный декомпилятор по имени Reflector (теперь принадлежит redgate). Очень хорошо переводить IL обратно в код C# или VB.NET. Это не полная магия, это не может
- перевести константы обратно в их постоянный идентификатор
- восстановить имена локальных переменных
- декомпилировать анонимные методы, кроме как в их промежуточной форме
- декомпилировать итераторы, как указано выше
- декомпилировать лямбды, как указано выше
- декомпилировать код, который использует обещанные асинхронные ключевые слова C# 5, и ждать, как указано выше
- восстановить комментарии в вашем коде.
И имеет несколько ошибок, которые заставляют его прибегнуть к заявлениям goto или упасть. В остальном он очень полезен в качестве средства отладки, помогая обнаруживать и диагностировать ошибки в коде, который вы не написали. Нет документированных случаев, когда кто-либо использовал его для начала успешного бизнеса из пиратского исходного кода, полученного путем декомпиляции. Это работает слишком хорошо для этого.
В противном случае он создал живой сегмент рынка для "обфускаторов", инструментов, которые переписывают содержимое сборки, чтобы затруднить ее декомпиляцию. Типичные стратегии заключаются в том, чтобы переписать идентификаторы, чтобы их стало очень трудно интерпретировать и / или вносить в структуру сборки, чтобы декомпилятор падал, а CLR - нет. Redgate, текущий владелец Reflector, также продает обфускатор. Одна из них включена в платные лицензии Visual Studio и называется "Dotfuscator Community Edition". Понятия не имею, насколько это хорошо, это никогда не проверяется.
Использование большого количества лямбда-выражений и итераторов в вашем коде уже является отличным способом запутать ваш код. Обратный инжиниринг в исходный код очень сложен. То, что Лутц отказался от Reflector в то же самое время, что и он, не является совпадением, тогда C# стало слишком трудно надежно декомпилировать.
Альтернатива с открытым исходным кодом: ILSpy. Я попробовал это, я сам инкапсулирую около 99% функциональности отражателя.
Как отметили @Anthony Pegram и @Saif al Harthi, рефлектор является одним из таких примеров. Он не производит тот же код, который вы написали (в основном потому, что код, который вы написали, оптимизированы до того, как стать IL), но похожий код.
Есть способы бороться с этим, используя класс продуктов, известных как Code Obfuscators. Я не знаю достаточно, чтобы сравнить продукты, но простой веб-поиск "C# Obfuscator" выдает множество бесплатных и коммерческих инструментов.
Как отмечает @Marc Gravell, в вашем источнике не происходит запутывания. Насколько я понимаю, запутывание, как правило, является частью процесса сборки, поэтому получаемый IL - это то, что запутано.
Полный список декомпиляторов доступен здесь: https://github.com/quozd/awesome-dotnet/blob/master/README.md#decompilation
- dnSpy - браузер, редактор, декомпилятор и отладчик с открытым исходным кодом.NET
- ILSpy - ILSpy - это браузер и декомпилятор сборок.NET с открытым исходным кодом.
- JustDecompile Engine - механизм декомпиляции JustDecompile
- dotPeek - бесплатный автономный инструмент на основе встроенного декомпилятора ReSharper. Он может надежно декомпилировать любую сборку.NET в эквивалентный код C# или IL. Он может создавать решения Visual Studio на основе исходных двоичных файлов простым способом. [Собственность] [Бесплатно]