27

मुझे पता चला कि बाइनरी से हार्ड-कोडेड स्ट्रिंग निकालना संभव है।
उदाहरण के लिए Process Explorer के गुण दृश्य 3 से अधिक वर्णों वाली सभी स्ट्रिंग प्रदर्शित करते हैं।एक exe या dll में तारों को कैसे छिपाना है?

#ifndef _WIN32_WINNT 
#define _WIN32_WINNT 0x0501 
#endif 
#include <stdio.h> 
#include <tchar.h> 
#include <Windows.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5"); 
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever"); 
    for (int i= 0; i<argc; i++) { 
     if (0 == _tcscmp(argv[i],hiddenString1)) { 
      _tprintf (_T("The guid argument is correct.\n")); } 
     else if (0 == _tcscmp(argv[i],hiddenString2)) { 
      _tprintf (_T("Do something here.\n")); } 
    } 

    _tprintf (_T("This is a visible string.\n")); 
    //Keep Running 
    Sleep(60000); 
    return 0; 
} 

तार स्पष्ट रूप से इसी निष्पादन से निकाला जा सकता:

यहाँ एक सरल निष्पादन का कोड है कि मैं बस यह परीक्षण करने के लिए लिखा है
alt text

मुझे लगता है कि यह है कि तारों को ढूंढना थोड़ा आसान है।

मेरे प्रश्न हैं:

  1. कैसे करें बस छिपाने hiddenString1 या निष्पादन में hiddenString2?
  2. क्या के साथ कुछ धोखेबाज छिपे हुए इनपुट के साथ "धोखा कोड" का उपयोग करने के लिए कोई और सुरक्षित सुरक्षित तरीका है?
+1

क्या यह प्रश्न GUID या सामान्य रूप से तारों के बारे में है? – xtofl

+0

GUID केवल एक उदाहरण था: http अनुरोधों के लिए यूआरएल हैं जिन्हें मैं भी छिपाना चाहता हूं। – Winz

+2

http अनुरोधों के लिए छिपाने वाले यूआरएल काम नहीं करेंगे। एक स्निफ़ेर वाला कोई भी व्यक्ति यह देखने में सक्षम होगा कि आपका ऐप क्या कर रहा है, और ऐसा करने से आपकी प्रक्रिया की याददाश्त की जांच करने से कहीं अधिक आसान होगा। –

उत्तर

26

रक्षात्मक प्रोग्रामिंग की व्यापक दुनिया में आपका स्वागत है।

कुछ विकल्प हैं, लेकिन मेरा मानना ​​है कि वे सभी कुछ प्रकार के अपवित्रता पर निर्भर करते हैं; जो, हालांकि सही नहीं है, कम से कम कुछ है।

  1. सीधे स्ट्रिंग मान के बजाय आप टेक्स्ट को किसी अन्य बाइनरी फॉर्म (हेक्स?) में स्टोर कर सकते हैं।

  2. आप अपने ऐप में संग्रहीत तारों को एन्क्रिप्ट कर सकते हैं, फिर उन्हें रन टाइम पर डिक्रिप्ट कर सकते हैं।

  3. आप उन्हें अपने कोड में विभिन्न बिंदुओं पर विभाजित कर सकते हैं, और बाद में पुनर्निर्माण कर सकते हैं।

या इसके कुछ संयोजन।

ध्यान रखें कि कुछ हमले वास्तविक बाइनरी को देखने से आगे जाते हैं। कभी-कभी वे चल रहे समय प्रोग्राम के मेमोरी एड्रेस स्पेस की जांच करेंगे। एमएस SecureString in .Net 2.0 नामक कुछ के साथ आया था। ऐप चल रहा है, जबकि तार एन्क्रिप्टेड स्ट्रिंग रखने का उद्देश्य है।

एक चौथा विचार ऐप में स्ट्रिंग को स्टोर नहीं करना है, बल्कि आपके द्वारा नियंत्रित सर्वर पर सबमिट करने के लिए एक सत्यापन कोड पर भरोसा करना है। सर्वर पर आप सत्यापित कर सकते हैं कि यह एक वैध "धोखा कोड" है या नहीं।

+2

अच्छा विकल्प। चूंकि प्रश्नकर्ता विशेष रूप से एक विंडोज GUID स्ट्रिंग को छिपाने के बारे में चिंतित है - जो केवल एक हेक्साडेसिमल संख्या है - डेटा को कुछ स्याही के रूप में भी संग्रहीत किया जा सकता है। –

+0

लिंक काम नहीं कर रहा – user956584

+1

@Userpassword: अद्यतन लिंक – NotMe

6

