
إضافة لـ IDA Pro لتصفية الدوال بناءً على أنماط التجميع، تسلسلات البايت، مراجع السلاسل/الأسماء، وقيود الحجم، مع بحث قائم على القواعد ونسخ ثنائي متقدم.
FindFunc هي إضافة لـ IDA Pro تتيح العثور على دوال الكود التي تحتوي على نمط معين من لغة التجميع أو البايت، أو تشير إلى اسم أو سلسلة نصية معينة، أو تلتزم بقيود متنوعة أخرى.
حصلت FindFunc على المركز الثالث في مسابقة 2022 HexRays IDA Pro Plugin Contest!

الوظيفة الرئيسية لـ FindFunc هي السماح للمستخدم بتحديد مجموعة من "القواعد" أو القيود التي يجب أن تستوفيها دالة الكود في IDA Pro. ثم ستقوم FF بالعثور على جميع الدوال التي تستوفي جميع القواعد (حاليًا جميع القواعد في حالة "و" منطقية). استثناء: يمكن "عكس" القواعد لتكون مطابقات سلبية. وبالتالي تلتزم هذه القواعد بـ "و ليس".
ستقوم FF بجدولة القواعد بترتيب ذكي لتقليل وقت المعالجة. نظرة عامة على الميزات:
زر "Find Functions" يمسح النتائج الحالية ويبدأ بحثًا جديدًا، "Refine Results" يأخذ في الاعتبار نتائج البحث السابقة فقط.
ميزة ثانوية لـ FF هي خيار نسخ التمثيل الثنائي للتعليمات بالخيارات التالية:
انظر قسم "النسخ المتقدم" أدناه للتفاصيل. هذه الميزة تكمل قاعدة نمط البايت بشكل رائع!
FindFunc هي إضافة Python لـ IDA Pro بدون تبعيات حزم خارجية. يمكن تثبيتها عن طريق تنزيل المستودع ونسخ ملف 'findfuncmain.py' ومجلد 'findfunc' إلى دليل الإضافات الخاص بـ IDA Pro. بالنسبة لـ IDA 9.0+ يمكن أيضًا استنساخ المستودع مباشرة في دليل الإضافات. على أي حال، لا يلزم البناء.
المتطلبات: IDA Pro 8.x (8.3+) مع بيئة python3. FindFunc مصممة لمعمارية x86/x64 فقط. تم اختبارها مع IDA 8.3 - 9.2، python 3.11 على Windows 10 + 11
حاليًا ست قواعد متاحة. تم ترتيبها هنا من الأثقل إلى الأخف من حيث تأثير الأداء. مع قواعد البيانات الكبيرة، من الجيد أولاً تقليل عدد الدوال المرشحة باستخدام قاعدة رخيصة، قبل القيام بمطابقة ثقيلة عبر قواعد الكود مثلاً. ستقوم FF بجدولة القواعد تلقائيًا بطريقة ذكية.
قاعدة لتصفية الدوال بناءً على احتوائها على مقتطف كود تجميع معين. هذا ليس بحثًا نصيًا عن التمثيل النصي لـ IDA، بل يقوم بمطابقة متقدمة للتعليمات الأساسية. يمكن أن يحتوي المقتطف على عدة تعليمات متتالية، كل تعليمات في سطر. مدعومة قطع الدوال. يدعم مطابقة أحرف البدل الخاصة، بالإضافة إلى لغة التجميع الحرفية:
أمثلة أخرى:
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any
ملاحظات هامة: كن حذرًا عند نسخ لغة التجميع من IDA. يخلط IDA أسماء المتغيرات المحلية ومعلومات أخرى في التعليمات مما يؤدي إلى فشل المطابقة. أيضًا، التسميات (labels) غير مدعومة ("call sub_123456").
لاحظ أن أنماط الكود هي أغلى قاعدة، وإذا كانت قواعد الكود فقط موجودة، فلن يكون أمام FF خيار سوى تفكيك قاعدة البيانات بأكملها. قد يستغرق هذا عدة دقائق للملفات الثنائية الكبيرة جدًا. انظر ملاحظات حول الأداء أدناه.
يجب أن تحتوي الدالة على القيمة الفورية المحددة مرة واحدة على الأقل في أي موضع. القيمة الفورية هي قيمة ثابتة في التمثيل الثنائي للتعليمة. أمثلة على التعليمات المطابقة للقيمة الفورية 0x100:
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100
يمكن لصق القيم الفورية مباشرة من الحافظة في قائمة القواعد. ملاحظة: يقوم IDA بمطابقة شاملة لأي حجم وأي موضع للقيمة الفورية. إذا كنت تعلم أنها ذات عرض محدد 4 أو 8 بايت، يمكن أن يكون نمط البايت أسرع (لكنه قد يعطي نتائج إيجابية خاطئة).
يجب أن تحتوي الدالة على نمط البايت المحدد مرة واحدة على الأقل. النمط بنفس تنسيق البحث الثنائي لـ IDA، وبالتالي يدعم أحرف البدل - التطابق المثالي لميزة النسخ المتقدم!
أمثلة:
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? يمكن أن يكون أي بايت
يمكن لصق أنماط البايت مباشرة من الحافظة في قائمة القواعد. ملاحظة: مطابقة الأنماط سريعة جدًا وهي مرشح جيد لتقليل المطابقات بسرعة!
يجب أن تشير الدالة إلى السلسلة النصية المحددة مرة واحدة على الأقل. تتم المطابقة وفقًا لوحدة 'fnmatch' في بايثون، وبالتالي تدعم المطابقة المشابهة لأحرف البدل. تتم المطابقة مع تجاهل حالة الأحرف. يتم النظر في السلاسل النصية بالتنسيقات التالية: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (يمكن تغيير ذلك في فئة Config).
أمثلة:
ملاحظة: مطابقة السلاسل النصية سريعة وهي خيار جيد لتقليل المرشحين بسرعة!
يجب أن تشير الدالة إلى الاسم/التسمية المحددة مرة واحدة على الأقل. تتم المطابقة وفقًا لوحدة 'fnmatch' في بايثون، وبالتالي تدعم المطابقة المشابهة لأحرف البدل. تتم المطابقة مع تجاهل حالة الأحرف.
أمثلة:
ملاحظة: مطابقة الأسماء سريعة جدًا وهي مثالية لتقليل المرشحين بسرعة!
يجب أن يكون حجم الدالة ضمن الحد المحدد: "min <= حجم الدالة <= max". يتم إدخال البيانات كسلسلة نصية بالشكل "min,max". يتضمن حجم الدالة جميع أجزائها (chunks).
ملاحظة: مطابقة حجم الدالة سريعة جدًا وهي مثالية لتقليل المرشحين بسرعة!
لسهولة الاستخدام، يمكن استخدام FF عبر اختصارات لوحة المفاتيح التالية:
استخدامات إضافية لواجهة المستخدم
كثيرًا ما نرغب في البحث عن أنماط ثنائية من لغة التجميع، ولكن بدون عناوين وقيم ثابتة (قيم فورية)، أو حتى فقط الرموز التشغيلية الفعلية للتعليمة. يجعل FindFunc هذا سهلاً عن طريق إضافة ثلاثة خيارات نسخ إلى القائمة المنبثقة لفك التجميع:
ينسخ جميع بايتات التعليمات كسلسلة سداسية عشرية إلى الحافظة، لاستخدامها في قاعدة نمط بايت (أو البحث الثنائي لـ IDA).
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
سيتم نسخها كـ
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70
ينسخ بايتات التعليمات للتعليمة المحددة، مع إخفاء أي قيم فورية. مثال:
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
سيتم نسخها كـ
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??
ينسخ جميع بايتات التعليمات كسلسلة سداسية عشرية إلى الحافظة، مع إخفاء أي بايتات ليست الرمز التشغيلي الفعلي (بما في ذلك sib, modrm، ولكن الاحتفاظ بالبادئات القديمة).
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
سيتم نسخها كـ
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??
مزيج يحتفظ بالرمز التشغيلي والقيم الفورية، ولكنه يخفي مثلاً mod r/m. لاحظ أن هذا يحتفظ بالرموز التشغيلية حتى لو كانت تلزم سجلاً معينًا، مثلاً
B8 44332211 mov eax,11223344
سيحتفظ بالرمز التشغيلي B8.
ملاحظة: هذا "أفضل جهد" باستخدام API الخاص بـ IDA، وبالتالي قد تكون هناك حالات قليلة يعمل فيها جزئيًا فقط. للحصول على حل صحيح 100%، سنحتاج إلى شحنة مكتبة تفكيك x86 مخصصة.
يمكن تحقيق نتائج مماثلة مع قواعد نمط الكود، ولكن هذا قد يكون أسرع، سواء لتفاعل المستخدم أو البحث الفعلي.
ينسخ فك التجميع المحدد إلى الحافظة، كما يظهر في IDA.
كلمة مختصرة عن الأداء: