Я думаю, что я несколько запутался в компиляции байт-кода .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
?