Компилирование C # для Native? - PullRequest
62 голосов
/ 17 декабря 2009

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

Ответы [ 11 ]

1 голос
/ 18 апреля 2019

Здесь - учебник, использующий CoreRT о том, как скомпилировать ваш C# проект в нативный код.

Примечание: Мне также пришлось закомментировать строку, чтобы все работало:

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

Вывод - это исполняемый файл размером примерно 4MB:

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

...