منصة التحليل الثنائي لجامعة Carnegie Mellon (CMU BAP) هي مجموعة من المرافق والمكتبات التي تتيح تحليل البرامج الثنائية. يدعم BAP X86 و X86-64 و ARM و MIPS و PowerPC والبنيات الجديدة باستخدام الإضافات. يتضمن BAP مختلف التحليلات والمترجم القياسي ومترجم الفترات الدقيقة والمنفذ الرمزي. تتميز BAP بلغتها الخاصة بالمجال ، Primus Lisp ، والتي يتم استخدامها لتنفيذ التحليلات ، وتحديد شروط التحقق ، ووظائف النمذجة (كتابة كعب) ، وحتى التواصل مع SMT Solver. يتضمن مستودع مجموعة الأدوات أمثلة مختلفة من أدوات تحليل البرنامج التي يمكن تنفيذها باستخدام BAP ويمكن استخدامها كنقطة انطلاق (بالإضافة إلى البرنامج التعليمي) لتنفيذ التحليلات المخصصة. يمكن استخدام BAP كإطار مع أداة BAP واحدة يتم تمديدها مع الإضافات أو يمكن استخدامها كمكتبة مضمنة في تطبيق المستخدم ، والتي يمكن كتابتها في OCAML أو ، في أي لغة أخرى ، باستخدام الرتب C. نحن نقدم أيضًا بعض الدعم الدنيا لـ Python لتسهيل بدء تعلم BAP.
تم تطوير BAP في CMU ، CYLAB ، برعاية منح من وزارة الدفاع بالولايات المتحدة ، Siemens ، Boeing ، Forallsecure ، وحكومة كوريا ، انظر الرعاة لمزيد من المعلومات. يتم استخدام BAP في مختلف المؤسسات ويعمل كعمود خارجي للعديد من المشاريع المثيرة للاهتمام ، ويتم تسليط الضوء على بعضها أدناه:
نحن نقدم حزم ثنائية معبأة لمشتقات Debian و Red Hat. لتوزيعات أخرى ، نقدم محفوظات TGZ. لتثبيت BAP على مشتق Debian:
wget https://github.com/BinaryAnalysisPlatform/bap/releases/download/v2.5.0/{bap,libbap,libbap-dev}_2.5.0.deb
sudo dpkg -i {bap,libbap,libbap-dev}_2.5.0.debلا تشمل حزمنا الثنائية بيئة تطوير OCAML. إذا كنت ستكتب تحليلًا في OCAML ، فيجب عليك تثبيت BAP من الكود المصدري باستخدام OPAM أو عن طريق الاستنساخ وبناء هذا المستودع مباشرة. طريقة OPAM هي واحدة موصى بها. بمجرد تثبيته ، يجب تثبيت الأوامر الثلاثة التالية على النظام الأساسي في مفتاح تم إنشاؤه حديثًا.
opam init --comp=4.14.1 # inits opam and install the OCaml compiler
opam install bap # installs bap and its dependencies
eval $( opam env ) ` # activates opam environmentأو ، إذا كان لديك بالفعل مفتاح ترغب في تثبيت BAP ، فما عليك سوى القيام بذلك
opam install bap
سيحاول أمر opam install bap أيضًا تثبيت تبعيات النظام لـ BAP باستخدام مدير حزمة نظام التشغيل الخاص بك. إذا فشلت بسبب تبعية النظام المفقودة ، فحاول تثبيته يدويًا ثم كرر الأمر opam install bap . إذا كان لا يزال لا يعمل ، فلا تتردد في إسقاط الدردشة وطلب المساعدة هناك. إنه أمر مع أشخاص ودودون سيكونون سعداء بالمساعدة.
سوف تحصل التعليمات أعلاه على أحدث إصدار مستقر من BAP. إذا كنت مهتمًا بإصداراتنا المتداول ، والتي يتم تحديثها تلقائيًا في كل مرة يحدث فيها الالتزام بالفرع الرئيسي ، يمكنك إنشاء مفتاح جديد يستخدم مستودع الاختبار الخاص بنا
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap بعد إضافته ، سيحدث مستودع bap الأسبقية على المستودع المستقر وستحصل على حزم BAP التي تم اختيارها حديثًا مباشرة من المزرعة.
إذا كنت ترغب في بناء BAP يدويًا أو ترغب فقط في التعامل مع BAP Internals ، فيمكنك استنساخ هذا المستودع وبناءه يدويًا. نقترح أن تبدأ ببيئة جديدة دون تثبيت BAP ، لمنع الاشتباكات ، أو حتى أفضل لاستخدام مفتاح محلي ، على سبيل المثال ،
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installسيقوم المقتطف أعلاه باستنساخ BAP ، وإنشاء مفتاح محلي جديد ، وتثبيت التبعيات اللازمة ، بما في ذلك النظام الأول ، وأخيراً ، بناء وتثبيت BAP مع الكثبان الرملية. بدلاً من ذلك ، إذا كان لديك بالفعل مفتاح تريد إنشاء BAP وتثبيته ، فيمكنك استخدامه
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
لتثبيت BAP وتبعياتها في المفتاح المحدد حاليًا.
BAP ، مثل Docker أو GIT ، مدفوعة بأداة سطر أوامر واحد تسمى BAP. ما عليك سوى اكتب bap في قذيتك وسيقوم بطباعة رسالة تعرض إمكانيات BAP. سيأخذ الأمر disassemble برنامجًا ثنائيًا ، ويفككه ، ورفعه إلى التمثيل اللاحق للعمارة الوسيطة ، وإنشاء رسم بياني لتدفق التحكم ، وأخيراً تطبيق تحليل محدد من قبل المستخدم في شكل من أشكال تمريرات التفكيك. أخيرًا ، سيؤدي خيار --dump ( -d باختصار) إلى إخراج البرنامج الناتج بالتنسيق المحدد. هذا هو الأمر الافتراضي ، لذلك لا تحتاج حتى إلى تحديده ، على سبيل المثال ، سيتم تفكيك ما يلي وتفريغه /bin/echo binary على جهازك:
bap /bin/echo -d لاحظ ، على عكس objdump ، سيؤدي هذا الأمر إلى إنشاء رسم بياني لتدفق التحكم في البرنامج. إذا كنت ترغب فقط في تفريغ كل تعليمات من تعليمات ثنائية تلو الأخرى (ما يسمى بوضع التفكيك الخطي) ، فيمكنك استخدام أمر objdump ، على سبيل المثال ،
bap objdump /bin/echo --show-{insn=asm,bil} إذا كان إدخالك عبارة عن نقطة من رمز الجهاز ، وليس قابلاً للتنفيذ ، فيمكنك استخدام المحمل raw ، على سبيل المثال ،
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} يأخذ اللودر الخام بعض المعلمات ، مثل الإزاحة والأطوال والعناوين الأساسية ، مما يجعلها سكينًا سويسريًا يمكنك استخدامه كفتحة علبة للتنسيقات غير المعروفة بـ BAP. يعمل المحمل الخام لجميع الأوامر التي تفتح الملفات ، على سبيل المثال ، إذا تم استخدام المحمل raw مع أمر disassemble ، فستظل BAP تلقائيًا تحدد الوظيفة وإنشاء CFG مناسبة دون حتى معرفة مكان وجود الكود في الثنائي ،
bap /bin/echo --loader=raw --raw-base=0x400000 -d إذا كنت ترغب في اللعب يدويًا مع البايتات ، على سبيل المثال ، اكتب التعليمات التي ترميز يدويًا ومعرفة كيف تفكك BAP وما هي الدلالات التي لديها ، فإن mc هو الأمر الذي تبحث عنه. تم تسميته للأداة المساعدة المقابلة في LLVM وترمز إلى رمز الجهاز ولديه نفس الواجهة مثل أمر objdump إلا أنه يأخذ ترميز ASCII للتعليم بدلاً من ملف ثنائي ، على سبيل المثال ،
bap mc --show-{insn=asm,bil} -- 48 83 ec 08أو
bap mc --show-{insn=asm,bil} "x48x83xecx08"
إنه يتعرف على عدد قليل من تنسيقات الإدخال (بما في ذلك llvm-mc يستخدم لخيار -show-encoding ). استشر الوثائق للحصول على معلومات أكثر تفصيلاً.
BAP هو إطار عمل قائم على المكون الإضافي ، وإذا كنت ترغب في تطوير تحليل جديد ، يمكنك كتابة مكون إضافي ، وبناءه ، وتثبيت ، وسيعمل مع بقية BAP دون أي إعادة ترجمة. هناك العديد من نقاط التمديد التي يمكنك استخدامها لإضافة تحليل جديد ، أو تغيير تطبيقاتك الحالية ، أو حتى إنشاء تطبيقاتك الخاصة. سنبدأ بمثال بسيط ، يسجل تمريرة تفكيك إلى أمر تفكيك. لنفترض أننا نريد كتابة تحليل يقدر نسبة تعليمات القفز إلى إجمالي عدد التعليمات في الثنائي. سنبدأ بإنشاء ملف فارغ يسمى jmp.ml في مجلد فارغ (اسم المجلد لا يهم). بعد ذلك ، باستخدام محرر النصوص المفضل لدينا ، سنضع الكود التالي فيه:
open Core_kernel
open Bap_main
open Bap.Std
let counter = object
inherit [ int * int ] Term. visitor
method ! enter_term _ _ (jmps,total) = jmps,total + 1
method ! enter_jmp _ (jmps,total) = jmps + 1 ,total
end
let main proj =
let jmps,total = counter#run ( Project. program proj) ( 0 , 0 ) in
printf " ratio = %d/%d = %g n " jmps total ( float jmps /. float total)
let () = Extension. declare @@ fun _ctxt ->
Project. register_pass' main;
Ok ()الآن يمكننا بناء وتثبيت وتشغيل تحليلنا باستخدام الأوامر التالية:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
دعنا نذهب لفترة وجيزة من خلال الكود. الكائن counter هو زائر يحتوي على الدولة التي تتكون من زوج من العدادات. يتتبع العداد الأول عدد مصطلحات JMP ، ويتم زيادة العداد الثاني في كل مرة ندخل فيها أي مصطلح. الوظيفة main تدير العداد وتطبع الإخراج. نعلن أن امتدادنا استخدم وظيفة extension.declare من مكتبة BAP_MAIN. الامتداد هو مجرد وظيفة تتلقى السياق (والتي يمكن استخدامها للحصول على معلمات التكوين). في هذه الوظيفة ، نقوم بتسجيل وظيفتنا main كتمريرة باستخدام وظيفة Project.register_pass .
يمكن العثور على مثال أكثر تعقيدًا قليلاً ، بالإضافة إلى مثال يستخدم Python ، في البرنامج التعليمي الخاص بنا.
يمكنك أيضًا إنشاء وتثبيت الإضافات BAP باستخدام الكثبان الرملية. لذلك ، تحتاج إلى تحديد مكتبة واستخدام المكون plugin المقطع الذي يستخدم هذه المكتبة. فيما يلي ملف dune قالب ،
(library
(name FOO)
(public_name OUR-FOO.plugin)
(libraries bap bap-main))
(plugin
(name FOO)
(package OUR-FOO)
(libraries OUR-FOO.plugin)
(site (bap-common plugins)))
إن كل شيء يتم ترحيله في المقتطف أعلاه هو عنصر نائب يجب أن تحل محل الأسماء الخاصة والعامة المناسبة لمكوّن الإضافي الخاص بك. لاحظ ، أن تمديد .plugin ليس ضروريًا ، ولكنه ملموس كاتفاقية جيدة.
BAP يشحن أيضا baptop تفاعلي TOPLEVEL. هذه فائدة تشبه الصدفة تقوم بتقييم تعبيرات OCAML بشكل تفاعلي وتطبع قيمها. سيتم تحميل مكتبات BAP وتهيئة جميع الإضافات لك ، بحيث يمكنك استكشاف العالم الشاسع من BAP بشكل تفاعلي. يمكن أن تكون الأداة المساعدة baptop أيضًا بمثابة مترجم غير تفادي ، بحيث يمكنك تشغيل البرامج النصية OCAML الخاصة بك ، على سبيل المثال ، baptop myscript.ml أو يمكنك حتى تحديدها باستخدام sha-bang في الجزء العلوي من ملفك ، على سبيل المثال ، #!/usr/bin/env baptop . لقد قمنا ببناء baptop باستخدام UTOP ، ولكن يمكنك بسهولة استخدام أي OCAML toplevel ، بما في ذلك ocaml نفسها ، فقط قم بتحميل مكتبة bap.top ، على سبيل المثال ، لفانيلا ocaml toplevel استخدام التوجيهات التالية
#use " topfind " ;;
#require " bap.top " ;;نحن نفهم أن BAP ضخمة ومن السهل أن تضيع. نحن نعمل باستمرار على تحسين الوثائق لضمان توثيق كل وظيفة في API BAP. لكن كتابة إرشادات عالية المستوى في شكل أدلة أو دروس تعليمية أكثر صعوبة وتستغرق وقتًا طويلاً ، خاصة بالنظر إلى مدى اختلاف أهداف زملائنا في الباحثين والمستخدمين. لذلك نحن نستخدم نهجًا متخلفًا ويفضل الإجابة على الأسئلة الحقيقية بدلاً من محاولة معالجة جميع الأسئلة الممكنة قبل الأوان. سنكون سعداء برؤيتك في الدردشة الخاصة بك والتي تتميز بالقابل للبحث ، وفهرستها بواسطة Google ، أرشيف.
نحن نكتب ، في بعض الأحيان ، إلى مدونتنا وويكي ونشجع الجميع على المساهمة في كل منهما. يمكنك أيضًا نشر أسئلتك على StackOverflow أو مناقشة BAP على لوحة OCAML. لدينا أيضًا قناة خلاف لطيفة ، والتي لديها حركة مرور أقل بكثير من Gitter لدينا.
تم بناء BAP من قبل المجتمع ونرحب بجميع المساهمات من المؤلفين الذين يرغبون في مشاركتها بموجب ترخيص معهد ماساتشوستس للتكنولوجيا. إذا كنت لا تعتقد أن تحليلك أو أداتك يناسب هذا المستودع (على سبيل المثال ، فإنه يتمتع باستخدام محدود ، وليس جاهزًا تمامًا ، ولا يفي بمعاييرنا ، وما إلى ذلك) ، فيمكنك التفكير في المساهمة في مستودع PAP-plugins الخاص بنا وهو عبارة عن مجموعة من الإضافات المفيدة لـ BAP التي لا تنضج بما يكفي لإدراجها في التوزيع الرئيسي. بدلاً من ذلك ، يمكنك التفكير في تمديد مجموعة الأدوات الخاصة بنا باستخدام أداتك.
بالطبع ، ليست هناك حاجة لتقديم عملك إلى أحد مستودعاتنا. BAP هو إطار عمل قائم على المكون الإضافي ويمكن استضافة الرمز الخاص بك في أي مكان ولديه أي ترخيص (بما في ذلك الملكية). إذا كنت ترغب في إتاحة عملك للمجتمع ، فسيكون من الجيد إطلاقه عبر OPAM.
forallsecure
بوينغ
مشروع DARPA VET
Siemens AG
منحة معهد للمعلومات والاتصالات تكنولوجيا الاتصالات (IITP) بتمويل من حكومة كوريا (MSIT) (رقم 2015-0-00565 ، تطوير تقنيات اكتشاف الضعف لأمن برامج إنترنت الأشياء)
من فضلك ، اتصل بنا إذا كنت ترغب في أن تصبح راعياً أو تسعى للحصول على تعاون أعمق.