उन तरीकों के अलावा क्रिस का उल्लेख है कि आप एक हैशिंग एल्गोरिदम का भी उपयोग कर सकते हैं। यदि आप बस इतना करना चाहते हैं कि सही आईडी निर्दिष्ट की गई है तो आपको वास्तव में अपने कार्यक्रम में पूरी आईडी को स्टोर करने की आवश्यकता नहीं है।

  • स्ट्रिंग/पासवर्ड/आईडी आप के खिलाफ तुलना करने के लिए, हो सकता है यह करने के लिए एक 'नमक' मूल्य जोड़ने चाहते हैं के हैश (MD5, SHA, आदि) बनाएँ।इसे अपने प्रोग्राम में स्टोर करें
  • जब प्रोग्राम चलाया जाता है, इनपुट स्ट्रिंग/पासवर्ड/आईडी पर वही एल्गोरिदम करें और दो हैंश की तुलना करें कि वे मेल खाते हैं या नहीं।

इस तरह वास्तविक पाठ आपके प्रोग्राम में कभी भी संग्रहीत नहीं होता है और वे मूल प्रोग्राम क्या था क्योंकि हैश एल्गोरिदम केवल एक तरफ है, यह आपके प्रोग्राम को इंजीनियर नहीं कर सकता है।

+0

सावधान रहें, टकराव कुछ हैश (उदाहरण के लिए md5) के लिए इन दिनों अपेक्षाकृत आसान पाया जा सकता है .. –

+0

मुझे यकीन नहीं है कि इस उपयोग के लिए कोई समस्या है। –

+1

आप आगे जा सकते हैं, और केवल एक प्रकाश कुंजी एन्क्रिप्शन सौदे के सार्वजनिक कुंजी-केवल पक्ष कर सकते हैं। जो टकराव मुद्दे को संभालेगा। यह करने के लिए यह अधिक सुरक्षित तरीकों में से एक है - एन्क्रिप्शन एल्गोरिदम के रूप में सुरक्षित, हेक्स संपादक के माध्यम से खोले जाने के बाद भी। –

9

सबसे आसान तरीका उन्हें xor या rot-13 जैसे कुछ छोटे से एन्क्रिप्ट करना है, और फिर उन्हें उपयोग किए जाने पर फ्लाई पर डिक्रिप्ट करना है। इससे उन्हें अनौपचारिक रूप से देखने को खत्म कर दिया जाएगा, लेकिन यह किसी को भी उलटने पर ज्यादा अनुभव नहीं करेगा।

+6

कुछ भी वास्तव में किसी भी अनुभव को रोकने के लिए किसी भी अनुभव को रोक नहीं पाएगा;) – n3rd

+2

चूंकि उनके पास प्रोग्राम चलाने के लिए स्मृति में डिक्रिप्शन कुंजी होनी चाहिए, इसलिए एईएस उन्हें रोकने के लिए नहीं जा रहा है। –

2

यदि कोई विशिष्ट स्ट्रिंग है तो आप नहीं चाहते हैं कि लोग इसे देखने में सक्षम हों, फिर इसे एन्क्रिप्ट करें और रनटाइम पर डिक्रिप्ट करें।

आप लोगों को अपने GUID को देखने के लिए नहीं करना चाहते हैं, तो यह बाइट्स से निर्माण, एक स्ट्रिंग से निर्मित बजाय:

const GUID SecretGuid = 
     { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } }; 
2

अपने सभी गुप्त कोड GUIDs होगा या सिर्फ एक उदाहरण था?

शायद एक द्विआधारी GUID के रूप में अपने गुप्त की दुकान:

const GUID SecretGuid = 
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } }; 

फिर अपने आपूर्ति की दो द्विआधारी guids बाइनरी फ़ॉर्मेट में स्ट्रिंग से guid और तुलना परिवर्तित।

+0

GUID बस एक उदाहरण था। Http अनुरोधों के लिए यूआरएल हैं जिन्हें मैं भी छिपाना चाहता हूं। – Winz

+7

हर कोई जिसके पास आपके अतुल्य में तारों को देखने के लिए ज्ञान है, वह आपके ऐप से HTTP-Request के लिए एक स्नफ़फर शुरू करने और देखने में सक्षम होगा। असल में मैं तारों की तलाश करने से पहले पहले स्निफर का प्रयास करूंगा। –

16

निष्पादन योग्य में अस्पष्ट डेटा के कई तरीके हैं। यहां अन्य ने अच्छे समाधान पोस्ट किए हैं - कुछ दूसरों की तुलना में मजबूत हैं। मैं उस सूची में नहीं जोड़ूंगा।

बस इतना याद रखें: यह सब एक बिल्ली और चूहे खेल है: यह है असंभवगारंटी है कि कोई भी अपने "गुप्त" पता लगाना होगा।

