5

私が作成 (および販売) するソフトウェアは、配布する前に圧縮および暗号化されます。新しいビルドをリリースするたびに、すべての .map ファイルと生成されたバイナリ (exe を含む) を圧縮および暗号化する前に保持します。

クライアントのマシンでクラッシュすると、ミニダンプが返されます。これらのミニダンプを Visual Studio で開き、そこで調べます。

.map ファイルでアドレスを検索して、これらのミニダンプをうまく利用しました。これにより、通常、コードの正しい領域に到達し、クラッシュが発生した理由を推測して修正できますが、これには非常に時間がかかります。

ミニダンプのデバッグで元のビルドから保存したシンボルを使用できると助かります。

私の問題は、正しいシンボルが見つからないという警告が表示されることです。私の調査によると、これは、クライアントのマシン上の exe のチェックサムが、Visual Studio が構築した exe のチェックサムと一致しないためであると考えています。そして、私はその理由を理解しています。それは圧縮され、暗号化されています。もちろん、チェックサムは一致しません。

ミニダンプを手動で編集するか、保存されたバイナリのチェックサムを変更して、配布可能なファイルのチェックサムと一致させることができると思います。入ってくるすべてのダンプを変更する必要がないように、保存されたコピーを操作したいと思いますが、どちらでも構いません。

だから、私の質問は次のとおりです。これらのチェックサムを見つけて、それらを何に置き換える必要があるかを判断するにはどうすればよいですか? 補助的な質問として: より良い方法はありますか?

4

2 に答える 2

5

バイナリをどの程度正確に圧縮および暗号化しているかを知らなければ、具体的に説明することは困難です。

John Robbins によるこのブログ投稿では、実行可能ファイルの PE ヘッダーに埋め込まれた GUID を介して、実行可能イメージが PDB に関連付けられていることが指摘されています。実行可能ファイルで DUMPBIN /HEADERS を実行し、デバッグ ディレクトリの出力を探すことで表示できるはずです。圧縮と暗号化によって PE ヘッダーが変更され、この情報が利用できない (または正しくない) 場合は、デバッガーが何も見つけられない理由を説明できます。

この問題を解決するために、いくつかのアプローチを取ることができると思います。これを実際に機能させるには、Visual Studio デバッガーの代わりに WinDbg を使用することを検討してください。なぜ私がこれを勧めているのかすぐに理解できるでしょう...

WinDbg には、シンボル ファイルの読み込みを緩和するオプションがいくつか用意されています。このオプションの考え方は、ソース コードは変更されていないが、バイナリが PDB とは異なるビルドからのものである場合、GUID チェックを放棄して、一致しないシンボル ファイルを読み込むことができるということです。これがあなたの圧縮と暗号化でどれだけうまくいくか分からないので、YMMV.

WinDbg とそれに付随するツールを使用して、実行可能ファイルと PDB の両方から GUID をダンプできますが、これらの手順が不要になることを期待しているため、ここでは省略します。

WinDbg でミニダンプを開いた後、コマンド ラインにいくつかのコマンドを入力して、これをすべて機能させる必要があります。

.symopt +0x40
!sym noisy
ld <exe name>

最初のコマンドSYMOPT_LOAD_ANYTHINGは、GUID チェックをスキップするオプションを有効にします。この!symコマンドは、シンボル読み込みの詳細出力を有効にして、より詳細なエラー メッセージを表示できるようにします。このldコマンドは、. の代わりに入力する実行可能ファイル名のシンボルをロードしようとするように WinDbg に指示します<exe name>。コマンドを繰り返すとld、WinDbg は初めてシンボルを正常にロードしたかどうかを示します。

これがお役に立てば幸いです -- 繰り返しますが、これが圧縮と暗号化でどの程度うまく機能するかはわかりませんが、試してみる価値はあります。

于 2009-12-09T20:34:36.773 に答える
0

この圧縮/暗号化はUPXのようなものですか?バイナリの実際の実行可能コンテンツが (UPX などのツールで行われるように) 変更されている場合、(アセンブリ言語で複雑なアプリケーションのデバッグを楽しんでいない限り) 運が悪くなります。あなたのソフトウェアは本当に重要/特別なので、配信前にバイナリを暗号化する必要がありますか? 私の経験では、クラッシュ ダンプをデバッグする機能は、コードのリバース エンジニアリングを阻止することよりもはるかに重要です。

于 2009-12-10T00:54:31.467 に答える