
مساعد أبحاث الثغرات الأمنية الذي يحدد مواقع استدعاءات دوال API التي قد تكون غير آمنة في ملف ثنائي.
# rhabdomancer [](https://github.com/0xdea/rhabdomancer) [](https://crates.io/crates/rhabdomancer) [](https://crates.io/crates/rhabdomancer) [](https://hex-rays.com/ida-pro) [](https://twitter.com/0xdea) [](https://infosec.exchange/@raptor) [](https://github.com/0xdea/rhabdomancer/actions/workflows/build.yml) [](https://github.com/0xdea/rhabdomancer/actions/workflows/doc.yml) > "الطريق إلى الثغرات القابلة للاستغلال مفروش بالثغرات غير القابلة للاستغلال." > > -- Mark Dowd Rhabdomancer هي إضافة IDA سريعة للغاية تعمل بدون واجهة رسومية (headless) وتحدد مواقع استدعاءات دوال API التي قد تكون غير آمنة في ملف ثنائي. يمكن للمدققين تتبع الأثر عكسيًا من هذه النقاط المرشحة للعثور على المسارات التي تسمح بالوصول إلى مدخلات غير موثوقة.  ## الميزات - تجربة استخدام سريعة للغاية وبدون واجهة رسومية بفضل IDA 9.x وارتباطات Rust الخاصة بـ idalib-rs. - دعم الأهداف الثنائية المكتوبة بلغة C/C++ والمُجمَّعة لأي معمارية تدعمها IDA. - تُطبع مواقع استدعاءات دوال API السيئة إلى stdout وتُعلَّم في IDB. - مواقع الاستدعاء في كود المكتبات التي يتعرف عليها IDA (مثل وقت تشغيل مرتبط ساكنًا ومطابق لتوقيعات FLIRT) تُوسم بـ `(lib)`. - الاستدعاءات عبر الـ stubs (مثل مدخلات `.plt` في الملفات الثنائية ELF أو stubs الاستيراد في الملفات الثنائية PE وMach-O، والمدرجة كـ thunks) تُتبَّع عكسيًا إلى مستدعيها. - في الملفات الثنائية ELF، تُدرج الدالة عمدًا مرتين مع نفس مواقع الاستدعاء: مرة كـ stub الخاص بها في `.plt` (موسوم كـ thunk) ومرة كاستيراد لها. يُعلَّم كل موقع استدعاء مرة واحدة فقط في IDB. - تُجمَّع دوال API السيئة المعروفة في مستويات من السوء للمساعدة في ترتيب أولويات عمل التدقيق. - [BAD 0] أولوية عالية - الدوال التي تُعتبر عمومًا غير آمنة. - [BAD 1] أولوية متوسطة - دوال مثيرة للاهتمام ينبغي فحصها بحثًا عن حالات استخدام غير آمنة. - [BAD 2] أولوية منخفضة - ينبغي فحص مسارات الكود التي تتضمن هذه الدوال بعناية. - قائمة دوال API السيئة المعروفة مدمجة ويمكن تخصيصها بسهولة عبر ملف إعدادات مبني على `conf/rhabdomancer.toml`. - تُطابَق أسماء الدوال دون هذه الزخارف: النقاط والشرطات السفلية البادئة (مثل `_strcpy`)، وبادئات أسماء المكتبات المستعارة (مثل `__o_malloc` في Universal CRT، و`__libc_system` و`__GI___snprintf` في glibc)، و، بالنسبة للـ stubs وهذه الأسماء المستعارة فقط، اللاحقة الرقمية التي يضيفها IDA إلى الأسماء المستخدمة بالفعل (مثل `memset_0`). > [!NOTE] > الدوال المحصَّنة (مثل `__strcpy_chk`، المستخدمة بدلًا من `strcpy` عند البناء باستخدام `_FORTIFY_SOURCE`) لا > تُطابَق عمدًا، لأنها النسخ المفحوصة من الدوال المدرجة. لتحديد استدعاءاتها أيضًا، > أضفها صراحةً إلى إعدادات مخصصة (مثل `"__strcpy_chk"` بنفس أولوية `strcpy`). ## المقالات - <https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings> - <https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust> ## انظر أيضًا - <https://github.com/0xdea/ghidra-scripts/blob/main/Rhabdomancer.java> - <https://docs.hex-rays.com/release-notes/9_0#headless-processing-with-idalib> - <https://github.com/idalib-rs/idalib> - <https://books.google.it/books/about/The_Art_of_Software_Security_Assessment.html> ## التثبيت أسهل طريقة للحصول على أحدث إصدار هي عبر [crates.io](https://crates.io/crates/rhabdomancer): 1. نزّل IDA وثبّتها واضبط إعداداتها (انظر <https://hex-rays.com/ida-pro>). 2. ثبّت LLVM/Clang (انظر <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. على Linux/macOS، ثبّتها كما يلي: ```sh export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` على Windows، بدلاً من ذلك، استخدم الأوامر التالية: ```powershell $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` ## الترجمة البرمجية بدلاً من ذلك، يمكنك البناء من [المصدر](https://github.com/0xdea/rhabdomancer): 1. قم بتنزيل IDA وتثبيته وتكوينه (انظر <https://hex-rays.com/ida-pro>). 2. قم بتثبيت LLVM/Clang (انظر <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. على Linux/macOS، قم بالترجمة البرمجية على النحو التالي: ```sh git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo build --release --locked ``` على Windows، بدلاً من ذلك، استخدم الأوامر التالية: ```powershell git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo build --release --locked ``` ## الاستخدام 1. تأكد من أن IDA مُهيأ بشكل صحيح مع ترخيص صالح. 2. اختياريًا، خصّص قائمة دوال API السيئة المعروفة: انسخ [`conf/rhabdomancer.toml`](https://github.com/0xdea/rhabdomancer/blob/master/conf/rhabdomancer.toml) (اختر الوسم الذي يطابق نسختك المثبّتة للحصول على قائمته المدمجة الدقيقة)، وحرّر النسخة، واضبط متغير البيئة `RHABDOMANCER_CONFIG` على مساره. يجب أن يعرّف الملف المصفوفات `high` و`medium` و`low`، دون أي مفاتيح أخرى. وإلا، تُستخدم القائمة المدمجة، وهي مضمّنة في الملف الثنائي وقت البناء من `conf/rhabdomancer.toml` (تحرير ذلك الملف يتطلب إعادة البناء). 3. تأكد من ضبط متغير البيئة `IDADIR` إذا كان تثبيت IDA لديك في موقع غير قياسي. 4. شغّله كما يلي: ```sh rhabdomancer <binary_file> ``` سيتم تحديث أي ملف IDB `.i64` موجود؛ وإلا، سيتم إنشاء ملف IDB جديد. 5. افتح ملف IDB `.i64` الناتج باستخدام IDA. 6. اختر `View` > `Open subviews` > `Bookmarks` 7. استمتع بنتائجك مجموعةً بشكل ملائم في نافذة IDA. > [!NOTE] > يضيف Rhabdomancer أيضًا تعليقات عند مواقع الاستدعاء المحددة. يتم وسم كل من الإشارات المرجعية والتعليقات بـ > `[BAD n] <function_name>`، حيث `n` هو مستوى الأولوية (0 = عالٍ، 1 = متوسط، 2 = منخفض)، حتى تتمكن السكربتات من > البحث عنها في قواعد بيانات IDB. هذا التنسيق مستقر عبر الإصدارات. ## التوافق يُدعم رسميًا أحدث إصدار من IDA فقط، لكن الإصدارات الأقدم قد تعمل أيضًا. يلخص الجدول التالي أحدث إصدار متوافق مع كل إصدار من IDA: | إصدار IDA | أحدث إصدار متوافق | | ----------- | ------------------------- | | v9.0.240925 | v0.2.4 | | v9.0.241217 | v0.3.5 | | v9.1.250226 | v0.6.2 | | v9.2.250908 | v0.7.6 | | v9.3.260213 | v0.8.1 | | v9.3.260327 | v0.9.0 | | v9.3.260421 | v0.9.3 | | v9.4.260714 | الإصدار الحالي | | v9.4.260915 | الإصدار الحالي | > [!NOTE] > راجع وثائق [idalib-rs](https://github.com/idalib-rs/idalib) للحصول على معلومات إضافية. ## الشكر والتقدير حظي تطوير هذا المشروع بدعم المنظمات التالية: - [HN Security](https://hnsecurity.it) - [Hex-Rays](https://hex-rays.com) عبر [برنامج المساهمين](https://hex-rays.com/contributor-program) الخاص بها ## سجل التغييرات - [CHANGELOG.md](https://github.com/0xdea/rhabdomancer/blob/master/CHANGELOG.md) ## المهام المتبقية - إثراء قائمة دوال API الضارة المعروفة بشكل أكبر (انظر <https://github.com/0xdea/semgrep-rules>). - تتبع الاستدعاءات عبر thunks خارج مقاطع `.plt` (مثل thunks `j_` الخاصة بالربط التزايدي في MSVC). - النظر في تخطي وسم مواقع الاستدعاء في كود المكتبات الذي يتعرف عليه IDA (الموسوم حاليًا بـ `(lib)` فقط). - تنفيذ إخراج مُسلسَل لتسهيل التحليل والتحليل الآلي. - تنفيذ مجموعة قواعد أساسية على غرار [VulFi](https://github.com/Accenture/VulFi) و[VulnFanatic](https://github.com/Martyx00/VulnFanatic).