web-dev-qa-db-ja.com

C#をネイティブにコンパイルしますか?

.NETバイトコードをネイティブコードにコンパイルすることについて多少混乱していると思うか、最終結果について混乱していると思います。だから、私が理解していると思うことを整理しようとしていますので、私と一緒に我慢してください。

私がやりたいのは、C#で書かれたアプリケーションを通常のネイティブコードにコンパイルすることです。私の推論はパフォーマンスとは関係なく、むしろある程度の保護と関係があります。私の最終目標を回避することは不可能ではないことを理解していますが、x86アセンブリを元に戻すことは、Reflectorが提供するものを元に戻すことよりも難しいと感じています。

現在、C#アプリケーションをReflectorにスローすると、基本的にソースコードが返されます。通常、アンマネージC/C++アプリケーションをIDAProに投入し、HexRaysデコンパイラーを使用する場合、同じ程度の逆コンパイルはまったく得られず、ロジックフローを理解するためにx86の逆アセンブリーを繰り返す必要があります。 HexRaysが逆コンパイルしようとする、より簡潔なネイティブコードではなく、アプリケーションがMSILにあるため、このような素晴らしい逆コンパイルはReflectorからもたらされると理解しています。

クライアントマシンが.NETランタイムをまだ必要としているという心配はありません。それを回避しようとはしていません。私のプログラムでupxのような通常のソフトウェア難読化プログラムを実行したいのですが、.NETバイナリとして実行すると失敗します。

ngenが私が望むことをするのは this 関連の質問からの私の理解でした。 ngenを使用してみました。しかし、出力ファイルをC:\Windows\assemblies\...\applicationName.ni.exeディレクトリからダブルクリックできる場所にコピーした後、実行しようとすると、「有効なWin32アプリケーション」ではないというエラーが発生します。さらに、applicationName.ni.exeをReflectorにトスすると、applicationName.exeからだけでしたのと同じ出力が得られます。 applicationName.ni.exeはネイティブコードであると想定されているため、Reflectorはエラーになると予想していましたが、そうではありませんでした。これが私がこれを行うことになっている場合、なぜReflectorは私にそんなに素晴らしい逆コンパイルを与えたのですか?

それで、私の主な質問を要約すると、Reflectorがそれほど簡単に逆コンパイルできないネイティブバイナリに.NETプログラムをコンパイルするにはどうすればよいですか?または、.NET言語で書かれた製品を初心者のリバースエンジニアから保護するためのベストプラクティスは何ですか?

別のツールが必要な場合は、 Codewall のようなものではなく、無料のものを好むでしょう。

ありがとう!

UPDATE:私が探しているものがReflectionのような言語の機能の一部を制限するかもしれないことを理解していますが、私はそれでいいと思います。私のどのコードも、明示的なAssembly.Load呼び出しなどを一切行いません。しかし、とにかくGetProcAddress/LoadLibrary呼び出しに置き換えることはできませんか?

64
mrduclaw

私はただ検証済み。Net Native on VS2015Windows 8.1(正しく構成されたら、検証するために.projを調べます)特定のアーキテクチャ用にビルドすると(過剰である可能性があり、検証されていない可能性があります)、ネイティブファイルが生成されます。これにより、探している「リバースエンジニアリングが困難。dll経由でDotPeek(JetBrainsから無料の.Netデコンパイラー)を読み取ります。

21
Sivx

それはngen.exeの仕組みではありません。 JITコンパイラを前もって実行して、.ni.exeまたは.ni.dllモジュールを生成するだけです。そのバイナリファイルにはメタデータは含まれず、メソッド本体用にILから生成されたマシンコードのみが含まれます。 CLRはまだ元のアセンブリを見つける必要があります。そうして初めて、アセンブリのILから生成するのではなく、そこからマシンコードを使用できるように、利用可能なngen-edイメージがあると判断できます。

Ngen.exeは、アプリのウォームスタートアップ時間を短縮します。それだけです。

