- PR -

EXEファイルの構造

投稿者投稿内容
ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-29 15:55
お世話になっております。

教えて頂いた「DUMPBIN」をつかって逆アセンブルし、アセンブルレベルで差分の特定ができました。
しかし、思っていた通り、アセンブリの違いを特定したところでそれが何なのか理解できず、
結局、当該箇所が.Netのどの部分に当たるのか解明できていませんでした。。

偶然ですが悪戦苦闘しているうちに.textセクションの差分のひとつが
マニフェストのMVIDであることがわかりました。
マニフェストファイルの中身ではMVIDは見ることができないのですが、
ildasm.exeを使ってEXEから逆アセンブルした際にマニフェストの中身を確認することができました。

----参考----
他に見つけた逆アセンブルツール
・eXeScope.exe
 -シェアウェア:ただし表示のみは無料でダウンロード可能
  大雑把なEXEの解析をしてくれる
・ildasm.exe
 -かなり自分の作業に近い便利なツール
・Reflector.exe(このツールはちょっと凄いと思いました)
・Visual Studioで作成されたexeの場合、信じられないレベルまでソースコードを復元します。
-----------

とりあえず.textの差分は他にもあるのですが、
次は「.sdataセクション」を解析するつもりです。
セクションの先頭32バイトと次の16バイトに差分があります。
そのうち先頭が日付というところまでは解っています。
(PEヘッダに同様の日付データの差分があったので)
しかし、続く16バイトが何であるのか特定できていません。

よく理解できていなくて申し訳ないのですが
この「静的領域」調べるにはどうしたらよいか、今のところまったくアイデアがありません。
とりあえず、いろいろなツールを使ってバイナリや回復したコードなどのの比較をとりまくってみようかと考えています。

雑然とした状況で申し訳ありません。
取り急ぎ、途中経過のご報告でした。



[ メッセージ編集済み 編集者: ブリンク 編集日時 2009-01-29 16:40 ]

[ メッセージ編集済み 編集者: ブリンク 編集日時 2009-01-29 17:11 ]
ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-29 17:10
追記です。

引用:

Tdnr_Symさんの書き込み (2009-01-29 13:43) より:

コンパイラ/リンカがどうやってEXEファイルを作成しているかを探るっていうのも
ひとつの手段かもしれませんね。

VB.netコンパイラがどうやってEXEファイル(PEファイル)を作成しているかを調べると、

どうやら、vbc.exe(VB.netコンパイラ) からMSCorPE.dllを使用してPEファイルを作成しているようです。(CreateICeeFileGen 関数など)

幸いMSCorPE.dllのソースコードは
SSCLI2.0と言う形で、ソース公開されています。(sscli20/clr/src/dlls/mscorpe配下 特にpewriter.cpp辺りか?)

C++のソースが読めるのでしたら、解析してみるのも面白いかもしれません。




せっかく頂いたアドバイスを端折ってすみません。
.sdataの解析には、やはりEXEを作成している箇所を調べるのが得策だと気づきました。

「プログラムからEXEファイルを生成してみよう」という記事があったので、
http://codezine.jp/article/detail/419?p=2
Tdnr_Symさんのアドバイスとあわせて調査してみます。


ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-29 19:06
お世話になっております。

最後の差分「.sdata」の違いがだいたいわかりました。
結論からいうと、デバッグ用の.pdbファイルの差分がexeの.sdataセクションにコピーされており
pdbファイルの差分がEXEの差分となって出現していました。
実際にpdbファイルの何に違いが出るのかは特定できませんでしたが、
変わりに差分がでないようにする回避策が解りました。

--回避策--
[プロジェクトのプロパティ]-[コンパイル]-[詳細コンパイルオプション]-[デバッグ情報を作成]=None
にセット
→pdbファイルが作成されないようになる
→exeにも差分が出なくなる
----------

まったく同じプロジェクトからexeをビルドした際に出現する
最低限のバイナリ差分の特定は一応完了しましたが、
実際には日付を変えてビルドしたり、プロパティを一箇所でも変えたりすると
たちまち差分が増えるので、まだ完全にEXEの解析ができたとはいえません。
しかし、とりあえず最低限のEXE差分の解析は終了することができました。

Tdnr_Symさんのアドバイスでなんとか作業にひと区切りつけることができました。
本当にありがとうございました。



[ メッセージ編集済み 編集者: ブリンク 編集日時 2009-01-29 21:47 ]
ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-30 19:49
お世話になります。

EXEファイルの内部構造に調査していましたが
最後に、これまでに参考になったサイトやツールをまとめておきます。
(EXEといっても、基本的に.Netで作成されるものを主体としています。)

■参考になった資料
Windows実行ファイルのバイナリ概要
http://codezine.jp/article/detail/403
EXEファイルの内部構造(PEヘッダ)
http://codezine.jp/article/detail/412?p=2
EXEファイルの内部構造(セクション)
http://codezine.jp/article/detail/413?p=1

取得可能な構造体の資料(英語版)
Microsoft Portable Executable and Common Object File Format Specification
(上記資料ほぼ対訳の日本語版)
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html

.textセクション(ネイティブコード部)の中身について(メタデータについて)
http://ascii.asciimw.jp/pb/msdn/article/a08_0011.html
基本的にメタデータの内部構造については公開されていないそうですが
メタデータの情報を読み書きするメソッドは存在するようです。

■便利だったツール
[逆アセンブラ]
○DUMPBIN(DOS)
コマンドプロンプトからdumpbinを実行する。dumpbinは以下に存在する。
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin
稼動に必要なdllがなくエラーが発生する場合があるが、C:\Program Files以下を検索すればに転がっているので
見つけ出してdumpbinと同じフォルダに入れれば動く

以下DUMPBINの使い方(オプション説明)
http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg26_10_02.htm

○Reflector.exe
http://www.red-gate.com/products/reflector/
画面右上の[Download your tree copy noW!]をクリックし次画面へ
名前とメールアドレスを入力するとダウンロード可能となる

○ildasm.exe(あれば便利)
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe
などにある

○Stirling.exe(バイナリエディタ)
自分は何も考えずこれを使いましたがもっとよいバイナリエディタもあると思います。
http://www.vector.co.jp/soft/win95/util/se079072.html

現在は、.textセクション(ネイティブコード)のMVID(モジュールバージョンID)を取得するために調査を続けています。
基本的にメタデータと呼ばれるネイティブコードの詳細は公開されていないようなので
.NET Common Language RuntimeのAPIをつかってメタデータの情報をさらってみようかと思います。

参考になるかどうかわかりませんが
バイナリデータレベルでは、MVIDは.textセクション内の
00 08 B7 7A 5C 56 19 34
の直前16バイトに存在するようです。

最後に、
Tdnr_Symさんのアドバイスのおかげでなんとか前進することができました。
本当にありがとうございました。

ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-02-04 15:02
追記です。

メタデータのMVIDが取得できたので追記しておきます。

Dim StrGUID as String = _
System.Reflection.Assembly.LoadFile(FileName).ManifestModule.ModuleVersionId.ToString

上記でハイフン付のMVIDを取得することができます。

スキルアップ/キャリアアップ(JOB@IT)