- - PR -
EXEファイルの構造
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-29 17:10
追記です。
せっかく頂いたアドバイスを端折ってすみません。 .sdataの解析には、やはりEXEを作成している箇所を調べるのが得策だと気づきました。 「プログラムからEXEファイルを生成してみよう」という記事があったので、 http://codezine.jp/article/detail/419?p=2 Tdnr_Symさんのアドバイスとあわせて調査してみます。 | ||||
|
投稿日時: 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-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-02-04 15:02
追記です。
メタデータのMVIDが取得できたので追記しておきます。 Dim StrGUID as String = _ System.Reflection.Assembly.LoadFile(FileName).ManifestModule.ModuleVersionId.ToString 上記でハイフン付のMVIDを取得することができます。 |