なぜ使おうと思ったか
私は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
は日付が入っているので毎回異なるようです
↓
下記の比較画像のデータは.pdb
ファイルとの関連付けに使われているようです
↓
ただ、下記比較画像の値が何かは分かりませんでしたが、リビルドする度に値が変わるので、リリースには気にしなくても良いと考えました
さいごに
少々中途半端な内容になってしまいましたが、何の対策もしていない.NET Framework
のプログラムの公開は、ソースコードも公開しているようなものだと思います(私の場合、だからといって難読化などの対策はしませんが…)
また、バージョン管理はなるべくしっかりやろうといういい教訓になりました