2012-10-27 10 views
16

संभव डुप्लिकेट:
hiding strings in Obfuscated codeकहानियो: जावा में हार्डकोडेड मूल्यों को छिपाने

मैं यह मुश्किल डिकंपाइल करने के लिए बनाने के लिए एक छोटे से आदेश में अपने एप्लिकेशन में से कुछ स्थिर स्ट्रिंग्स को छिपाने के लिए कोशिश कर रहा हूँ , इस तरह से सिफर एल्गोरिदम नामों जैसे स्थिरांक obfuscated कोड में खोजने के लिए कठिन हैं।

मैं जैसी चीजों पर विचार किया है:

String CONCAT= "concat"+"string"; 
String RAW_STRING= "raw_string"; 
String FROM_BYTES=new String("from_bytes".getBytes()); 
String FROM_CHARS=new String(new char[]{'f','r','o','m','_','c','h','a','r','s'}); 
String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50}); 

और पिछले दो विकल्प "गहरा" कच्चे विकल्प से हो रहा है, लेकिन मुझे लगता है वहाँ ऐसा करने के लिए बेहतर तरीके हैं।

मैं इसे कैसे सुधार सकता हूं? धन्यवाद

+1

मैंने कभी एंड्रॉइड के लिए प्रोग्राम नहीं किया है, हालांकि मैं इस सवाल का बिंदु नहीं देख सकता। यदि उपयोगकर्ता को डिकंपाइल करने का तरीका नहीं पता है, तो नोटपैड के माध्यम से कोड को पढ़ने में सक्षम है, तो आप केवल कुछ अप्रयुक्त एल्गोरिदम नाम डालते हैं, और वह नहीं जानता कि कौन सा वास्तव में शामिल है। यदि वह जानता है कि कैसे डिकंपाइल करना है, तो वहां कोई obfuscation नहीं है जो लाइब्रेरी कॉल को बदलने से एस/उसे रोक सकता है (मुझे लगता है कि आप एक सिस्टम के साथ सिफर को तत्काल करने के लिए एक प्रसिद्ध विधि नाम के साथ एक प्रसिद्ध पुस्तकालय का उपयोग करते हैं)। out.println। – ignis

+0

मैं सरल ग्रेडल फ़ंक्शन का उपयोग करके इस तरह के तारों को छुपा रहा हूं। यह केवल नग्न आंख से बचाता है, लेकिन किसी भी मामले में, यह कुछ भी नहीं है: https://gist.github.com/shomeser/68f4fe360be0edac95e4 –

उत्तर

9

एक के लिए, आप न सिर्फ

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50}); 

ऐसा नहीं है कि चार सरणी वास्तव में एक स्ट्रिंग है एक मरे हुए लेन-दूर है लिखना चाहिए।

आप निम्नलिखित का एक संयोजन कर सकते हैं:

  1. किसी पूर्णांक [] सरणी में अपने "स्ट्रिंग" डाल
  2. या और भी बेहतर,
  3. calculate कई पूर्णांक सरणियों में अपने स्ट्रिंग को तोड़ने/हेरफेर एप्लिकेशन के विभिन्न चरणों में सरणी के मूल्य, इसलिए इसका मान केवल रनटाइम के दौरान एक निश्चित अंतराल पर मान्य हो जाएगा, यह गारंटी देता है कि यह आपके कोड
  4. को संकुचित करके एक उत्सुक नज़र में नहीं समझा जाएगा, सरणी को पास करता है पीछे और आगे, स्थानीय चर के माध्यम से, बीएसी उदाहरण चर, आदि के लिए k अंत में एक सारिणी को सरणियों परिवर्तित स्ट्रिंग निर्माता को पास करने की पहले
  5. तुरंत उपयोग के बाद शून्य पर, बस समय की राशि वास्तविक स्ट्रिंग क्रम
  6. पर मौजूद कम करने के लिए स्ट्रिंग सेट
+0

# 3 के लिए कोई पैटर्न या उदाहरण कोड? # 5 कैसे मदद करता है? – Nicholas

+0

# 5 मदद करता है क्योंकि अगर कोई आपके कोड को विघटित कर सकता है, तो इसका मतलब है कि वे इसे भी चला सकते हैं, स्थानों में डीबगर झंडे डाल सकते हैं आदि। इसलिए आपको रनटाइम निरीक्षणों के खिलाफ भी रक्षा करनी चाहिए। इसका मतलब है कि आपका वास्तविक स्ट्रिंग मौजूद समय कम है, सुरक्षित यह आंखों से सुरक्षित है। – Kai

+0

# 3 के लिए, मैं इसे दूर नहीं चला हूं, लेकिन आप इसे [यह] (http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/658ab629-e603-4e6f- 985c-2bb8c1669b27 /) _or_ कुछ [jzlib] (http://www.jcraft.com/jzlib/) जैसे कुछ स्ट्रिंग्स को बाइट एरे में "ज़िप" करने के लिए उपयोग करें, और आवश्यकता होने पर उन्हें अनजिप करें। एंड्रॉइड के ज़िप लिब का उपयोग न करें क्योंकि इसके विधि के नामों को खराब नहीं किया जा सकता है, जिससे पूरे उद्यम को काफी स्पष्ट बना दिया जा सकता है। – Kai

2

मैं algo

तरह
class ... 
    String CONCAT; 

    static { 
    CONCAT = uncrypt ("ahgsdhagcf"); 
    } 

जहां uncrypt वास्तव में एक अच्छा unencryption algo या कुछ हद तक कमजोर एक बेस 64 डिकोड हो सकता है एक डिक्रिप्शन का उपयोग कर स्थिर (वर्ग) प्रारंभकर्ता में मान सेट करना पसंद करेंगे ।

किसी भी मामले में आपको अपनी स्ट्रिंग को एन्कोड करने के लिए एक सरल प्रोग्राम की आवश्यकता है।

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