آخرین اخبار
همهٔ اخبار
گزارش‌ها و تحلیل‌ها گزارش بحرانیت ۱/۱۰

بررسی مکانیسم نقاط توقف شرطی (Conditional Breakpoints) و پارسر عبارات در Binary Ninja

بررسی مکانیسم نقاط توقف شرطی (Conditional Breakpoints) و پارسر عبارات در Binary Ninja

در محیط دیباگر Binary Ninja، امکان تعریف نقاط توقف شرطی (Conditional Breakpoints) با استفاده از عباراتی مانند rax == 0x1234 وجود دارد. این قابلیت به لطف یک سیستم قدرتمند به نام Expression Parser یا «پارسر عبارات» پیاده‌سازی شده است که فراتر از یک ابزار ساده برای دیباگینگ است.

Expression Parser: از ناوبری تا تحلیل پویا

این پارسر در ابتدا برای تسهیل ناوبری (Navigation) در محیط Binary Ninja طراحی شده بود. برای مثال، با فشردن کلید G، کاربر می‌تواند با وارد کردن عباراتی نظیر main + 0x10 به ۱۶ بایت بعد از شروع تابع main منتقل شود یا با استفاده از [.data + 0x20] یک اشاره‌گر (Pointer) را دنبال (Dereference) کند.

قابلیت‌های کلیدی این پارسر عبارتند از:

  • عملیات ریاضی و بیتی: پشتیبانی از عملگرهای +, -, *, /, % و همچنین &, |, ^, ~.
  • مقایسه‌ها: استفاده از عملگرهای ==, !=, >, =, <=.
  • دسترسی به حافظه: امکان تعیین اندازه داده‌ها هنگام Dereference (مثلاً .b برای بایت، .w برای Word و .q برای Quadword).
  • مقادیر خاص: شناسایی متغیرهایی مانند $here، $start و $end برای تعیین مرزهای فایل.

یکپارچه‌سازی با دیباگر و مقادیر جادویی (Magic Values)

قدرت این سیستم در هنگام دیباگینگ با معرفی «مقادیر جادویی» افزایش می‌یابد. در یک جلسه دیباگ، تمامی رجیسترهای CPU (مانند rax, rsp, rip) و پایگاه‌های ماژول‌ها (مانند kernel32, ntdll) به صورت خودکار در پارسر ثبت می‌شوند. این امر به تحلیل‌گر اجازه می‌دهد تا بدون محاسبات دستی، مستقیماً به متغیرهای استک یا آدرس‌های ماژول‌ها در محیط ASLR دسترسی پیدا کند.

پیاده‌سازی بهینه نقاط توقف شرطی

قابلیت Conditional Breakpoints که در دسامبر ۲۰۲۵ اضافه شد، تنها با حدود ۵۰۰ خط کد پیاده‌سازی شده است. دلیل این بهینگی، بهره‌گیری کامل از Expression Parser موجود است. در واقع، دیباگر تنها رشته (String) شرط را به پارسر می‌فرستد و اگر نتیجه خروجی غیر صفر باشد، برنامه متوقف می‌شود.

مثال‌هایی از شروط کاربردی:

  • rax == 0x1234: توقف زمانی که rax مقدار خاصی داشته باشد.
  • rcx < 0n10: توقف زمانی که مقدار rcx کمتر از ۱۰ (در مبنای ۱۰) باشد.
  • [rsp] == 0: توقف زمانی که مقدار موجود در اشاره‌گر استک برابر صفر باشد.

استفاده از API برای اتوماسیون

کاربران می‌توانند از طریق کنسول پایتون Binary Ninja، شروط را به صورت پویا تنظیم کنند. برای مثال، با استفاده از متد dbg.set_breakpoint_condition(address, condition) می‌توان بدون نیاز به رابط گرافیکی، نقاط توقف شرطی را مدیریت کرد.