
HAL [/hel/] هو إطار شامل للهندسة العكسية والتلاعب بقوائم التوصيل (netlists).
تقريبًا جميع الأبحاث المتاحة حول تحليل قوائم التوصيل تعمل على تمثيل قائم على الرسم البياني لقائمة التوصيل قيد الفحص. في جوهره، يوفر HAL بالضبط ذلك: إطار لتحليل قوائم التوصيل من مصادر عشوائية، مثل FPGAs أو ASICs، إلى تمثيل قائمة توصيل قائم على الرسم البياني وتوفير الأدوات المدمجة اللازمة لاجتياز وتحليل البوابات (gates) والشبكات (nets) المضمنة.
رؤيتنا هي أن يصبح HAL المعادل لأدوات مثل IDA أو Ghidra في مجال الهندسة العكسية للأجهزة. نريد أن يمكن HAL الباحثين والمحللين من وجود خط أساس مشترك لتحسين قابلية تكرار نتائج الأبحاث وتجريد المهام الأساسية المتكررة مثل تحليل قوائم التوصيل إلخ.
HAL يُطوَّر بنشاط من قبل مجموعة الأمان المضمنة (Embedded Security) في معهد ماكس بلانك للأمن والخصوصية. بالإضافة إلى العديد من المشاريع البحثية، يُستخدم أيضًا في محاضرتنا الجامعية "مقدمة في الهندسة العكسية للأجهزة" في جامعة الرور في بوخوم (RUB).
لاحظ أن لدينا أيضًا مجموعة من دوائر البنشمارك (benchmark circuits) الحديثة والمتطورة لتقييم تقنيات الهندسة العكسية لقوائم التوصيل متاحة في مستودع منفصل.
يحتوي هذا المستودع على مجموعة مختارة من الإضافات المنقحة:
libertyتوثيق شامل لميزات HAL من منظور المستخدم متاح في ويكيبيديا. بالإضافة إلى ذلك، نقدم توثيقًا كاملاً لـ API C++ و API Python.
للحصول على تعليمات حول كيفية بناء HAL، يرجى الرجوع إلى الصفحة المخصصة في ويكيبيديا.
قم بتثبيت HAL أو بنائه وابدأ الواجهة الرسومية عبر hal -g. يمكنك سرد جميع الخيارات المتاحة عبر hal [--help|-h].
لقد أدرجنا بعض المشاريع الأمثلة في المجلد الفرعي examples. لبدء العمل مع مشروع مثال، تحتاج إلى استيراده
عبر Import Project من القائمة الرئيسية أو عن طريق إسقاط الملف المضغوط في منطقة OPEN PROJECT في شاشة الترحيب.
عند القيام بذلك، سيظهر منبثق يطلب دليلاً بأذونات الكتابة حيث سينشئ HAL دليل المشروع ويفك ضغط الملفات.
لا تستخدم أدوات خارجية لفك الضغط حيث يتم إجراء تعديلات بحيث يتم العثور على قائمة التوصيل ومكتبة البوابات في المرة التالية التي يتم فيها فتح المشروع.
في حال كنت تريد فتح قائمة توصيل Verilog أو VHDL الخاصة بك، يجب عليك تشغيل Import Netlist بدلاً من ذلك. لن يعمل هذا إلا إذا
كانت هناك مكتبة بوابات مطابقة في plugins/gate_libraries/definitions أو قمت بتوفير مكتبة البوابات يدويًا.
للحصول على تعليمات حول إنشاء مكتبة البوابات الخاصة بك ودروس أخرى مفيدة، ألق نظرة على الويكي.
يشير كود المثال التالي إلى مثال fsm.
استخدم صدفة Python المدمجة أو نافذة البرنامج النصي Python للتفاعل. كلاهما يتميز بميزة الإكمال التلقائي (المحدودة).
دعنا ندرج جميع جداول البحث (LUTs) ونطبع دوالهم البوليانية:
for gate in netlist.get_gates():
if "LUT" in gate.type.name:
print("{} (id {}, type {})".format(gate.name, gate.id, gate.type.name))
print(" {}-to-{} LUT".format(len(gate.type.input_pins), len(gate.type.output_pins)))
boolean_functions = gate.boolean_functions
for name in boolean_functions:
print(" {}: {}".format(name, boolean_functions[name]))
print("")
بالنسبة لمثال قائمة التوصيل fsm.vhd، سيطبع هذا:
FSM_sequential_STATE_REG_0_i_3_inst (id 4, type LUT6)
6-to-1 LUT
O: (!I1 & !I2 & I3 & !I4 & I5) | (I0 & !I2) | (I0 & I1) | (I0 & I3) | (I0 & I4) | (I0 & I5)
FSM_sequential_STATE_REG_0_i_2_inst (id 3, type LUT6)
6-to-1 LUT
O: (I2 & I3 & I4 & !I5) | (I1 & !I5) | (I1 & !I4) | (I1 & !I3) | (I0 & I1) | (I1 & I2)
FSM_sequential_STATE_REG_1_i_3_inst (id 6, type LUT6)
6-to-1 LUT
O: (!I1 & I4 & !I5) | (!I1 & !I3 & I4) | (I0 & I4 & !I5) | (I0 & !I3 & I4) | (!I1 & I2 & I4) | (I0 & I2 & I4) | (!I2 & !I5) | (!I2 & !I4) | (!I2 & !I3) | (!I0 & !I4) | (!I0 & !I2) | (!I0 & !I1) | (I1 & !I4) | (I1 & !I2) | (I0 & I1) | (I3 & !I5) | (I3 & !I4) | (!I0 & I3) | (I1 & I3) | (I2 & I3) | (!I4 & I5) | (!I3 & I5) | (!I0 & I5) | (I1 & I5) | (I2 & I5)
FSM_sequential_STATE_REG_1_i_2_inst (id 5, type LUT6)
6-to-1 LUT
O: (!I0 & I1 & !I2 & I3 & I4 & !I5) | (I0 & !I2 & I3 & I4 & I5)
OUTPUT_BUF_0_inst_i_1_inst (id 18, type LUT1)
1-to-1 LUT
O: !I0
OUTPUT_BUF_1_inst_i_1_inst (id 20, type LUT2)
2-to-1 LUT
O: (I0 & !I1) | (!I0 & I1)
نرحب بمساهمتك في تطوير HAL. لا تتردد في تقديم طلب سحب (pull request) جديد عبر github.
يرجى النظر في تشغيل الفحوصات الثابتة + clang format قبل ذلك.
يمكنك أيضًا تثبيت هذه الفحوصات كخطافات git قبل أي إيداع.
لتثبيت خطاف clang-format، قم بتثبيت git-hooks ثم شغّل:
git hooks --install
ابدأ بناء Docker عبر:
docker-compose run --rm hal-build
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" --no-merges
إذا كنت تستخدم HAL في سياق أكاديمي، يرجى الاستشهاد بالإطار باستخدام المرجع أدناه:
@misc{hal,
author = {{Embedded Security Group}},
publisher = {{Max Planck Institute for Security and Privacy}},
title = {{HAL - The Hardware Analyzer}},
year = {2019},
howpublished = {\url{https://github.com/emsec/hal}},
}
لا تتردد أيضًا في تضمين الورقة الأصلية. ومع ذلك، نلاحظ أن HAL قد تغير بشكل كبير منذ نموذجه الأولي الذي تم وصفه في الورقة. وبالتالي، نفضل الاستشهاد بالإدخال أعلاه.
@article{2018:Fyrbiak:HAL,
author = {Marc Fyrbiak and Sebastian Wallat and Pawel Swierczynski and Max Hoffmann and Sebastian Hoppach and Matthias Wilhelm and Tobias Weidlich and Russell Tessier and Christof Paar},
title = {{HAL-} The Missing Piece of the Puzzle for Hardware Reverse Engineering, Trojan Detection and Insertion},
journal = {IEEE Transactions on Dependable and Secure Computing},
year = {2018},
publisher = {IEEE},
howpublished = {\url{https://github.com/emsec/hal}}
}
للحصول على نظرة عامة على التحديات التي شرعنا في حلها باستخدام HAL، لا تتردد في مشاهدة محادثتنا في مؤتمر 36C3.
HAL مرخص بموجب رخصة MIT لتشجيع التعاون مع المجموعات البحثية الأخرى والمساهمات من الصناعة. يرجى الرجوع إلى ملف الترخيص لمزيد من المعلومات.
HAL هو برنامج بجودة ألفا على الأكثر. استخدمه على مسؤوليتك الخاصة. نحن لا نشجع أي استخدام ضار لأداتنا.