Подтвердить что ты не робот

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

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

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

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

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

Это было мое понимание из этого связанного вопроса, что ngen делает то, что я хочу. Я пробовал использовать ngen. Но после копирования выходного файла из каталога C:\Windows\assemblies\...\applicationName.ni.exe где-нибудь я могу дважды щелкнуть, и попытка запустить его приводит к ошибке об отсутствии "действительного приложения Win32". Кроме того, когда я вбрасываю applicationName.ni.exe в Reflector, я получаю тот же результат, что и я, только с applicationName.exe. Поскольку applicationName.ni.exe должен быть нативным кодом, я ожидал, что Reflector выйдет из строя, но это не так. Если это так, как я должен это делать, почему Reflector все равно дал мне такую ​​прекрасную декомпиляцию?

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

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

Спасибо!

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 6

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

Ответ 7

это бесплатный обфускатор, который очень тихий: eazfuscator

Ответ 8

Наконец-то это возможно с помощью собственного компилятора Microsoft.NET

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

..

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

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

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

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

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

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

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

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

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

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

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

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

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

Это доступно только с VS.NET 2015.

Ответ 9

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

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

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

Ответ 10

Это возможно с использованием компилятора IL2CPU. IL2CPU разрабатывается теми же людьми, которые делают COSMOS (управляемая операционная система с открытым исходным кодом С#) и доступны только при загрузке космоса. IL2CPU создает файлы ASM, которые могут быть скомпилированы через Nasm (некоторые другие ассемблеры могут работать, но лучше использовать nasm). единственная проблема с IL2CPU заключается в том, что она встроена в проект Cosmos, и ее довольно сложно запустить самостоятельно.

Ответ 11

В других ответах упоминается собственный компилятор Microsoft .NET, но не говорится, как это сделать.

Здесь - учебное пособие по компиляции вашего проекта C# с использованием CoreRT.

Примечание: Я также должен был закомментировать следующую строку, чтобы все работало:

<!-- <add key="helloworld" value="https://api.helloworld.org/v3/index.json" /> -->

Результат - исполняемый файл размером примерно 4MB:

Действительно, код больше не читается с помощью декомпиляторов .NET, и IDA Pro (дизассемблер собственного кода) распознает его как собственный код.