Компиляция C# в Native?


Я думаю, что я несколько запутался в компиляции .NET байт-кода в машинный код, или, может быть, я запутался в конечном результате. Поэтому, пожалуйста, потерпите меня, пока я пытаюсь разобраться в том, что, как мне кажется, я понимаю, чтобы вы могли помочь мне понять, чего мне не хватает.

то, что я хотел бы сделать, это скомпилировать мое приложение, написанное на C# до обычного машинного кода как я бы получил, если бы я написал его в C. мои рассуждения не имеют ничего общего с производительностью, а скорее с некоторой степенью о защите. Я понимаю, что мою конечную цель не невозможно (или даже действительно трудно) обойти, но я просто чувствую, что реверсирование сборки x86 сложнее, чем реверсирование того, что дает мне рефлектор.

прямо сейчас, если я брошу свое приложение C# в Reflector,я в основном верну свой исходный код. Обычно, когда я бросаю свои неуправляемые приложения C / C++ в IDAPro и использую декомпилятор HexRays, я не совсем получаю ту же степень декомпиляции, и мне нужно прибегните к пробираться через x86 разборки, чтобы понять логику потока. Я понимаю, что такая большая декомпиляция исходит от Reflector из-за того, что приложение находится в MSIL вместо более краткого собственного кода, который HexRays пытается декомпилировать.

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

это было мое понимание от этой вопрос что ngen делает то, что я хочу. Я пробовал использовать ngen. Но после копирования выходного файла из C:Windowsassemblies...applicationName.ni.exe каталог где-то я могу дважды щелкнуть, и при попытке запустить его выдает ошибку о том, что он не является "допустимым приложением Win32". Далее, когда я бросаю applicationName.ni.exe в рефлектор, я получаю тот же выход, что и я сделал только из applicationName.exe. Так как applicationName.ni.exe должен быть родной код, я ожидал, что рефлектор ошибется, но это не так. если это так, как я должен это сделать, почему рефлектор все еще дает мне такую большую декомпиляцию?

Итак, чтобы снова подвести итог моему главному вопросу: как я могу скомпилировать свою программу .NET в собственный двоичный файл, который Reflector не будет так легко декомпилировать? Или Каковы некоторые рекомендации по защите продукта, написанного на языке .NET, от новичков-реверсивных инженеров?

если мне нужен другой инструмент, я бы предпочел что-то свободное, а не что-то вроде замки.

спасибо!

обновление: Я понимаю, что то, что я ищу может ограничить некоторые функции языка как отражение, но я думаю, что я в порядке с этим. Ни один из моего кода не делает никаких явных Assembly.Load звонки или что-нибудь в этом роде. Но не могли бы они просто быть заменены на GetProcAddress/LoadLibrary в любом случае звонки?

10 60

10 ответов:

Я проверен .NET Native on VS2015 & Windows 8.1 (при правильной настройке проверьте .proj для проверки) и построение для конкретной архитектуры (может быть излишним, не проверено), создаст собственный файл, который даст вам "тяжелее, чтобы перепроектировать " код, который вы ищете, который для меня был недоступен для чтения .dll через DotPeek(бесплатный декомпилятор .Net от JetBrains).

Это не так, как ngen.исполняемые произведения. Он просто запускает JIT-компилятор спереди для генерации .ni.exe или ...ni.dll модуль. Этот двоичный файл не содержит метаданных, только машинный код, созданный из IL для тел метода. Среда CLR по-прежнему должна найти исходную сборку. Только тогда он может определить, что имеется ngen-ed-образ, чтобы он мог использовать машинный код из него, а не генерировать его из IL сборки.

Ngen.exe ускоряет прогрев время запуска вашего приложения, вот и все.

мой обычный совет всем, кто может быть заинтересован в разборке моих сборок, - указать им sourceforge.net он имеет терабайты исходного кода, написанного и поддерживаемого программистами, которые обычно лучше меня. Иногда даже с хорошими комментариями. Если ваш обфускатор не работает хорошо, то магазин вокруг для лучшего. Есть много.

на построить, Microsoft объявила .NET Native. Согласно часто задаваемые вопросы,"... Первоначально мы фокусируемся на приложениях Магазина Windows с .NET Native. В долгосрочной перспективе мы будем продолжать совершенствовать собственную компиляцию для всех приложений .NET."

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

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

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

NGEN добавляет собственный код, но не удаляет MSIL. Поэтому любой инструмент, работающий на MSIL, все еще может работать. Вам также нужно это для отражения, что было бы очень трудно для истинного родного компилятора.

Это бесплатный обфускатор, который является тихим хорошо: eazfuscator

Я мог бы отступить и спросить, почему вы ищете этот тип защиты. Я не пытаюсь утверждать, что вы не нуждаетесь в защите, но я думаю, стоит понять мотивацию.

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

Если это вопрос IP, то я думаю, что обфускация, вероятно, ваш лучший подход здесь. Это вроде как поставить замок на вашей двери. Кто-то может сломать замок и войти, но они намеренно делают это, а не просто идут в дверь.

это, наконец, возможно с помощью Microsoft .NET Native compiler

он автоматически компилирует выпускную версию приложений, написанных в управляемом коде (C# или Visual Basic) и предназначенных для платформы .NET Framework и Windows 10 в машинный код.

..

•ваши приложения обеспечат превосходную производительность собственного кода.

•вы можете продолжать программировать на C# или Visual Basic.

•вы можете продолжать использовать ресурсы, предоставляемые платформой .NET Framework, включая ее библиотеку классов, автоматическое управление памятью и сборку мусора, а также обработку исключений.

для пользователей ваших приложений .NET Native предлагает следующие преимущества:

•быстрое время выполнения

•последовательно быстрое время запуска

* низкие затраты на развертывание и обновление

•оптимизированное использование памяти приложения

но .NET Native включает в себя больше, чем компиляцию в машинный код. Он преобразует способ создания и выполнения приложений .NET Framework. В частности:

•во время предварительной компиляции необходимые части .NET Framework статически связываются с вашим приложением. Это позволяет приложению работать с локальными библиотеками приложений платформы .NET Framework, а компилятору выполнять глобальный анализ для обеспечения выигрыша в производительности. В результате приложения запускаются последовательно быстрее даже после .NET Обновления фреймворка.

•собственная среда выполнения .NET оптимизирована для статической предварительной компиляции и, таким образом, может обеспечить превосходную производительность. В то же время он сохраняет основные функции отражения, которые разработчики считают настолько продуктивными.

•.NET Native использует тот же внутренний сервер, что и компилятор C++, который оптимизирован для статической предварительной компиляции вариант развития событий.

https://msdn.microsoft.com/en-us/library/dn584397 (v=vs. 110). aspx

Это доступно только с помощью VS.NET 2015 год.

Это возможно с помощью компилятора IL2CPU. IL2CPU разработан теми же людьми, которые делают COSMOS (C# Open Source Managed Operating System) и доступен только при загрузке cosmos. IL2CPU производит ASM файлы, которые могут быть скомпилированы через Nasm (некоторые другие ассемблеры могут работать, но лучше всего использовать nasm). единственная проблема с IL2CPU заключается в том, что он встроен в проект Cosmos, и его довольно сложно заставить работать самостоятельно.