vb6で作成したexeのバイナリ比較

このQ&Aのポイント
  • vb6で過去に作成済のexeファイルは、現在手元にあるソースからコンパイルして作成されたものかどうかを調査する方法について調査中です。
  • 現在手元にあるソースをコンパイルして比較先のexeファイルを作成し、過去に作成済のexeファイルとのバイナリ比較を行いましたが、多くの差異が出ました。
  • バイナリ比較方法が間違っているのか、別の方法があるのかについて質問です。
回答を見る
  • ベストアンサー

vb6で作成したexeのバイナリ比較

こんにちは。 以下の点につきまして、調査が難航しておりますので、 有識者の方がいらっしゃいましたら、是非教えて頂きたく、宜しくお願い致します。 ★調査したい事 vb6で過去に作成済のexeファイルは、現在手元にあるソースからコンパイルして作成されたものかどうか、現在調査しています。 そこで、調査方法としまして、以下の方法で調査を実施しています。 ★調査方法 1.現在手元にあるソースをコンパイルして、比較先のexeファイルを作成する。 2.過去に作成済のexeファイルと、比較先のexeファイルのバイナリ比較を実施する。  ⇒2.1 スタートメニューからVisual Stadio 2008 コマンドプロンプトを起動する。   2.2 DUMPBIN /RAWDATA 過去に作成済の.EXE > first.txt   2.3 DUMPBIN /RAWDATA 比較先の.EXE > second.txt   2.4 FC /B first.txt second.txt   (参考にしたマイクロソフトサポート情報:http://support.microsoft.com/kb/164151/ja) この方法で比較したところ、非常に多くの差異が出ました。(12万行中、約6万行の差異) この差異は正しいのかどうか、試しにコンパイル日付のみが違うexeファイル同士を比較したのですが、 この時も同様に、非常に多くの差異が出ました。(12万行中、約6万行の差異) 以下、ご質問なのですが、 (1)私が実施しているバイナリ比較方法は間違っているのでしょうか? (2)上記の「★調査したい事」を達成する為、別の良い手段がありましたら、是非教えて下さい。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.4

> コンパイルした日付のみ違うEXEなので、タイムスタンプとチェックサムにだけ差異が現れて欲しかったのですが、RAWDATAにも違いが出ているので、 ちょっと差異の切り分けが難しいので駄目そうです。 私もやってみましたがそのようですね。 ただ、何回コンパイルし直したファイルを比較しても差異のでる位置は同じでした。 何故同じソースで差異が出るかは判りませんが差異は検出できるのではないかと思います。 ・VB6のプログラムを何回かコンパイルしてdiffを取り、差異の出る位置を確認する ・古いファイルと新しいファイルの差異を取り、その位置を調べる ・位置が同じだったら他は同一とみなす ・別な位置にも差異が出たらソースが違う可能性がある  (ただし、VB6のSPが同一である場合) 参考に、私がいろいろ調べた中で参考になりそうなWebサイトを上げておきます。 Windows実行ファイル「EXE」の謎に迫る http://codezine.jp/article/corner/61 Windows実行ファイルのバイナリ概要 http://codezine.jp/article/detail/403?p=2 EXEファイルの内部構造(PEヘッダ) http://codezine.jp/article/detail/412 EXEファイルの内部構造(セクション) http://codezine.jp/article/detail/413 プログラムからEXEファイルを生成してみよう http://codezine.jp/article/detail/419 http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html EXEファイルの構造 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=48037&forum=36

その他の回答 (3)

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.3

ANo.2の続きです。 exediff の最新バージョンは 1.12 で、下記からダウンロードできます。 http://code.google.com/p/exe-dll-diff/

guccyonn
質問者

お礼

回答ありがとうございます。 ツールを教えて頂き、ありがとうございます。 早速使用してみました。 コンパイルした日付のみ違うEXEを比較してみたところ、確かにタイムスタンプに違いが現れました。 が、RAWDATAにも違いが現れてしまいました。 コンパイルした日付のみ違うEXEなので、タイムスタンプとチェックサムにだけ差異が現れて欲しかったのですが、RAWDATAにも違いが出ているので、 ちょっと差異の切り分けが難しいので駄目そうです。

guccyonn
質問者

補足

回答を途中で送信してしまいましたので、補足で追記致します。 教えて頂いたツールはオープンソースでもあり、何をしているか把握できるので、よい勉強の機会になりそうです。 尚、本件の調査は、引き続き行っておりますので、 宜しくお願い致します。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.2

バイナリの比較は難しいようですね。 exediff - find differences between two exe/dll files というツールがあります。 http://hp.vector.co.jp/authors/VA002803/exediff.html 試しにVB6ではありませんが、ソースの変更なしに時間をずらしてコンパイルしたファイルを比較してみましたら、差が検出されました。 オプションの -n で数値を変えると良いかもしれません。 Windows 7 でも動きました。

回答No.1

この方法では1バイトでもずれると以降は全部差異としてカウントされる可能性が有ります。 VBだと特にちょっとした違いで差異が出るのでバイナリの比較では難しいかも知れません。 どうしてもなら目視で比較すれば差異なのかズレなのかは判りますが差異が何故あるかを理解することは困難でしょう。 逆アセンブリリストを比較する方が現実的でしょう。

guccyonn
質問者

お礼

ありがとうございます。 確かにちょっとした違いで差異が出てしまうので、解析は非常に困難です。 提示頂いた逆アセンブリリストで比較可能か、調査してみます。

guccyonn
質問者

補足

vb_decompiler_liteというソフトを使用して、逆コンパイルしてみました。 ですが、コンパイル日付のみ違うEXEを使用して、 逆コンパイルした結果のテキストコンペアした結果、差異が多分に出てしまい、 とても比較できるような結果は得られませんでした。 どうも無理っぽいですね^-^;

関連するQ&A

  • バイナリファイルの比較について困っております

    FDにあるファイルとHDにあるファイルをバイナリで開き 1バイトずつ比較を実施したいと考えております。 バイナリでファイルオープンまでは何とか出来たのですが、 ファイルを読み込み、1バイトずつ比較する方法が判りません。 どなたか御教授御願い致します。

  • バイナリファイルの比較

    バイナリファイルの比較をして差異があるかDOSコマンドで調べたいのですがどうすればよいでしょうか?ちなみにFCコマンドだとレングスチェックしかされないのでだめでした。

  • バイナリ

    VB6.0を使っています。 全てのファイル(Word、エクセル、Exe、Txtなどなんでも)はバイナリファイルとして扱えるのですか? バイナリファイルとして読み込んで、別名で保存して、 また、元の形式に戻すにはどのようにしたらよいのでしょうか? バイナリモードでOpenして 1バイトずつ、 バイナリモードで書き込めばいいのでしょうか? また、読む場合は、 バイナリモードで開いて、 1文字ずつ 何モードで書き込めばいいのでしょう? バイナリでいいのですか? ファイルの形式などよくわかっていません。。。。

  • VBでのファイル作成日の比較

    VB2010でファイルの置き換えについてご相談させてください。 ファイルが2つあります。 ・C:\MyFile.txt ・D:\YourFile.txt(このYourFile.txtは日々、ファイル作成日が更新されるものとします) この2つはファイル作成日が違います。 それを利用して、 MyFile.txtとYourFile.txtのファイル作成日を比較。 YourFile.txtのファイル作成日が新しければ、MyFile.txtと置換え。 といった事をしたいと思っています。そこで、FileInfo.CopyToメソッドを利用しました。 そうすると、YourFile.txtがMyFile.txtより新しい日付でも中身をコピーするだけで作成日はかわりませんでした。 次に、FileInfo.Replaceメソッドを利用しようと思いましたが、これはバックアップファイルを作成するみたいなので、それは不要のため利用するのはやめました。 後は、もしYourFile.txtのファイル作成日が新しければ、MyFile.txtを削除。 その後、CopyToメソッドを使用してファイルをコピーするといった方法が思いつきました。 他に何かスマートな方法はないでしょうか?

  • VBを起動せずにEXEファイルを作成する方法

    表題のとおりです。 VBで作成したソースファイル等をVBを起動せずに、EXEファイルを 作成する方法を探しています。 と、言うのも、複数(VB以外も含む)のプロジェクトファイルを一度に コンパイルし、配布できる環境を作成するようにしたいのです。 要は makeファイル 等で作成出来ればと考えています。 何か、VBでEXEファイルを作成できるコマンドライン(C2.EXE等???)が あれば、お教えいただけませんでしょうか? よろしくお願い致します。

  • VBで作成したExeのOS環境による動作について

    VisualBasic4.0で作成したExeファイルはWindowsXP環境では問題なく動作するのでしょうか? ちなみに、ExeはWindowsNT環境でコンパイルしています。

  • VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの

    VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいのですが、 例えば、"A"が一文字のみのShift-JIS もしくはunicodeのテキストファイルを作るため、 (下記の確認はShift-jis で行っています。) Dim ByteData As Byte ByteData = AscW("A") Open "C:\A.txt" For Binary Access Write As #1 Put #1, 1, ByteData Close #1 としました。 できあがったファイルをバイナリエディタで確認すると、  41 となっています。 (Unicode は 41 00 2バイト文字でリトルエンディアンのため) この41は、"A" の文字コード(Shift-JIS)「65」の16進表記です。 この「41」という値を使ってバイナリモードでテキストファイルを作成したいのですが、 どのようにすればよいでしょうか? 上記 Put #1, 1, ByteData の部分を、 1.Put #1, 1, 41 としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「29 00 20 20」でした。 文字コード00 に該当する文字がないためだと思います。 2.Put #1, 1, "41" としたところ、「41 」(バイナリモードで 「34 31 20 20」) (41の後ろは半角空白) で×でした。 3.Put #1, 1, CLng("&H" & 41) としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「41 00 00 00」でした。 4.ByteData = CLng("&H" & 41) Put #1, 1, ByteData これでやっとできました。 この他にも方法があるのか?と思い、質問させていただきました。 ご指導よろしくお願いいたします。

  • フォルダ指定できるCUI版の高速バイナリ比較ツール

    Bn_Cmp 2.50というバイナリ比較ツールを使っていますが、 このツールはGUI版ですが、このツールと同程度高速な、 フォルダ指定して複数ファイルを比較できる フリーのCUI版のバイナリ比較ツールを探しています。 コマンドプロンプトからバッチファイルで、 バイナリ比較ツールを実行して、 その結果もバッチファイルで使いたいのですが、 指定したフォルダの配下にある複数のファイルを 高速にバイナリ比較できるCUI版のツールはないでしょうか。 (OS:Windows7) 追記: Bn_Cmp 2.50には、 http://www.geocities.jp/hitoshi_pg/Bn_Cmp/index.html に(コンソール版は2重起動できません) と書かれていましたが、 Bn_Cmp 2.50にコンソール版があるのでしょうか? あれば、このコンソール版を試したいです。 Bn_Cmp 2.50には、Bn_Cmp.exeの実行ファイルのほかに、 Bn_Cmp_CMD.exeというファイルも同梱されていますが、 Bn_Cmp_CMD.exeの起動の仕方(引数などの情報)が ありませんので結局よく分かりませんでした。

  • ubuntuでの.exeファイル作成方法

    ubuntuでコンパイルした場合.outファイルしか作成出来ません windowsなどで実行出来る.exeファイルなどを作成したい場合どうしたら良いですか?

  • exe内に記述したパスワードについて

    exe内に記述したパスワードについて 1、スクリプト内にパスワードを記述してexeにコンパイルしています。このような記述方法だと簡単に盗まれてしまいますか? パスワードを記述したフェイク行を数千行作っています。 2、以下のようなexeの使い方で簡単にパスワードを読み取る方法はありますか? A パスワードが入ったexeファイル B パスワードを受け取るexeファイル AがBにパスワードを受け渡し処理をする。