
LLVM आधारित स्थैतिक बाइनरी विश्लेषण ढांचा
Dna एक स्थिर बाइनरी विश्लेषण ढांचा है जो LLVM के ऊपर निर्मित है। उल्लेखनीय रूप से यह लगभग पूरी तरह से C# में लिखा गया है, जिसमें LLVM, Remill और Souper के लिए प्रबंधित बाइंडिंग शामिल हैं।
Dna SATURN पेपर से प्रेरित एक पुनरावृत्त नियंत्रण प्रवाह ग्राफ पुनर्निर्माण लागू करता है। यह पुनरावृत्त रूप से रिकर्सिव डिसेंट, लिफ्टिंग (remill का उपयोग करके) और पथ समाधान लागू करता है जब तक कि पूर्ण नियंत्रण प्रवाह ग्राफ़ पुनर्प्राप्त नहीं हो जाता। जम्प टेबल के मामले में, हम संभावित जम्प टेबल लक्ष्यों के सेट को हल करने के लिए Souper और z3 पर आधारित एक पुनरावर्ती एल्गोरिथ्म का उपयोग करते हैं। आप पुनरावृत्त अन्वेषण एल्गोरिथ्म यहाँ और जम्प टेबल समाधान एल्गोरिथ्म यहाँ पा सकते हैं।
एक बार नियंत्रण प्रवाह ग्राफ़ पूरी तरह से अन्वेषित हो जाने के बाद, इसे यहाँ और यहाँ दिए गए एल्गोरिदम का उपयोग करके x86 पर पुन: संकलित किया जा सकता है और बाइनरी में पुनर्स्थापित किया जा सकता है। हालांकि संकलित कोड किसी भी तरह से सुंदर नहीं है, लेकिन इसे तब तक चलना चाहिए जब तक पुनर्प्राप्त नियंत्रण प्रवाह ग्राफ सही है। ऐसा कहने के बाद, यह अभी भी एक शोध प्रोटोटाइप है - बग और किनारे के मामलों की उम्मीद है। नियंत्रण प्रवाह ग्राफ अन्वेषण विफल हो सकता है, उदाहरण के लिए, असीमित जम्प टेबल या अनलिफ्टेबल निर्देशों के मामले में।
कुछ अन्य उल्लेखनीय विशेषताएं:
try/catch स्टेटमेंट और filter इंट्रिन्सिक्स को नियंत्रण प्रवाह ग्राफ में डाला जाता है। हालांकि पुन: संकलक अभी तक SEH का समर्थन नहीं करता है (SEH प्रविष्टियाँ ठीक नहीं की गई हैं), इसलिए अपवाद क्रैश का कारण बनेंगे।MemorySSA, LoopInfo, डोमिनेटर ट्री, पास पाइपलाइन प्रबंधन, आदि के लिए बाइंडिंग हैं।कुछ सावधानियाँ:
ध्यान दें कि Dna वर्तमान में LLVM 17 पर आधारित है।
Dna में Dna.BinaryTranslator/VMProtect में स्थित एक VMProtect डिवर्चुअलाइज़ेशन प्लगइन शामिल है। अधिक जानकारी के लिए यह PR देखें।
Dna वर्तमान में LLVM 17 को लक्षित करता है और Windows x64 पर Visual Studio 2022 के साथ बनाए जाने की उम्मीद है।
Dna.LLVMInterop को Release मोड में बनाएँ; मूल निर्भरता ट्री Release-बिल्ट है और Debug इंटरऑप बिल्ड समर्थित नहीं हैं।
नीचे दिए गए कमांड को VS x64 डेवलपर शेल, या PATH पर VS C++ टूल वाले किसी अन्य शेल से चलाएँ।
निर्भरता सुपरबिल्ड Dna.LLVMInterop/dependencies/install में LLVM 17, Remill, Z3, XED, gflags/glog और संबंधित मूल लाइब्रेरी स्थापित करता है।
cmake -S Dna.LLVMInterop/dependencies `
-B Dna.LLVMInterop/dependencies/build `
-G Ninja `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_C_COMPILER=clang-cl `
-DCMAKE_CXX_COMPILER=clang-cl
cmake --build Dna.LLVMInterop/dependencies/build
यदि कंपाइलर, बिल्ड प्रकार, या CRT सेटिंग्स बदल रहे हैं, तो पुन: कॉन्फ़िगर करने से पहले Dna.LLVMInterop/dependencies/build और Dna.LLVMInterop/dependencies/install दोनों को हटा दें।
Dna.Example और सरलीकरण प्रोजेक्ट Cargo रिलीज़ आउटपुट से eq_sat.dll की प्रतिलिपि बनाते हैं।
cargo build --manifest-path Simplifier/EqSat/Cargo.toml --release
& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" `
Dna.sln `
/restore `
/p:Configuration=Release `
/p:Platform=x64 `
/m