در محیط دیباگر 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) میتوان بدون نیاز به رابط گرافیکی، نقاط توقف شرطی را مدیریت کرد.