कोई फर्क नहीं पड़ता कि आप कितनी एन्क्रिप्शन या अन्य चाल का उपयोग करते हैं; कोई फर्क नहीं पड़ता कि आप इसमें कितना प्रयास या धन डालते हैं। इससे कोई फर्क नहीं पड़ता कि कितने "नासा/एमआईटी/सीआईए/एनएसए" प्रकार छिपाने में शामिल हैं।

यह सब सरल भौतिकी के लिए नीचे आता है:
यदि यह किसी भी उपयोगकर्ता के लिए असंभव थे निष्पादन से अपने गुप्त बाहर निकालते हैं और "को सामने लाने" यह है, तो कंप्यूटर यह या तो सामने लाने के लिए सक्षम नहीं होगा, और आपका प्रोग्राम इसका उपयोग करने में सक्षम नहीं होगा। पर्याप्त प्रोत्साहन के साथ किसी भी मामूली कुशल डेवलपर को रहस्य को छिपाने का तरीका मिलेगा।

जिस क्षण आपने अपने निष्पादन योग्य को उपयोगकर्ता को सौंप दिया है, उनके पास रहस्य जानने के लिए आवश्यक सब कुछ है।

सबसे अच्छा आप के लिए आशा कर सकते हैं

यह इतनी मेहनत रहस्य नहीं है कि किसी भी लाभ आप गुप्त परेशानी के लायक नहीं बन जानने से प्राप्त कर सकते हैं उजागर करने के लिए बनाने के लिए है।

तो, डेटा को अस्पष्ट करने का प्रयास करना ठीक है अगर यह सार्वजनिक होने के लिए केवल "अच्छा नहीं" है, या यदि इसका परिणाम सार्वजनिक हो रहा है तो यह "असुविधाजनक" होगा। लेकिन अपने कार्यक्रम में छिपाने के बारे में भी सोचें "अपने मास्टर क्लाइंट डेटाबेस का पासवर्ड", एक निजी कुंजी, या कुछ अन्य महत्वपूर्ण रहस्य। आप बस नहीं कर सकते

यदि आपके पास वास्तव में गंभीर रूप से गोपनीय जानकारी है कि आपके प्रोग्राम को किसी भी तरह की आवश्यकता होगी लेकिन कभी भी सार्वजनिक जानकारी (निजी कुंजी की तरह) नहीं बननी चाहिए, तो आपको अपने प्रोग्राम के तहत रिमोट सर्वर से बात करने की आवश्यकता होगी, उचित प्रमाणीकरण लागू करें और प्राधिकरण नियंत्रण (है, यह सुनिश्चित करें कि केवल अनुमोदित लोग या कंप्यूटर सर्वर पर अनुरोध करने में सक्षम हैं), और वह सर्वर गुप्त रखे और इसका उपयोग करें।

+1

अच्छी तरह से कहा। और सच्चे पटाखे काफी भयानक हैं, आप उन्हें एक छोटी सी चाल से रोकने में सक्षम नहीं होंगे। वे उस हॉटस्पॉट को देखेंगे जहां आप वास्तविक चीज़ को देखने के लिए इसे डिक्रिप्ट करने के लिए एप्लिकेशन के लिए तारों और धैर्यपूर्वक खेलते हैं। – toto

2

सबसे अच्छा आप अपने पासवर्ड या अन्य स्ट्रिंग को कोड करना चाहते हैं जिसे आप चार सरणी के रूप में छिपाना चाहते हैं। उदाहरण के लिए:

std::string s1 = "Hello"; // This will show up in exe in hex editor 
char* s2 = "World"; // this will show up in exe in hex editor 
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor. 
+1

सी 'char s3 [] = {' जी ',' ओ ',' डी '} में इस सरल प्रोग्राम में; int n = sizeof (s3)/sizeof (s3 [0]); printf ("% d \ n", n); ', मुझे हेक्स संपादक के साथ पाठ मिल गया है -> '। $ $। $ $। $ डी $ डी। डी $ .' निष्पादन योग्य में। – Tuksn

5

http अनुरोध करता है कि मैं भी छिपाने के लिए चाहते हैं के लिए URL हैं।

यदि आपका ऐप अनुरोध कर रहा है, तो इसमें कोई छिपी बात नहीं है। फिडलर, http विश्लेषक, या दर्जनों अन्य मुफ्त और आसानी से उपलब्ध विधियों जैसे एक ऐप को चलाने से आपका ऐप बनने वाले सभी ट्रैफ़िक दिखाए जाएंगे।

+0

यह वास्तव में बुरा है। :( –

+0

@ZeeshanMahmood क्या हिस्सा है? – CaffGeek

+0

मतलब, हम कुछ अन्य तरीकों से कोड में यूआरएल छुपा नहीं सकते हैं, इन्हें प्रकट किया जा रहा है। –

संबंधित मुद्दे