.NETアプリケーションをデコンパイル「Reflector for .NET」と言う題名で紹介された
.NETアプリを逆コンパイルして元のソースを見るツールを使ってみた。
さすが.NETアプリ、中間コード解析されて丸見え。
対象を読み込ませるだけの簡単操作でココまで出来るなんて面白い
日本語変数名もばっちり解析されて、逆アセンブルのような暗号ぽさがありません。
記事では「難読化ツール」の存在が紹介されていましたが
対外人用にオール日本語表記で書けば、ええんじゃねとか思ったり。
![逆コンパイル](http://farm3.static.flickr.com/2097/1573048261_7cd42524dc_m.jpg)
画像のソースはGMM2.exeで緯度経度を指定して「Yahoo!地図情報」をブラウザに表示させる処理の部分
まるっきり同じというわけではないですが、そのままコピーして使える出力に仕上がっています。
たとえばif (!yahoo地図.JGD2TKY())
{
return;
}
のあたり、私の組んだソースでは上記のようになっていますが、中間コードの解析では
if (yahoo地図.JGD2TKY())
{
string web_Yahoo緯度 = yahoo地図.TKY緯度_deg;
string web_Yahoo経度 = yahoo地図.TKY経度_deg;
string url = "http://map.yahoo.co.jp/pl?sc=3";
url = (url + "&lat=" + web_Yahoo緯度) + "&lon=" + web_Yahoo経度;
this.webBrowser1.Navigate(new Uri(url));
}
とfalseの場合抜けろと書いてある部分が、trueなら以下を実行せよと逆になっている(なんなら画像で確認してね)。
if (yahoo地図.JGD2TKY()){}以下は処理は無く抜けるだけなので、
Visual C#が中間コード変換時に最適化している様子がここに見られます。
他にもurl文字列作成の部分も人間的に見やすく(冗長?)書いてある箇所が一気にまとめられてたり。
あとコメントはどこにも入っていません、最初から中間コードに存在しない要素だからでしょう。
人のソースを見て(・∀・)ニヤニヤするより、C->asmのように新しく入ったコンパイラがたとえばprintf*1の処理をどんな感じで
マシン語に変換している様子を見ている雰囲気です。
わざわざ逆コンパイルして自分のソースを眺めるのもドキドキして良いかも?
. : .:::::::|//:/! :./:.:.:.:. :! ヽ: : ∨: . . ヾ
. : .:::::::|/: : : /:.:.:.:イ:. :.,' i: :.ト、: : : . . ヘ
. : .:::::::|: : :_/__//:. :/ l: :.!、!: : : ヽ : . . . ハ
. : .:::::::| '´// /:.:, ' l: ,' !`ヽ: : ',: : : : : : :',
. : .:::::::|: / // l/ l,イ: : : :.i : : : : : : ∨
. : .:::::::|,ィ≠ミ、 ∨: : |: : ',: :.|、: :.l
. : .:::::::|> ● Y ,ィ≠ミ、 ∨: !: : :i: :.! ヽ: !
. : .:::::::|'"ー- ´ ● ヒ .∧/:. ∨: ,' .}:!
. : .:::::::| ‐-、 ./l:.:.:.:. : |:./ ノ! >>見えてますよ.NET
. : .:::::::| ` /ノ:.:.:.:. : k
. : .:::::::| `ー=- /:.:.:.:.:,ィ:. : !
. : .:::::::|`、 、 ' _.. イ:.:.:.:.:./ |: :.,'
. : .:::::::|: .:ヽ ` ' ,ー: ..i:´::|:. :. |/:.:.:./ .l:./
. : .:::::::|: . : .\/: . : .,':::::::i:. :./:.:,.:イ
------------------
*1:マイコン用の組込み用コンパイラにはメモリ節約のためライブラリの内容や処理がはしょられている物があったりする。
特にprinffなんかの文字列,string関係はANSI-Cなにソレ?という物や
リンク時に文字列ライブラリを外して必要な処理だけ自分で作ったり(俺仕様 printf ...)
Windowsアプリに見る富豪的プログラムとは対極を味わえるw