ロボットと共に

Life with Robot

C#の難読化と逆コンパイルを試してみる

はじめに

 ソフトウェア開発者にとってリバース エンジニアリング対策を考慮しなければいけないことは悩みの種であるわけで、特に.NET系やJavaなどはリバースエンジニアリングしやすいということで、対策が必要とされています。

 ということでC#で難読化したものを逆コンパイルして試してみます!!

難読化が必要な理由

 Microsoftが記載する「難読化が必要な理由」から引用

.NET 用に作成されたプログラムは、リバース エンジニアリングが簡単です。これは .NET のデザインに不備があるからではありません。最新の中間コンパイル言語が採用されているからです。.NET は表出的なファイル構文を使用して実行可能コード、すなわち MSIL (Microsoft Intermediate Language) を配信します。このような中間ファイルは、バイナリのマシン語コードよりも高度なもので、直接表示でき、最終的に理解可能な識別子やアルゴリズムを積み重ねたものです。判読性を高め、柔軟性と拡張性を持たせながら、同時に重要な部分を難読化することは、もちろん容易なことではありません。
.NET 逆コンパイラは誰でも無償で入手でき、これを使用してコードを簡単にリバース エンジニアリングできます。誰でもすぐに、ライセンス供与されたコード、コピー保護メカニズム、所有権を有するビジネス ロジックなどを、(合法的であるかどうかは別として) かなり判別しやすい状態にすることができます。どのような目的であれ、ソフトウェアの詳細を隅々まで調べることができるため、セキュリティ上の欠陥を探して利用したり、ユニークなアイデアを盗んだり、プログラムをクラックすることなども可能です。
これが必ずしもリスク、または重大な問題になるわけではありません。知的財産について懸念のある組織は、.NET プラットフォームを考える際、リバース エンジニアリングを防ぐためのソリューションが存在することを知っておく必要があります。難読化は、アセンブリ内のシンボルの名前をシームレスに変更する技法であり、その他にも逆コンパイラを妨害する対策を備えています。難読化を正しく適用すると、アプリケーションはそのままにして、さまざまな規模の逆コンパイルに対する保護を高めることができます。

 

難読化ツール

  1. ConfuserEx
  2. DotNet Patcher
  3. NanDoKu
  4. Obfuscar
  5. Phoenix Protector
  6. SharpObfuscator

なかでも今回は個人的に一番難読化された感があるConfuserExで難読化を試してみます!!なお逆コンパイルツールは有名な「ILSpy」を使用します。

難読化結果の比較

 サンプルソースコードは、こちらの過去のソースで試してみます。

robot-egg.hatenablog.com

 

ConfuserExの使い方は、下記をご参考ください。

heetnote.com

 

実際に難読化する前と後をご覧ください。難読化する前はまるわかりですねw

実は一部、元ソースとは別の記述になっている箇所もあります。逆コンパイルしたからといって、そのまま動くとは限りません!!しかし、頑張れば動きそな雰囲気はプンプンしますねw

そして、難読化後は一見キレイに逆コンパイル出来ているかのようにも見えますが、よくわからない記述がたくさんあり、元ソースとも難読前の逆コンパイルしたソースとも異なります。このコードでは頑張っても、同じ機能が動くようには到底思えませんねw

特にいちばん大事な「https://api-us.faceplusplus.com/facepp/v3/detect」がパっと見では記述されていないように見えます!!こちらを解読する用のクラスがありますが、やはりパッと見ではわからず、実装して動かさなければいけない努力と時間、コーディング技術、理解力などが必要になりますね♪

難読化前

f:id:Mikan6:20170827012410p:plain

難読化後 

f:id:Mikan6:20170827012415p:plain

最後に

 難読化は、エンジニアには面倒な作業ですがソースコードの財産を守るには、コストと時間を考慮して必要になる重要な要素ですね!!有料版を購入できれば、難読化や暗号化含めて簡単でかつ効果的な良いものがあるかと思いますが、フリーでここまでできれば御の字かと...

 サンプルソースコードは、あくまでも参考としてご利用下さい。また、各種ライブラリのライセンスにも目を通して、ご利用下さい。
ご利用した方は、コメント頂けると個人的に励みになります。