私のアセンブリを分解することに興味があるかもしれない人への私の通常のアドバイスは、それらをsourceforge.netに向けることです。テラバイトのソースコードがあり、通常は私よりも優れているプログラマーによって作成および保守されています。時には良いコメントを付けても。難読化ツールがうまく機能しない場合は、より良いものを探してください。沢山あります。

29
Hans Passant

昨日、 Build 2014 で、Microsoftは 。NET Native を発表しました。 [〜#〜] faq [〜#〜] 、 "...によると、当初は、.NETネイティブのWindowsストアアプリに焦点を当てていました。すべての.NETアプリケーションのコンパイル。」

18
Ðаn

コードを保護する場合は、難読化ツールが一般的なアプローチです。 Dotfuscator はしばらくの間、リフレクターとの軍拡競争にあり、製品で使用しています。ただし、実際には、熟練した人間は難読化されたコードを簡単に読むことができます。

ネイティブコードにコンパイルすると、マネージ言語を持つという目的が無効になります。主な利点は、ターゲットランタイムがILをJITして、ターゲットCPUに最適なものにすることです。そうでない場合は、 monoのahead-of-timeオプション のようなものを使用します。

17
plinth

スプーン(以前のXenocode)には ニーズに合った製品 があります。 WPFベースのインストーラーUIに使用するので、セットアッププログラムを読み込むためにbootstrap .netをする必要はありません。

8
dkackman

NGENはネイティブコードを追加しますが、MSILは削除しません。したがって、MSILで動作するツールは引き続き機能します。これは、リフレクションにも必要です。これは、真のネイティブコンパイラにとっては非常に難しいことです。

7
MSalters

これは無料の難読化ツールであり、静かです: eazfuscator

5
chris

これは、Microsoftの.NET Nativeコンパイラを使用して最終的に可能になります

マネージコード(C#またはVisual Basic)で記述され、.NET FrameworkとWindows 10をネイティブコードにターゲットとするアプリのリリースバージョンを自動的にコンパイルします。

..

•アプリはネイティブコードの優れたパフォーマンスを提供します。

•C#または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でのみ利用可能です。

5
Amir

後戻りして、なぜこのタイプの保護を探しているのかと尋ねるかもしれません。私はあなたが保護を必要としないと主張しようとはしていませんが、私は動機を理解する価値があると思います。

たとえば、システムにアルゴリズムがあり、誰かがリバースエンジニアリングを行うとセキュリティが破壊されるため、保護が必要な場合は、別のアプローチを検討する必要があります。これは、アルゴリズムに欠陥があり、難読化やネイティブコンパイルがまったく役に立たないことを意味します。

IPの問題であれば、難読化がおそらくここでの最善のアプローチだと思います。ドアに鍵をかけるようなものです。誰かがロックを解除して侵入することはできますが、彼らはドアを歩いているのではなく、意図的にそれを行っています。

4
Brian Genisio

これは、IL2CPUコンパイラを使用して可能です。 IL2CPUは、COSMOS(C#オープンソースマネージドオペレーティングシステム)を作っている同じ人々によって開発されており、cosmosをダウンロードすることによってのみ利用可能です。 IL2CPUは、Nasmを介してコンパイルできるASMファイルを生成します(他のアセンブラーも機能する場合がありますが、nasmを使用するのが最善です)。 IL2CPUの唯一の問題は、Cosmosプロジェクトに組み込まれていることです。IL2CPUを単独で実行することは非常に困難です。

3

他の回答では、Microsoftの.NETネイティブコンパイラですが、その方法は教えません。

ここ は、CoreRTを使用して、C#ネイティブコードへのプロジェクト。

注:すべてが機能するには、次の行もコメントアウトする必要がありました。

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

出力はおよそ4MBサイズの実行可能ファイル:

確かに、コードは.NETデコンパイラと IDA Pro (ネイティブコード逆アセンブラー)は、それをネイティブコードとして認識します。

3
BullyWiiPlaza