exe からソースコードへ逆コンパイル (デコンパイル) 、解析、デコード(Decode) リバースエンジニアリングのやり方

スポンサーリンク
プログラミング

このたび、訳があってあるexe形式の実行モジュールから、デコード、逆コンパイルして元のソースコードを取得、解析できないかと試してみましたので、そのやり方をまとめました。

 

逆コンパイル、デコンパイル、デコード(Decode) とは

逆コンパイルとは、コンパイルと逆のことをすることです。

コンパイラーはソースコードから実行形式(exe形式)のモジュールを作成するのに対して、逆コンパイラーは実行形式のモジュールからアセンブルコード、または運がよければソースコードを取得します。

 

さて、そんなこと出来るんでしょうか?

 

ざっと調べてみると、幾つかのデコンパイラが見つかりました。

 

Telerik

Telerik

JustDecompile .NET Assembly Decompiler & Browser - Telerik
JustDecompile is a free .NET decompiler and assembly browser that makes high-quality .NET decompilation easy.

は、.NETのデコンパイラーです。

 

RecStudio

RecStudio

Download REC Decompiler
decompiler for Windows and Linux binary programs

は、WindowsとLinuxに対応している以外に、32bit、64bitに対応しています。

 

Boomerang

Boomerang

Boomerang Decompiler

は、オープンソースで、SourceForgeで公開されています。

32bitのみ対応しています。

現状ではプロジェクトが活動してないように見えます。

 

C4Decompiler

C4Decompiler

http://www.c4decompiler.com

IA64、64bitのみ対応しています。

まだアルファバージョンのようですが、C言語に変換してくれるそうです。

(このサイトは終了したかもしれません。)

 

JetBrains dotPeek

JetBrains dotPeek

dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains
dotPeek is a free tool based on ReSharper. It can reliably decompile any .NET assembly into C# or IL code.

チェコ共和国の著名なツールメーカー、ジェットブレインズのフリーのデコンパイラーです。

 

PE Explorer

PE Explorer

PE Explorer: PE Editor, EXE File Editor Tool, DLL Reader, Disassembler, Delphi Resource EXE DLL Editing Software.
EXE Editor, Resource Editor, Section Editor, Dependency Scanner, Quick Function Syntax Lookup. View and inspect unknown binary, analysis of headers, procedures ...

カナダのHeaventools Softwareの製品のようです。

 

ちゃんと使えたのはJetBrains dotPeek

今回、ある実行モジュールを調べたくて上記のモジュールはすべてテストしてみました。

結果として使えたのは、JetBrains dotPeekだけでした。

 

JetBrains dotPeekのインストール方法

JetBrains dotPeekをインストールしてみます。

 

dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains
dotPeek is a free tool based on ReSharper. It can reliably decompile any .NET assembly into C# or IL code.

 

dotPeek

こちらから「Download」してインストーラーをダウンロードします。

 

インストーラーを実行します。

dotPeek

dotPeekをインストールします。

 

JetBrains dotPeekの実行方法

インストール完了後、JetBrains dotPeekを実行します。

dotPeek

 

 

[File]→[Explorer Folder]

で実行モジュールが存在するフォルダを開きます。

dotPeek

 

 

実行モジュールが存在するフォルダを開くと自動的にデコンパイルが行われます。

C#など、.NET上で動く実行モジュールは簡単にデコンパイル処理されるようです。

 

dotPeek

 

該当の実行モジュールはC#で作成されたソフトウェアのようで、ご覧の通り、ソースファイル名やクラス名、変数名は仮のIDがつけられますが、ソースコードが吐き出されました。

 

これはスゴイ!

 

いや、かなり危険かもしれません。

 

リバースエンジニアリングは違法か?

ところで、商用のソフトウェアを、デコンパイラーを使ってリバースエンジニアリング、解析することはおそらく違法だと思われます。

 

ソフトウェア(コンピュータプログラム)は著作権の保護を受けるものとされているからです(日本の著作権法では第10条1項九号)。

プログラムの著作物については著作権法第2条第1項第10号の2で「電子計算機を機能させて一の結果を得ることができるようにこれに対する指令を組み合わせたものとして表現したものをいう」と規定され、第10条第1項第9号で著作物として例示されています。

プログラムを著作権法で保護することについては、反対説などもありますが、日本においては、著作権法または特許法のいずれかの保護を受けられる可能性があります。

特許法上の保護を受けるには出願し、特許権を得る必要があるのに対し、著作権法は権利が自動的に発生するという点で両者には大きな相違点があると言えます。

また、プログラムの著作物は著作権法の保護を受けられるのであって、プログラム言語や規約、解法については著作権法の保護対象ではありません(第10条第3項)。

 

ソースコードを難読化しましょう

ソースコードの難読化について以下の通り説明しました。

C#の実行プログラムの難読化(Obfuscation) PreEmptive Dotfuscator and Analytics CE
難読化コード(Obfuscated code)とは、人間が理解しにくいソースコードやマシンコードを指す用語です。 ソースコードを理解しにくいものにするのは実用性はないため、実用的な用途としては、マシンコードを難読化して...

 

難読化したソースを逆コンパイルできるか、JetBrains dotPeekで試してみました。

ご覧の通り、

ISSUE: unable to decompile the method.

となります。

dotPeek

 

難読化すごい。

 

まとめ

商用のソースコードの逆コンパイル、逆アセンブルは違法です。

ただし、何らかの理由でソースコードが紛失した自社のプロダクトから、JetBrains dotPeekを使ってある程度のソースを復旧することは技術的に出来そうです。

 

商用ソフトをリリースする際は難読化しましょう。

デコンパイルについては以下の本が詳しいです。

 

 

プログラミングの無料レッスン体験

 

約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp

<Codecampの特徴>

1 現役エンジニアによる指導

2オンラインでのマンツーマン形式の講義

3大手企業にも導入されている実践的なカリキュラム

↓無料体験レッスン実施中です。

プログラミングのオンラインスクールCodeCamp

 

コメント

  1. TEPODON より:

    解読したプログラムを配布するのが問題であって、
    解読するのが違法な説明になっていないように思えます。
    著作権法では解読そのものは禁止されていませんし、
    解読した著作物の個人利用は合法だと思うのですが。

  2. がらくた屋 より:

    かつて日本の最高裁が、「バグがあった場合に使用者があまりに不利益を被るから」という理由で、「作成者・販売者はリバースエンジニアリングを禁止する権利を持たない」という判決を出しています。ホントですよ。

    • うらした より:

      うーん。
      ソフトウェア作ってご飯食べていますが、理由になっていませんが解読は止めた方がよいと思います。

  3. 何処かの誰か さん より:

    C#は中間コードを利用しているため、[C,C++]と比べて容易に解読できます。
    JetBrains dotPeek だけちゃんと使えたというのはそういう理由だと予測します。