2010-01-23 16 views
14

कोड को जल्दी से कैसे रोकें। मेरे पास बहुत छोटा जावा ऐप है और मैं अपने क्लाइंट को obfuscated कोड वितरित करना चाहता हूं। मैंने कोड को obfuscate करने के लिए ProGuard के बारे में बहुत कुछ सुना है और इसे डाउनलोड किया है लेकिन मुझे नहीं पता कि मेरी "abc.jar" फ़ाइल को कैसे रोकना है।जावा कोड को तुरंत कैसे खराब करें?

मैंने अपनी वेबसाइट की जांच की लेकिन इसमें पढ़ने के लिए बहुत सारी सामग्री शामिल है। मुझे भारी obfuscation की जरूरत नहीं है। मुझे बस एक अपवित्रता की आवश्यकता है जो कुछ अपठनीय लोगों को चर, विधियों और वर्गों का नाम बदल देता है। मुझे पता है ProGuard यह सब कुछ अन्य कार्यक्षमताओं के टन के साथ भी प्रदान करते हैं।

प्रश्न 1। तो क्या कोई मुझे बता सकता है कि कृपया कुछ सरल obfuscators या प्रोजेवार्ड का उपयोग करने के लिए कुछ आसान कदम है ताकि मैं सिर्फ "abc.jar" इनपुट कर सकूं और यह "obfuscate_abc.jar" या कुछ ऐसा आसान आउटपुट कर सके।

प्रश्न 2। एक और बात, क्योंकि मेरा जावा प्रोग्राम बाहरी पुस्तकालयों का उपयोग करता है, इसलिए मुझे उन पुस्तकालयों को भी खराब करने की आवश्यकता है?

क्यू 3। क्या कोई ग्रहण या नेटबीन प्लगइन इस obfuscation के लिए availabe है?

मैंने यह भी सुना है कि हमें हमारे साथ मैपिंग टेबल फ़ाइल को बनाए रखना चाहिए ताकि भविष्य में हम उस मैपिंग-टेबल की मदद से पहले डी-ओबस्कसटिंग द्वारा उस obfuscated कोड को डीबग या संपादित कर सकें जो उस समय बनाया गया था कहानियो।

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

+2

यह भी याद रखें कि यदि आप नाम से प्रतिबिंब और/या लोडिंग का उपयोग करें, obfuscation आपके प्रोग्राम को तोड़ने जा रहा है। –

+9

क्रिस्टोफर ने कहा, एक मैनुअल है, हम नहीं कर सकते (और यह आपके लिए नहीं पढ़ेगा) –

+1

http://proguard.sourceforge.net/manual/examples.html पर ठीक पूर्ण उदाहरणों पर नज़र डालें और उसके बाद किसी भी विशिष्ट समस्या के बारे में एक प्रश्न पूछें जिसके साथ आपको परेशानी है? – Pool

उत्तर

31

प्रश्न 1। तो क्या कोई मुझे बता सकता है कि कृपया कुछ सरल obfuscators या प्रोजेवार्ड का उपयोग करने के लिए कुछ आसान कदम है ताकि मैं सिर्फ "abc.jar" इनपुट कर सकूं और यह "obfuscate_abc.jar" या कुछ ऐसा आसान आउटपुट कर सके।

बस ProGuard के लिए जाते हैं, यह निश्चित रूप से एक अच्छा उपकरण है (this one, this one और this one एसओ की तरह पर यहाँ कई जवाब में अनुशंसित)।

प्रश्न 2। एक और बात, क्योंकि मेरा जावा प्रोग्राम बाहरी पुस्तकालयों का उपयोग करता है, इसलिए मुझे उन पुस्तकालयों को भी खराब करने की ज़रूरत है?

आईएमएचओ की आवश्यकता नहीं है (यह भी उल्लेख नहीं है कि आप नहीं कर सकते हैं)।

क्यू 3। क्या इस ग्रहण के लिए कोई ग्रहण या नेटबीन प्लगइन उपलब्ध है?

मैं Ant Task या proguard-maven-plugin का उपयोग करने का सुझाव देना चाहता हूं। यदि आवश्यक हो तो मेवेन प्लगइन के बारे में this question देखें।

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

हां, स्टैकट्रस "अनुवाद" करने के लिए।

+4

माइनर वर्तनी की गलती है, लेकिन 'ProGard' मुझे बर्बाद कर मैं नहीं जानता कि कब तक बंदूक रैक को देखकर किया था। आपका जवाब भी Ritalin के लिए एक पर्चे के साथ आ सकता है। – Gary

