- PR -

EXEファイルの構造

投稿者投稿内容
ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-28 13:07
いつもお世話になっています。

EXEファイルの中身をバイナリレベルで調べています。
環境:Visual Studio2008 VB.Net
理由:
プロジェクトからビルドした複数のEXEファイルをバイナリ比較すると
まったく同じプロジェクトから作成したEXEでも、毎回バイナリ差分が現れます。
だいたい4箇所で差分が出現し、そのうち日付の部分に差分がでることは
特定できました。
しかし、残り2箇所(各16バイト程度)の差分が何であるのか特定できません。

今のところEXEの構造に関して以下まで解析できています。

MS-DOS用ヘッダ(構造体あり)
PEヘッダ(構造体あり)
セクションヘッダ(構造体あり)
セクション(可変)
.textセクション(ネイティブコード)
.sdataセクション(データセクション)
.rsrcセクション(リソース)
.reloc(再配置情報)
*.idata、.tls等のセクションは、VB.Netでビルドしたexeには見当たりません(内容によるのかな?)

知りたいこと:
差分は.text、sdata、.rsrcなどで出現し、これらの中身を解析する方法を探しています。

ヘッダ情報はポインタと構造体をしらべて解析できたのですが
セクション部分は混沌としていて解析ができません。

どなたかEXEファイルを解析した経験のある方がいらっしゃいましたら
ご教授をお願いします。

あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2009-01-28 13:13
単純に考えると
チェックサム的な何かじゃないかと
思います
ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-28 13:52
なるほど。チェックサムですか。
チェックサムについてはまだ詳しく調べていなかったので、そこからもう少し調査してみたいと思います。
ありがとうございます。





[ メッセージ編集済み 編集者: ブリンク 編集日時 2009-01-28 17:38 ]
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2009-01-28 18:52
こんばんは。

調査するには資料が必要でしょう。
探してみましたので、参考までに。

Microsoft Portable Executable and Common Object File Format Specification

(Binary Files) CLR - Common Language Runtime (CLR) extensions to Microsoft PE (Portable Executable) (Wotsit.org)

ちなみに.textセクションは、DUMPBINというツールで、逆アセンブリを出力することができます。
> DUMPBIN /DISASM hoge.exe

ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-29 11:09
>>Tdnr_Symさん

資料のご提供ありがとうございます。

教えて頂いた英語版資料に近い日本語版の資料はすでにあったのですが
お調べいただいて恐縮です。
以下が日本語の資料ですが書かれている内容はほぼ同じだと思います。
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html

その他参考資料
http://www.geocities.jp/winapi_database2/special/2001_10_11/page1.html
http://codezine.jp/article/detail/412
http://codezine.jp/article/detail/413

セクションに関する資料はあるにはあるのですが、
差分が出現する.text、.sdataの二つのセクションに関する明確な資料がないため、作業が難航していました。
最初は、単純に差分がでる位置の構造体とポインタがわかればと考えていたのですが、
ネイティブコード内に差分が出ているので、やはり逆アセンブルが必要になりそうです。

DUMPBINのご紹介ありがとうございます。
VB育ちなのでアセンブリを理解するのに時間がかかりそうですがトライしてみます。

的確なアドバイスありがとうございました。

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2009-01-29 11:46
こんにちは。

引用:

ブリンクさんの書き込み (2009-01-29 11:09) より:

差分が出現する.text、.sdataの二つのセクションに関する明確な資料がないため、作業が難航していました。



そりゃそんな資料なんてないでしょう。どちらもファイル仕様上はフリーフォーマットの部分ですから。

.textセクションは、いわゆる機械語
.dataセクションの類は、いわゆる静的領域

コンパイルするプログラムが違えば、(ネイティブのプログラムであれば)吐き出される機械語も違いますし、
静的領域をどう使用するかなんて、プログラムをリバースエンジニアリングしていかないと推測できないでしょう。
ブリンク
会議室デビュー日: 2009/01/21
投稿数: 16
投稿日時: 2009-01-29 12:21
>>Tdnr_Symさん

教えて頂いた英語版の資料には、セクションについての説明がより詳しく書かれていました。
貴重な情報を提供していただいて本当に感謝します。

>>コンパイルするプログラムが違えば、(ネイティブのプログラムであれば)吐き出される機械語も違いますし、
>>静的領域をどう使用するかなんて、プログラムをリバースエンジニアリングしていかないと推測できないでしょう。

やはりそうですよね。
気が重いですが、とりあえず逆アセンブリに挑戦して見たいと思います。
的確なアドバイスありがとうございます。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 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++のソースが読めるのでしたら、解析してみるのも面白いかもしれません。

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