
x64 बाइनरी ओब्फसकेटर PE फ़ाइलों के लिए नियंत्रण प्रवाह समतलन, एंटी-डिसअसेंबली, आयात अस्पष्टीकरण, और निर्देश उत्परिवर्तन के साथ रिवर्स इंजीनियरिंग में बाधा डालने के लिए।
Alcatraz एक x64 बाइनरी ऑबफसकेटर है जो विभिन्न PE फ़ाइलों को ऑबफसकेट कर सकता है, जिनमें शामिल हैं:
इंस्टॉल करें: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) file पर क्लिक करके बाइनरी लोड करें (ऊपरी बाएँ कोने में)।
2.) Functions ट्री को विस्तारित करके फ़ंक्शन जोड़ें। (आप शीर्ष पर सर्चबार में नाम डालकर खोज सकते हैं)
3.) compile दबाएँ (नोट: बहुत सारे फ़ंक्शन को ऑबफसकेट करने में कुछ सेकंड लग सकते हैं)
निम्नलिखित प्रदर्शन में सभी सुविधाओं (जो दिखाई जा रही है उसके अलावा) को अक्षम कर दिया गया है।
यदि किसी रजिस्टर में कोई इमीडिएट वैल्यू मूव की जाती है, तो हम इसे कई बिटवाइज़ ऑपरेशन लागू करके ऑबफसकेट करते हैं। आइए लोकप्रिय फ़ंक्शन _security_init_cookie पर नज़र डालें।
पहले:
बाद में:

कंपाइलर द्वारा उत्पन्न सुव्यवस्थित प्रोग्राम संरचना को हटाकर और हमारे कोड को नए जनरेट किए गए ब्लॉकों में रखकर, हम प्रोग्राम की जटिलता बढ़ाते हैं। आइए इस सरल फ़ंक्शन main को उदाहरण के रूप में लें (इस प्रोग्राम के लिए ऑप्टिमाइज़ेशन अक्षम है):

यदि हम इसे IDA 7.6 में डालते हैं, तो डीकंपाइलर इसे ऑप्टिमाइज़ करेगा:

अब इसके कंट्रोल फ्लो को फ्लैट करें और IDA से इसे फिर से विश्लेषित करवाएँ:

जैसा कि आप देख सकते हैं, जटिलता बहुत बढ़ गई है, भले ही मैं उत्पन्न कोड का केवल एक छोटा सा हिस्सा दिखा रहा हूँ। यदि आप जानना चाहते हैं कि CFG कैसा दिखता है:

यदि कोई रजिस्टर (जैसे RAX) किसी अन्य रजिस्टर (जैसे RCX) में जोड़ा जाता है, तो हम निर्देश में म्यूटेशन करेंगे। इसका मतलब है कि सिंटैक्स बदल जाता है लेकिन सिमैंटिक नहीं बदलता।
निर्देश ADD RCX, RAX को निम्नलिखित में म्यूटेट किया जा सकता है:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
यदि आप म्यूटेशन के बारे में अधिक जानना चाहते हैं, तो perses देखें।
यदि PE फ़ाइल .exe है (.dll सपोर्ट बाद में जोड़ा जाएगा), तो हम एक कस्टम एंट्री पॉइंट बनाएंगे जो स्टार्टअप पर वास्तविक एंट्री पॉइंट को डिक्रिप्ट करता है (!!! मैनुअल मैप किए जाने पर काम नहीं करता)।

Lea ऑबफस्केशन काफी सरल लेकिन प्रभावी है। हम रजिस्टर में एक अलग लोकेशन ले जाते हैं और उसे बाद में डिक्रिप्ट करते हैं। इस तरह, रिवर्स इंजीनियर कुछ डेटा/फ़ंक्शन को क्रॉस रेफरेंस नहीं कर सकते।
मान लीजिए हमें निम्नलिखित निर्देश मिलता है: lea rcx, [0xDEAD]
हम इसे म्यूटेट करेंगे:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
यदि हमें कोई ऐसा निर्देश मिलता है जो बाइट 0xFF से शुरू होता है, तो हम उसके आगे 0xEB लगा देंगे।
हम ऐसा इसलिए करते हैं क्योंकि 0xEB 0xFF एनकोड होकर jmp rip + 1 बनता है, जो अंततः हमारे वास्तविक पहले 0xFF पर कूद जाता है। इससे वे टूल गड़बड़ा जाएंगे जो निर्देशों को रैखिक तरीके से डिकोड करते हैं।
पहले:

बाद में:

समय-समय पर हम यह डाल सकते हैं:
jz 3
jne 1
0xE8
IDA 0xE8 (call) को डिकोड करने का प्रयास करेगा लेकिन सफल नहीं होगा:

अभी कोई "उचित" IAT ऑबफस्केशन नहीं है। 0xFF एंटी डिसअसेंबली ट्रिक फिलहाल इसका ध्यान रखती है। यहाँ उचित कार्यान्वयन की योजना है:
iat.cpp
यह हमारे main फ़ंक्शन का एक स्निपेट है जिसमें एंटी डिसअसेंबली को छोड़कर सब कुछ सक्षम है (ताकि IDA एक फ़ंक्शन बना सके):