4

आप केवल मामले में अन्य पुस्तकालयों जहां उन्हें बचाने के लिए जो कुछ भी के खिलाफ आपको लगता है कहानियो को अपने कोड के लिए क्या कर रहा है की जरूरत है अंधेरा करना की जरूरत है। हालांकि आपको उन अन्य पुस्तकालयों के लिए लाइसेंस पढ़ना चाहिए ताकि यह देखने के लिए कि वे आपको संशोधित संस्करणों को वितरित करने से प्रतिबंधित करते हैं या नहीं।

+1

+1 उन पुस्तकालयों में से उन लोगों के लाइसेंस की जांच करने के लिए मुझे सलाह देने के लिए। –

1
Q4 के बारे में

: मानचित्रण जब उन आप बग रिपोर्ट है कि समझ से परे कोड से अपवाद stacktraces शामिल भेज प्रयोग किया जाता है। यदि आपके पास मैपिंग है तो ProGuard आपको इन स्टैकट्रैस को मूल श्रेणी के नामों और लाइन नंबरों पर वापस अनुवाद करने की अनुमति देता है।

1

बस का जवाब दे Q4 ...

मानचित्रण रखने के लिए एक अच्छा कारण नहीं है। यदि ग्राहक कभी आपको एक स्टैकट्रैक भेजता है, तो यह जानना बहुत उपयोगी हो सकता है कि उस कोड में जहां स्टैकट्रैक आया था। एक obfuscator का उद्देश्य उस जानकारी से छुटकारा पाने के लिए है ;-) मानचित्रण को रखकर, आप स्टैकट्रैक के रूपांतरण को सक्षम करते हैं जहां मूल कोड में समस्या आई थी।

+0

+1 आपके उत्तर के लिए ... –

1

मैं प्रश्न 4 का उत्तर दे सकता हूं। आपको इसे डिबगिंग के लिए बनाए रखना चाहिए। मान लें कि स्टैक ट्रेस को obfuscating के बाद, लाइन 23 पर "printTheAlphabet()" फ़ंक्शन में एक बग है, "लाइन 27 पर j6z9r() में त्रुटि" कुछ ऐसा कह सकता है जो आपके स्रोत कोड में त्रुटि का पता लगाने में काफी असंभव बनाता है।

12

मैंने इसे स्क्रैच से करने की कोशिश की। यह आपको शुरू करना चाहिए। मुझे लगता है कि कुंजी कॉन्फ़िगरेशन फ़ाइल में "विकल्प रखें" को समझना होगा।

इस कोड का उपयोग करना:

import java.util.*; 

public class Example { 

    public static void main(String... args) { 
     Example ex = new Example(); 
     ex.go(); 
    } 

    public void go() { 
     String[] strings = { "abc", "def", "ijk" }; 
     for (String s : strings) { 
      System.out.println(s); 
     } 
    } 

} 

मैं एक Example.jar बनाया। मैं ProGuard lib निर्देशिका से proguard.jar की नकल की है, और इस कमांड लाइन

java -jar proguard.jar @myconfig.pro 

जहां myconfig.pro शामिल भागा:

-injars Example.jar 
-outjars ExampleOut.jar 
-libraryjars <java.home>/lib/rt.jar 

-keep public class Example { 
    public static void main(java.lang.String[]); 
} 

यह ExampleOut.jar पैदा करता है जो एक ही कार्यक्षमता शामिल हैं और है obfuscated (जेएडी के साथ सत्यापित)। ध्यान दें कि मैंने एक मैनिफेस्ट का उपयोग नहीं किया है, इसलिए कार्यक्षमता का परीक्षण करने के लिए, मैंने कक्षा को परेशान और परीक्षण किया। जार के भीतर निष्पादन प्रविष्टि-बिंदु पाठक को छोड़ दिया जाता है।

कई और अधिक रखने के in the Usage section सूचीबद्ध विकल्पों रहे हैं।

+0

यह दिखा रहा है कि चेतावनी: स्क्रैपर.माइन: संदर्भित क्लास com.gargoylesoftware.htmlunit.html नहीं मिल सकता है। HTMLTableCell का मतलब है कि यह com.garg नहीं मिल सकता है ... lib लेकिन यह वहां है एक ही फ़ोल्डर क्या मुझे .pro फ़ाइल में बाहरी पुस्तकालयों का भी उल्लेख करना चाहिए –

