मुझे लगता है कि यह प्रश्न एक अद्यतन उत्तर के योग्य है।
जब मैंने कई साल पहले इस सवाल से पूछा, तो मैंने the difference between obfuscation and encryption पर विचार नहीं किया। अगर मैं इस अंतर को जानता था तो, मैंने पहले शीर्षक में ओबफ्यूशन शब्द शामिल किया होगा। एक प्रभावी और यथोचित सरल तरीके से (हालांकि मैं अभी तक कि प्रयास नहीं किया है, और संभवतः एन्क्रिप्शन)
सी ++ 11 और सी ++ 14 विशेषताएं है कि यह संभव संकलन समय स्ट्रिंग कहानियो को लागू करने के लिए बनाने के लिए है, और यह पहले से ही किया जा चुका है।
ADVobfuscator सेबस्टियन एंड्रेटेट द्वारा बनाई गई एक obfuscation लाइब्रेरी है जो किसी भी बाहरी उपकरण, बस सी ++ कोड का उपयोग किए बिना संकलन-समय obfuscated कोड उत्पन्न करने के लिए सी ++ 11/14 का उपयोग करता है। अतिरिक्त निर्माण चरणों को बनाने की कोई आवश्यकता नहीं है, बस इसे शामिल करें और इसका उपयोग करें। मुझे एक बेहतर संकलन-समय स्ट्रिंग एन्क्रिप्शन/obfuscation कार्यान्वयन नहीं पता है जो बाहरी उपकरण का उपयोग नहीं करता है या चरणों का निर्माण नहीं करता है। यदि आप करते हैं, तो कृपया साझा करें।
यह न केवल तारों को दबाता है, लेकिन इसमें अन्य उपयोगी चीजें हैं जैसे कि संकलन-समय एफएसएम (Finite State Machine) जो यादृच्छिक रूप से फ़ंक्शन कॉल, और एक संकलन-समय छद्म-यादृच्छिक संख्या जेनरेटर को खराब कर सकती हैं, लेकिन ये दायरे से बाहर हैं इस जवाब का।
#include "MetaString.h"
using namespace std;
using namespace andrivet::ADVobfuscator;
void Example()
{
/* Example 1 */
// here, the string is compiled in an obfuscated form, and
// it's only deobfuscated at runtime, at the very moment of its use
cout << OBFUSCATED("Now you see me") << endl;
/* Example 2 */
// here, we store the obfuscated string into an object to
// deobfuscate whenever we need to
auto narrator = DEF_OBFUSCATED("Tyler Durden");
// note: although the function is named `decrypt()`, it's still deobfuscation
cout << narrator.decrypt() << endl;
}
आप मैक्रो DEF_OBFUSCATED
और OBFUSCATED
अपने मैक्रो के साथ की जगह ले सकता:
यहाँ एक सरल स्ट्रिंग कहानियो ADVobfuscator का उपयोग कर उदाहरण है। उदाहरण के लिए .:
#define _OBF(s) OBFUSCATED(s)
...
cout << _OBF("klapaucius");
यह कैसे काम करता है?
आप MetaString.h में इन दो मैक्रो की परिभाषा पर एक नज़र डालें, तो आप देखेंगे:
#define DEF_OBFUSCATED(str) MetaString<andrivet::ADVobfuscator::MetaRandom<__COUNTER__, 3>::value, andrivet::ADVobfuscator::MetaRandomChar<__COUNTER__>::value, Make_Indexes<sizeof(str) - 1>::type>(str)
#define OBFUSCATED(str) (DEF_OBFUSCATED(str).decrypt())
असल में, MetaString
वर्ग (स्ट्रिंग कहानियो की कोर) के तीन अलग-अलग रूपों देखते हैं । प्रत्येक का अपना obfuscation एल्गोरिदम है। लाइब्रेरी के छद्म-यादृच्छिक संख्या जेनरेटर (MetaRandom
) के साथ, इन तीनों प्रकारों में से एक को यादृच्छिक रूप से संकलित समय पर चुना जाता है, साथ ही यादृच्छिक char
के साथ चुने गए एल्गोरिदम द्वारा xor
स्ट्रिंग वर्णों के लिए उपयोग किया जाता है।
"अरे, लेकिन हम गणित, 3 एल्गोरिदम * 255 संभव चार कुंजियों (0 नहीं किया जाता है) = अस्पष्ट स्ट्रिंग के 765 वेरिएंट करते हैं"
आप सही हैं। एक ही स्ट्रिंग को केवल 765 विभिन्न तरीकों से खराब किया जा सकता है। यदि आपके पास कुछ सुरक्षित की आवश्यकता है (आप पागल हैं/आपके आवेदन की सुरक्षा में वृद्धि की मांग है) तो आप लाइब्रेरी का विस्तार कर सकते हैं और मजबूत obfuscation या यहां तक कि एन्क्रिप्शन (White-Box cryptography lib का रोडमैप में) का उपयोग करके अपने स्वयं के एल्गोरिदम लागू कर सकते हैं।
कहाँ/कैसे यह समझ से परे तार की दुकान करता है?
एक चीज जो मुझे इस कार्यान्वयन के बारे में दिलचस्प लगता है वह यह है कि यह निष्पादन योग्य के डेटा खंड में obfuscated स्ट्रिंग को संग्रहीत नहीं करता है। इसके बजाए, यह स्थिर रूप से MetaString
ऑब्जेक्ट (स्टैक पर) में संग्रहीत है और एल्गोरिदम इसे रनटाइम पर स्थानांतरित करता है। यह दृष्टिकोण obfuscated तारों को, स्थिर रूप से या रनटाइम पर ढूंढना बहुत कठिन बनाता है।
आप अपने आप से कार्यान्वयन में गहराई से गोता लगा सकते हैं। यह एक बहुत अच्छा बुनियादी obfuscation समाधान है और एक जटिल बिंदु के लिए एक प्रारंभिक बिंदु हो सकता है।
इस प्रकार की समस्या के लिए एक आम दृष्टिकोण एक स्क्रिप्ट लिखना है जो आपकी स्रोत फ़ाइल को इनपुट के रूप में लेता है और एक संशोधित फ़ाइल को आउटपुट के रूप में बनाता है, जो तब आपकी बिल्ड प्रक्रिया द्वारा उपयोग किया जाएगा। इस मामले में, स्क्रिप्ट एन्क्रिप्ट करने के लिए 'एन्क्रिप्टेड स्ट्रिंग <"स्ट्रिंग की तलाश करेगा">' और एन्क्रिप्टेड/एन्कोडेड संस्करण के साथ स्ट्रिंग को प्रतिस्थापित करें। – jdigital