مكون إضافي BinaryNinja لرسم بياني لشجرة تعليمات BNIL ومطابقات تعليمات python للبرنامج التعريفي.
يتم دعم التثبيت بطريقتين، الأولى باستخدام مدير المكونات الإضافية الجديد والثانية هي التثبيت اليدوي.
استخدم مدير المكونات الإضافية الجديد عن طريق تحديد "إدارة المكونات الإضافية" من قائمة "تحرير". ابحث في قائمة المكونات الإضافية عن "BNIL Instruction Graph"، وانقر عليها بزر الماوس الأيمن وانقر على "تثبيت"، ثم انقر بزر الماوس الأيمن مرة أخرى وحدد "تمكين".
$ git clone https://github.com/withzombies/bnil-graph.git
$ cd ~/Library/Application Support/Binary Ninja/plugins
$ ln -s ~/git/bnil-graph .
لاستخدام bnil-graph، انقر بزر الماوس الأيمن على التعليمات وحدد "BNIL Instruction Graph". يقوم هذا برسم تعليمات BNIL المرتبطة بهذا العنوان ويعرضها كنموذج HTML.
يضيف Binary Ninja أدوات الوصول للمعامل ديناميكيًا، ونتيجة لذلك، لا تظهر الملحقات الملائمة في استدعاءات dir()
أو في وثائق واجهة برمجة التطبيقات. يُظهر الرسم البياني bnil بنية تعليمات IL بما في ذلك أسماء الموصلات الرائعة الخاصة بها (مثل insn.src
للسجل المصدر أو الذاكرة)
مثال الرسم البياني:
بالإضافة إلى البرنامج الإضافي للرسم البياني، سيقوم bnil-graph أيضًا بإنشاء وظيفة مطابقة تتطابق تمامًا مع التعليمات المحددة. ستسمح هذه الميزة لمطوري المكونات الإضافية الجدد بمطابقة التعليمات بسرعة. الاستخدام المقصود هو العثور على تعليمات مشابهة لتلك التي تريد مطابقتها، وإنشاء وظيفة مطابقة، ثم تعديل الوظيفة التي تم إنشاؤها لدعم احتياجاتك بشكل أفضل.
من الأمثلة على ذلك محاولة العثور على جميع تعليمات MediumLevelILSSA MLIL_CALL_SSA التي تأخذ 3 معلمات. لقد قمت بإنشاء مُطابق مقابل دالة غير ذات صلة مع 0 معلمات:
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . output . dest_memory != 0x1 :
return False
if len ( insn . output . dest ) != 0 :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if insn . dest . constant != 0x14000d49c :
return False
if len ( insn . params ) != 0 :
return False
if insn . src_memory != 0x0 :
return False
return True
يمكننا تعديل هذا لإزالة بعض القيود المحددة:
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 0 :
return False
return True
لقد قمنا بإزالة وجهة المكالمة وقيود إصدار الذاكرة. بعد ذلك، قم بتحديث فحص المعلمات للتحقق من 3 معلمات:
def match_3_param_MLIL_CALL_SSA ( insn ):
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 3 :
return False
return True
الآن، لدينا أداة مطابقة يمكنها تحديد تعليمات MLIL_CALL_SSA بثلاثة معلمات! كرر الآن تعليمات MLIL SSA واتصل بالمطابق وقد انتهينا:
if __name__ == '__main__' :
bv = binaryninja . BinaryViewType . get_view_of_file ( sys . argv [ 1 ])
bv . update_analysis_and_wait ()
for func in bv . functions :
mlil = func . medium_level_il
for block in mlil . ssa_form :
for insn in block :
if match_3_param_MLIL_CALL_SSA ( insn ):
print "Match: {}" . format ( insn )
مثال المطابقة:
حقوق الطبع والنشر لهذا المشروع هي Ryan Stortz (@withzombies) وهو متاح بموجب ترخيص Apache 2.0.