3

ダイアログボックスを使用してユーザーから情報を取得し、その情報に対して何らかの処理を実行する時点で、アプリケーションをデバッグしています。USER32!Cre​​ateDialogParamWにブレークポイントを設定することにより、ダイアログプロシージャのアドレスを見つけました。

最初は、プロシージャがWM_COMMANDメッセージを受信したときに中断したかったので、次のコマンドを使用しました。bp 00cfa1c0 "j(dwo(esp + 8)== 0x111)'';'gc'"

WinDbgとアプリケーションの間でALT-TABを実行している場合でも、何らかの理由でダイアログプロシージャがWM_COMMANDメッセージを受信するため、これは残念ながら十分ではありません。そこで、ダイアログの[OK]ボタンから通知コードBN_CLICKEDのWM_COMMANDを受信したときに、それを壊したいと思います。ダイアログテンプレートのボタンのコントロールIDは1であり、BN_CLICKEDはwinuser.hで0として定義されています。これは、[OK]ボタンをクリックするときに、ダイアログプロシージャのWPARAM引数が1であることを意味します。

次のコマンドを試しました:bp 00cfa1c0 "j(dwo(esp + 8)== 0x111 && dwo(esp + 12)== 0x1)'';'gc'"。これは最初は受け入れられますが、ブレークポイントが評価されると、次のように文句を言います。'&dwo(esp + 12)== 0x1)'';から数式が欠落しています。'gc''

2つの式を()で囲むことは役に立ちませんでした。ヘルプファイルを見ましたが、正直言ってさらに混乱します。私はWinDbgにかなり慣れておらず、英語は私の母国語ではありません。誰かが私を正しい方向に向けることができますか?

前もって感謝します。

PS:これは私がソースコードを持っていない32ビットアプリケーションです。

4

1 に答える 1

4

単一を使用し&ます-式のデフォルトの構文はMASMです。 &&C++構文の一部です。

次の式が有効です。

(dwo(@esp+8) == 0x111 & dwo(@esp+12) == 0x1)

また

@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
于 2011-05-23T16:15:29.967 に答える