نقطة توقف مشروطة تختبر متغيرات المكدس المتعددة

StackOverflow https://stackoverflow.com/questions/6097157

سؤال

أقوم بتصحيح أخطاء أحد التطبيقات عند نقطة يستخدم فيها مربع حوار للحصول على بعض المعلومات من المستخدم، ثم يقوم ببعض المعالجة لتلك المعلومات.عن طريق تعيين نقطة توقف على USER32!CreateDialogParamW لقد وجدت عنوان إجراء الحوار الخاص به.

في البداية أردت فقط التوقف عندما يتلقى الإجراء رسالة WM_COMMAND، لذلك استخدمت الأمر التالي:bp 00cfa1c0 "j (dwo(esp+8) == 0x111) '';"جي سي""

وهذا لسوء الحظ ليس كافيًا لأن إجراء الحوار لسبب ما يتلقى رسائل WM_COMMAND حتى عند الضغط على ALT-TAB بين WinDbg والتطبيق.لذا، أريد الآن أن يتم قطعه عندما يتلقى WM_COMMAND برمز إشعار BN_CLICKED من الزر "موافق" في مربع الحوار.معرف التحكم الخاص بالزر الموجود في قالب الحوار هو 1، ويتم تعريف BN_CLICKED على أنه 0 في winuser.h.وهذا يعني أن وسيطة WPARAM الخاصة بإجراء الحوار يجب أن تكون 1 عند النقر فوق الزر "موافق".

لقد حاولت الأمر التالي:bp 00cfa1c0 "j (dwo(esp+8) == 0x111 && dwo(esp+12) == 0x1) '';"جي سي"".تم قبول هذا في البداية، ولكن عندما يتم تقييم نقطة التوقف فإنه يشتكي:تعبير رقمي مفقود من '& dwo(esp+12) == 0x1) '';"جي سي"

إن إحاطة التعبيرين بـ () لم يساعد.لقد ألقيت نظرة على ملف المساعدة، ولكن بصراحة هذا الأمر يربكني أكثر.أنا جديد جدًا في استخدام WinDbg واللغة الإنجليزية ليست لغتي الأم.هل يستطيع احد توجيهي الي الوجهة الصحيحة؟

شكرا لك مقدما.

ملاحظة:هذا تطبيق 32 بت ولا أملك الكود المصدري له.

هل كانت مفيدة؟

المحلول

استخدم واحدة & - بناء الجملة الافتراضي للتعبيرات هو MASM. && هو جزء من بناء جملة C++.

التعبيرات التالية سوف تناسبك:

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

أو

@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top