2011-04-26 15 views
2

だから、再コンパイル時にexeに同じハッシュコード/チェックサムを持たせる方法を理解しようとしています。私はチェックサムを生成するためにFastSumを使用しています。現在のところ、コードは変更されていません。私はVSでプロジェクトを再構築しているだけです。チェックサムは異なります。コードはC++で書かれています。それぞれの再コンパイル後にexeチェックサムが異なる

私はこのようにハッシュコードやチェックサムを使用することに慣れていませんが、一貫したGUIDが必要なことについていくつかの調査を行い、何かを読んでいます。しかし、それがチェックサム生成プログラムにどのように結びついているのか分かりません。

さて、私はそれを前もってお礼します。

答えて

0

私が思い出したように、EXE形式にはビルドタイムスタンプが含まれているため、そのタイムスタンプを含むexeのハッシュは各再コンパイル時に変更されます。

+0

Hrm、OK、おそらくタイムスタンプを修正します。ありがとう! –

3

exesの違いを調べましたか?私は、コンパイラ/リンカがバイナリに日付または時刻を挿入していると思われます。その結果、各バイナリは別のバイナリになります。あるいは、コンパイラ/リンカが独自のシステムメモリに静的テーブルを作成し、それをバイナリにコピーすると、コンパイラがバイナリで12バイトを使用することを選択すると、何かの9バイトがあるとします。コンパイラ/リンカは、そのコンピュータのシステムメモリにある3バイトを取り出し、それをファイルにコピーします。理想的には、ツールがそのようなことに使用しているメモリをゼロにして再現可能な結果を​​得ることを望むでしょう。

基本的にファイル間のバイナリdiffを実行すると、なぜそれらが一致しないのかを調べる必要があります。

+0

また、コンパイラ/リンカが日付/時刻情報を挿入していなくても、コード内の '__DATE__ 'への参照は同じ効果を持ちます。 – Clifford

+0

男、コンパイラ/リンカの決定とは関係がないことを願っています!私たちが書いたコードでは、[code] __ DATE __ [/ code]への参照はありませんが、それは私が推測していないことを意味するわけではありません。私はバイナリ差分を行い、何が起こっているのか見ていきます、ありがとうございます。 –

+0

私はバイナリの違いをしましたが、異なる2つのセクションがあります。 1つは最初の段階ですが、ヘッダーの一部であると想定していますが、それが何であるかを正確に判断する方法はわかりません。 "このプログラムはDOSモードでは実行できません"という行があります。改行、 "$ 00000000000000"となり、次のチャンクは最初の違いです。ほとんどのテキストで構成されている第2の部分は、データの途中にあり、コンパイラがそのように感じるだけで何かを動かす必要があります。 –

0

これは管理されたバイナリですか?管理されたバイナリには、ビルドからビルドに変わるGUIDセクションがあり、それを止めることはあまりありません。

"link/dump/all [filename]"または "link/dump/disasm [filename]"を実行すると、バイナリの変更をより詳しく見ることができます。/disastmオプションはコードを逆アセンブルしてアセンブリに表示しますが、読みやすくなりますが、いくつかの単純な違いを無視する可能性がありますが、/ allオプションはすべての16進値とASCIIの同等値を表示しますハッシュが変更されました。

関連する問題