1. ホーム
  2. c#

C#をNativeにコンパイルする?

2023-08-13 16:26:47

質問

私は、.NET バイト コードをネイティブ コードにコンパイルすることについて、多少混乱していると思います。 そこで、私が理解していると思うことを整理してみるので、何が欠けているのかを把握するのに役立つと思いますので、お付き合いください。

私がしたいことは、C# で書かれた私のアプリケーションを通常のネイティブ コードにコンパイルすることです。 私の理由は、パフォーマンスとは何の関係もなく、むしろある程度の保護が必要なのです。 私の最終目標は、回避することが不可能ではない (あるいは、実際にはそれほど困難ではない) ことを理解していますが、x86 アセンブリを元に戻すことは、Reflector が私に与えるものを元に戻すことよりも困難であるように感じているだけです。

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

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

それは、私の理解では この に関連した質問で ngen は私が欲しいものをします。私は ngen . しかし、出力ファイルをコピーした後 C:\Windows\assemblies\...\applicationName.ni.exe ディレクトリからダブルクリックできる場所にコピーした後、それを実行しようとすると、有効な Win32 アプリケーションではないというエラーが発生します。 さらに、私が applicationName.ni.exe を Reflector に放り込むと、単に applicationName.exe . ということは applicationName.ni.exe はネイティブコードであるはずなので、Reflector はエラーになると思っていたのですが、そうではありませんでした。 もしこれが私が想定している方法なら、なぜ Reflector はまだこんなに素晴らしいデコンパイルをしてくれたのでしょうか?

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

別のツールが必要な場合、私は無料のものを好みますし、次のようなものではありません。 コードウォール .

ありがとうございます。

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

どのように解決するのですか?

私はただ を検証しました。 .Netネイティブ について VS2015 & Windows 8.1 (正しく設定されている場合、.proj を調べて検証してください) と特定のアーキテクチャ用にビルドすると (やりすぎかもしれません、検証していません)、ネイティブファイルを生成して " を提供することになります。 リバース エンジニアリングが困難 というコードになります。 .dll を経由して ドットピーク (JetBrainsのフリーな.Netデコンパイラ)を使用します。