より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

これでキミはC#の考古学者!?「dnSpy」と「dotPeek」

知り合いが担当システムについて

ソースがないdllもあります

って話していたのですが、だったら、どうやって改修するのと聞いたら、dllからデコンパイルするらしいです。

リリースされているサーバーのaspxからソースを回収して開発と言うのは聞いたことがあったものの、dllからデコンパイルってあるのか、と。

その時にdnSpyというツールを使っているらしいです。

qiita.com

そういえば、Resharper UltimateだからdotPeekを自分を持っていたなと。

www.jetbrains.com

原則的に権利が絡むので他人様のdllをこれらのツールで覗くのには注意が必要です。

今回は自分のGitHubに公開しているC#リポジトリのdllで試してみることにします。

dnSpy

驚くのは、なんとGUIがダークと凝ってます。

肝心のdllのデコンパイルは以下。

f:id:rimever:20190618205252p:plain

細かい点を見れば

  • flag1とかflag2というローカル変数名
  • yield breakがなぜ二つあるのか?

はどうかな、と思えますが、えっ、本当にデコンパイルしたの?

本物のソースなんじゃないというほどの復元。

dotPeek

dnSpyでハードルが高くなった有償のdotPeekはというと・・・

f:id:rimever:20190618205356p:plain

これはかなりの再現度です。

使わなくなった変数をわざわざnullで解放している点を除けば、ほぼ完璧です。

どこからか元ソースを見つけて来たのかというほどです。

そんなはずはない!とGitHubからdllを直接ダウンロードしたのですが、これがその結果です。

pdbもありません。なのに、これ。

さすが有償ツール。

結論

dnSpyでもデコンパイルの性能は高いです。

dotPeekならなお良し。

これで化石のように眠ったソースをdllから復旧させられることもわかりました。

ソースをコミットせずに退職されてしまったとか聞いたことありますから。

こういったツールのお世話にならないことが望ましいですね。

悪用もすべからず。また、C#のソースはそれだけデコンパイルされやすいというリスクを目の当たりにしました。

難読化のような工夫が必要でしょう。