0

मैंने yGuard पर एक त्वरित नज़र डाली है और इस तथ्य को पसंद किया है कि आप एंटी स्क्रिप्ट में obfuscation चरणों को एकीकृत कर सकते हैं। यदि आप चाहें तो ग्रहण आदि में यह आपको बहुत आसानी से उपयोग करने की अनुमति देता है।

प्रलेखन यह तैयार चींटी स्क्रिप्ट आरंभ करने के लिए के एक नंबर प्रदान करते हैं के साथ आता है। इन्हें बस अपने प्रोजेक्ट लेआउट के साथ काम करने के लिए संशोधित करने की आवश्यकता है, यानी सही पैकेज नाम आदि सेट करना

यदि आप एंटिस में चींटी को कैसे प्राप्त करने के बारे में स्पष्ट नहीं हैं, तो आपको बस build.xml फ़ाइल जोड़ने की आवश्यकता है परियोजना के लिए, उदाहरण के लिए स्क्रिप्ट है कि यह में yGuard के साथ आता है नकल, अपनी परियोजना के साथ काम करते हैं और चींटी देखने से yGuard कार्य चलाने के लिए स्क्रिप्ट को संशोधित।

के साथ अपने मानचित्रण तालिका प्रश्न के संबंध

। एकमात्र कारण मुझे लगता है कि कर सकते हैं कुछ इस तरह की जरूरत हो सकती है, तो आप एक बग अपने समझ से परे जार प्रदर्शन को दोहराने नहीं कर सकते हैं, अपने मूल कोड से होगा। इस बिंदु पर आप यह निर्धारित करने अगर कहानियो को एक समस्या का कारण है, हो सकता है सुलझा संस्करण के साथ काम करने की जरूरत हो सकती है।

1

कैसे जल्दी से & गंदा कोड अंधेरा करना: यह http://www.daftlogic.com/projects-online-javascript-obfuscator.htm या:

कोशिश करो http://javascriptobfuscator.com/default.aspx या गूगल "जावास्क्रिप्ट अस्पष्टकर्ता ऑनलाइन"।

मैं इसे जावास्क्रिप्ट के लिए है, लेकिन आप जावा के लिए एक जावास्क्रिप्ट eval (पर एक नजर है: https://stackoverflow.com/a/2605051/450148) का उपयोग कर समारोह परिणाम प्राप्त कर सकते हैं

यह सबसे अच्छा aprouch नहीं है, लेकिन यह अगर उपयोगी हो सकता है आप वास्तव में जल्दी में हैं और आप सुरक्षा के बारे में एक पागल नहीं हैं।

संपादित करें: कोड के अगले टुकड़े सरल ROT13 का उपयोग करता है सीधे अपने पासवर्ड का खुलासा नहीं करने के लिए। अच्छी बात "हैकर" है जो एल्गोरिथ्म का उपयोग कर रहे हैं (आप ROT13 जगह ले सकता है जो एल्गोरिथ्म आप की तरह के लिए), लेकिन यह अभी भी बहुत आसान इसे नीचे तोड़ने के लिए है पता नहीं है:

static String password; 

static { 
    password = a("NXVNWQX5CHXRWTKGDMHD"); 
} 

private static String a(String b) { 
    String c = "eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c])}}return p}('k a(b){2 5=\\'\\';o(2 i=0;i<b.e;i++){2 c=b.g(i);2 1=b.f(i);4(c>=\\'a\\'&&c<=\\'m\\')1+=3;6 4(c>=\\'n\\'&&c<=\\'9\\')1-=3;6 4(c>=\\'7\\'&&c<=\\'h\\')1+=3;6 4(c>=\\'7\\'&&c<=\\'p\\')1-=3;2 d=8.l(1);5+=d}j 5}',26,26,'|charcode|var|13|if|sb|else|A|String|z|||||length|charCodeAt|charAt|M||return|function|fromCharCode|||for|Z'.split('|'),0,{}));"; 

    ScriptEngineManager manager = new ScriptEngineManager(); 
    ScriptEngine engine = manager.getEngineByName("js"); 
    Object z = ""; 

    //noinspection EmptyCatchBlock 
    try { 
     z = engine.eval(c + " a('" + b + "');"); 
    } catch (ScriptException e) {} 

    return z.toString(); 
} 
संबंधित मुद्दे