
लिनक्स कर्नेल ड्राइवरों के लिए फ़ज़र
इस रिपॉजिटरी में वे सभी स्रोत (सेटअप स्क्रिप्ट सहित) हैं, जिनकी आपको 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 बिटकोड में बदलना होगा।
सबसे पहले, हमारे पास एक बिल्ड करने योग्य कर्नेल होना चाहिए। इसका मतलब है कि आप नियमित बिल्ड सेटअप का उपयोग करके कर्नेल को संकलित करने में सक्षम होने चाहिए। यानी make।
हम पहले make कमांड के आउटपुट को कैप्चर करते हैं, इस आउटपुट से हम सटीक संकलन कमांड निकालते हैं।
make का आउटपुट उत्पन्न करनाbear 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 मिनट) लग सकता है।
उपरोक्त स्क्रिप्ट सभी CPU कोर का उपयोग करने के लिए मल्टीप्रोसेसर मोड में निम्नलिखित कार्य करती है:
उत्पन्न सभी बिटकोड फ़ाइलों को -l तर्क को दिए गए फ़ोल्डर में रखा जाएगा।
यह चरण आपके पास मौजूद कोर की संख्या के आधार पर काफी समय लेता है।
इसलिए, यदि आप पहले ही यह चरण कर चुके हैं, तो आप -skb पास करके इस चरण को छोड़ सकते हैं।
यह लिंकिंग करता है, यह सभी बिटकोड फ़ाइलों के माध्यम से जाता है और संबंधित बिटकोड फ़ाइलों की पहचान करता है जिन्हें लिंक करने की आवश्यकता होती है और उन्हें (llvm-link का उपयोग करके) एक समेकित बिटकोड फ़ाइल में लिंक करता है (जो संबंधित बिटकोड फ़ाइल के साथ संग्रहीत की जाएगी)।
उपरोक्त चरण के समान, आप -skl पास करके इस चरण को छोड़ सकते हैं।
यह चरण हेडर फ़ाइलों में प्रवेश बिंदु घोषणाओं की तलाश करता है और उनके कॉन्फ़िगरेशन को LLVM बिल्ड निर्देशिका के अंतर्गत फ़ाइल hdr_file_config.txt में संग्रहीत करता है।
छोड़ने के लिए: -skp
यह चरण सभी ड्राइवर समेकित बिटकोड फ़ाइलों में सभी प्रवेश बिंदुओं की पहचान करता है।
आउटपुट LLVM बिल्ड निर्देशिका के अंतर्गत फ़ाइल entry_point_out.txt में संग्रहीत किया जाएगा।
फ़ाइल 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