
Fuzzer لبرامج تشغيل نواة لينكس
يحتوي هذا المستودع على جميع المصادر (بما في ذلك نصوص الإعداد) التي تحتاجها لتشغيل difuze.
Ubuntu >= 14.04.5 LTS
راجع ملف readme
كما هو موضح في بحثنا، هناك مكونان رئيسيان لـ difuze: استعادة الواجهة و محرك التعمية
تعتمد آلية استعادة الواجهة على تحليلات LLVM المارة. كل خطوة من خطوات استعادة الواجهة مكتوبة كممرات فردية. اتبع التعليمات أدناه حول كيفية تشغيل استعادة الواجهة.
تتولى هذه الخطوة تثبيت LLVM و c2xml:
أولاً، تأكد من أن لديك libxml (مطلوب لـ c2xml):
sudo apt-get install libxml2-dev
sudo pip install lxml
بعد ذلك، قمنا بإنشاء نص برمجي واحد، يقوم بتنزيل وبناء جميع الأدوات المطلوبة.
cd helper_scripts
python setup_difuze.py --help
usage: setup_difuze.py [-h] [-b TARGET_BRANCH] [-o OUTPUT_FOLDER]
optional arguments:
-h, --help show this help message and exit
-b TARGET_BRANCH Branch (i.e. version) of the LLVM to setup. Default:
release_38 e.g., release_38
-o OUTPUT_FOLDER Folder where everything needs to be setup.
مثال:
python setup_difuze.py -o difuze_deps
لإكمال الإعداد، تحتاج أيضًا إلى تعديلات في متغير البيئة PATH المحلي. سيعطيك نص الإعداد التغييرات الدقيقة التي تحتاجها.
يعتمد هذا على إتمام الإعداد بنجاح الإعداد. لدينا نص برمجي واحد يبني كل شيء، على الرحب والسعة.
cd InterfaceHandlers
./build.sh
يعتمد هذا على إتمام البناء بنجاح البناء. لتشغيل مكونات استعادة الواجهة على برامج تشغيل النواة، نحتاج أولاً إلى تحويل برامج التشغيل إلى كود LLVM bitcode.
أولاً، نحتاج إلى نواة قابلة للبناء. وهذا يعني أنه يجب أن تكون قادرًا على تجميع النواة باستخدام إعداد البناء المعتاد. أي make.
نلتقط أولاً مخرجات أمر make، ومن هذا المخرج نستخرج أمر التجميع الدقيق.
makebear make <جميع خيارات make>
مثال: bear make -j8سيؤدي هذا إلى إنشاء ملف compile_commands.json في الدليل الحالي.
ما عليك سوى تمرير V=1 وإعادة توجيه المخرجات إلى الملف.
مثال:
make V=1 O=out ARCH=arm64 > makeout.txt 2>&1
ملاحظة: لا تستخدم عمليات متعددة أي -j. سيؤدي تشغيل وضع المعالجة المتعددة إلى إفساد ملف المخرجات حيث تحاول عمليات متعددة الكتابة إلى ملف المخرجات.
هذا كل شيء. بعد ذلك، في الخطوة التالية، يأخذ نصنا البرمجي ملف makeout.txt الذي تم إنشاؤه ويقوم بتشغيل استعادة الواجهة على جميع برامج التشغيل المعترف بها.
جميع خطوات استعادة الواجهة المختلفة مغلفة في نص برمجي واحد helper_scripts/run_all.py
كيفية التشغيل:
cd helper_scripts
python run_all.py --help
usage: run_all.py [-h] [-l LLVM_BC_OUT] [-a CHIPSET_NUM] [-m MAKEOUT]
[-c COMPJSON] [-g COMPILER_NAME] [-n ARCH_NUM] [-o OUT]
[-k KERNEL_SRC_DIR] [-isclang] [-clangp CLANG_PATH]
[-llvmlinkp LLVMLINK_PATH] [-skb] [-skl] [-skp] [-skP]
[-ske] [-skI] [-ski] [-skv] [-skd] [-f IOCTL_FINDER_OUT]
optional arguments:
-h, --help show this help message and exit
-l LLVM_BC_OUT Destination directory where all the generated bitcode
files should be stored.
-a CHIPSET_NUM Chipset number. Valid chipset numbers are:
1(mediatek)|2(qualcomm)|3(huawei)|4(samsung)
-m MAKEOUT Path to the makeout.txt file.
-c COMPJSON Path to the compile_commands_json generated by Bear.
-g COMPILER_NAME Name of the compiler used in the makeout.txt, This is
needed to filter out compilation commands. Ex: aarch64
-linux-android-gcc
-n ARCH_NUM Destination architecture, 32 bit (1) or 64 bit (2).
-o OUT Path to the out folder. This is the folder, which
could be used as output directory during compiling
some kernels.
-k KERNEL_SRC_DIR Base directory of the kernel sources.
-isclang flag to indicate that clang was used to built the
kernel
-clangp CLANG_PATH Absolute path to the clang binary (if not provided,
the one available in the path will be used)
-llvmlinkp LLVMLINK_PATH
Absolute path to the llvm-link binary (if not
provided, the one available in the path will be used)
-skb Skip LLVM Build (default: not skipped).
-skl Skip Dr Linker (default: not skipped).
-skp Skip Parsing Headers (default: not skipped).
-skP Skip Generating Preprocessed files (default: not
skipped).
-ske Skip Entry point identification (default: not
skipped).
-skI Skip Generate Includes (default: not skipped).
-ski Skip IoctlCmdParser run (default: not skipped).
-skv Skip V4L2 ioctl processing (default: not skipped).
-skd Skip Device name finder (default: not skipped).
-f IOCTL_FINDER_OUT Path to the output folder where the ioctl command
finder output should be stored.
يقوم النص البرمجي ببناء وربط وتشغيل استعادة الواجهة على جميع برامج التشغيل المعترف بها، ونتيجة لذلك قد يستغرق وقتًا طويلاً (45 دقيقة - 90 دقيقة).
يقوم النص البرمجي أعلاه بالمهام التالية في وضع متعدد المعالجات للاستفادة من جميع أنوية وحدة المعالجة المركزية:
سيتم وضع جميع ملفات bitcode التي تم إنشاؤها في المجلد المقدم للوسيطة -l.
تستغرق هذه الخطوة وقتًا طويلاً، اعتمادًا على عدد الأنوية لديك.
لذا، إذا كنت قد أكملت هذه الخطوة بالفعل، يمكنك تخطيها بتمرير -skb.
يقوم هذا بإجراء الربط، حيث يمر عبر جميع ملفات bitcode ويحدد ملفات bitcode ذات الصلة التي يجب ربطها ويربطها (باستخدام llvm-link) في ملف bitcode موحد (سيتم تخزينه بجانب ملف bitcode المقابل).
على غرار الخطوة أعلاه، يمكنك تخطي هذه الخطوة بتمرير -skl.
تبحث هذه الخطوة عن إعلانات نقاط الدخول في ملفات الرأس وتخزن تكوينها في الملف: hdr_file_config.txt تحت دليل بناء LLVM.
للتخطي: -skp
تحدد هذه الخطوة جميع نقاط الدخول عبر جميع ملفات bitcode الموحدة لبرامج التشغيل.
سيتم تخزين المخرجات في ملف: entry_point_out.txt تحت دليل بناء LLVM.
مثال على محتويات ملف entry_point_out.txt:
IOCTL:msm_lsm_ioctl:/home/difuze/kernels/pixel/msm/sound/soc/msm/qdsp6v2/msm-lsm-client.c:msm_lsm_ioctl.txt:/home/difuze/pixel/llvm_out/sound/soc/msm/qdsp6v2/llvm_link_final/final_to_check.bc
IOCTL:msm_pcm_ioctl:/home/difuze/kernels/pixel/msm/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c:msm_pcm_ioctl.txt:/home/difuze/pixel/llvm_out/sound/soc/msm/qdsp6v2/llvm_link_final/final_to_check.bc
للتخطي: -ske
ستقوم هذه الخطوة بتشغيل مكون استعادة الواجهة الرئيسي (IoctlCmdParser) على جميع نقاط الدخول في ملف entry_point_out.txt. سيتم تخزين المخرجات لكل نقطة دخول في المجلد المقدم للخيار -f.
للتخطي: -ski
سنقدم الآن مثالاً من النقطة التي يكون لديك فيها مصادر النواة إلى نقطة الحصول على نتائج استعادة الواجهة.