Я думаю, что я несколько озадачен компиляцией байт-кода .NET для нативного кода, или, может быть, я запутался в конечном результате. Поэтому, пожалуйста, терпите меня, когда я пытаюсь разобраться в том, что, как мне кажется, я понимаю, чтобы вы могли помочь мне выяснить, чего мне не хватает.
Что я хотел бы сделать, так это скомпилировать мое приложение, написанное на C #, до обычного нативного кода , как если бы я написал его на C. Мои рассуждения не имеют ничего общего с производительностью, скорее с некоторой степенью защиты. Я понимаю, что моя конечная цель не является невозможной (или даже очень сложной) для обхода, но я просто чувствую, что отменить сборку x86 сложнее, чем отменить то, что дает мне Reflector.
Прямо сейчас, если я добавлю свое приложение C # в Reflector, я в основном получу свой исходный код обратно. Как правило, когда я бросаю свои неуправляемые приложения C / C ++ в IDAPro и использую декомпилятор HexRays, я не получаю обратно ту же степень декомпиляции, и мне приходится прибегать к разбиранию разборки 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
звонки?