はじめに
簡単なC#ソースから2通りの方法で.exeを作成します.
そしてバイナリを比較します.
.exe作成
ソース
Cock.cs
class Cock
{
static void Main()
{
}
}
/target:exeを指定
/c/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe /target:exe Cock.cs
/target:winexeを指定
/c/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe /target:winexe Cock.cs
比較
exeファイルを比較します.
3つ違う箇所があります.
- アドレス88h
- アドレスDCh
- アドレス440h~44Fh
1.はPEヘッダのCOFFヘッダのタイムスタンプです.
.exeを作成した時刻が異なります.
2.はPEヘッダのオプションヘッダのサブシステムです.
/target:exeの場合は3,/target:winexeの場合は2になります.
XBOXもあるらしい
3.はモジュールバージョンIDであり,GUIDです.
この値は.exe作成のたびに変わります./taget:は関係ありません.
今回はぐうぜんにも16バイト全て違う値になった.うれしかった.
Assembly.ManifestModule.ModuleVersionId
おわりに
サブシステムの値が異なります.