search
LoginSignup
0

posted at

dnSpy(デコンパイラ)を使ってみる

なぜ使おうと思ったか

私はVisualBasicで作ったプログラムを公開しているのですが、バージョンアップの際、誤って公開しているバージョンのソースコードを直接書き換えてしまいました!
(近頃では、みなさんGitHubとか利用されておられるようなので大丈夫かと思いますが)
元に戻す努力はしましたが、ビルドしたEXEファイルのサイズが公開しているものと異なるのがどうしても気になっていました
ビルドした時期も異なるので、こういうことも有るのかなぁとも思いましたが、何か調べる方法は無いかと考えました

方法

バイナリコードを可視化(デコンパイル)する類のプログラムが多く存在することは知っていました
しかし、他人の成果物を無許可に解析するのは犯罪ですし、これまでそういうことへの必要性が無かったこともあり、気にしたことはありませんでした
今回は自分のコードを可視化して比較してみました

作業内容

結局、dnSpyというソフトを使いました
dnSpyは、.NET Frameworkの中間コードを可視化できます
ソースコードも公開されている関係上、危険な亜種も存在するようです、気を付けましょう

可視化したコードは単純には比較できないので、結局目視となります
ただ、dnSpyのウィンドウでは、ファイル名や関数名ごとに出力を確認できるので、大体どの辺りを修正したか覚えていれば、確認個所は少ないと思います

可視化した結果

すごいです、難読化とかしていない私のコードなんかは、丸見えです

自分のコード
    If My.Settings.Japan = True Then
      LblProgress1.Text = "中断!"
    Else
      LblProgress1.Text = "Canceled!"
    End If

日本語の文字データもしっかり出てます…

出力されたコード
			if (MySettingsProperty.Settings.Japan)
			{
				this.LblProgress1.Text = "中断!";
				return;
			}
			this.LblProgress1.Text = "Canceled!";

調べた結果

デバッグ用の代入処理のコードが残っていました…
このコードを削除して、再度ビルドを行うと公開しているバージョンと同じサイズになりました!
ところが、バイナリのコンペアで4か所の差異が見つかりました…

VisualStudio付属のリンカで内容を調べてみます
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\binに移動して、link.exe /DUMP /headers e:\test.exeを実行します(最後のプログラム名は編集しています)

比較画像の1枚目と2枚目のA9EB4F62は日付が入っているので毎回異なるようです

diff01.png
diff03.png
link01.png

下記の比較画像のデータは.pdbファイルとの関連付けに使われているようです

diff04.png
link02.png

ただ、下記比較画像の値が何かは分かりませんでしたが、リビルドする度に値が変わるので、リリースには気にしなくても良いと考えました

diff02.png

さいごに

少々中途半端な内容になってしまいましたが、何の対策もしていない.NET Frameworkのプログラムの公開は、ソースコードも公開しているようなものだと思います(私の場合、だからといって難読化などの対策はしませんが…)
また、バージョン管理はなるべくしっかりやろうといういい教訓になりました

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0