2015-06-22 10 views
6

आज मैं एक obfuscated कक्षा (अच्छी तरह से एक जार में obfuscated कक्षाओं) में आया था और मुझे इस बात का कोई संकेत नहीं है कि इस तरह के obfuscation कैसे किया जाता है।जावा में obfuscation कैसे किया जाता है?

एक उदाहरण:

protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃) 
    throws Exception 
    { 
    int ☃ = ☃.readableBytes(); 
    if (☃ < this.c) 
    { 
     ☃.b(0); 
     ☃.writeBytes(☃); 
    } 
    else 
    { 
     byte[] ☃ = new byte[☃]; 
     ☃.readBytes(☃); 

     ☃.b(☃.length); 

     this.b.setInput(☃, 0, ☃); 
     this.b.finish(); 
     while (!this.b.finished()) 
     { 
     int ☃ = this.b.deflate(this.a); 
     ☃.writeBytes(this.a, 0, ☃); 
     } 
     this.b.reset(); 
    } 
    } 

} 

ऊपर दिखने के रूप में, सभी पैरामीटर चर एक बर्फ आदमी हैं। इसे पूर्ववत कैसे किया जा सकता है? यह भी पहली जगह में कैसे किया जाता है; JVM कैसे "प्रक्रिया" करने में सक्षम है और बिना किसी समस्या के कोड निष्पादित करता है?

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

+4

किसी अन्य यूनिकोड वर्ण की तरह एक यूनिकोड वर्ण है यही कारण है कि। आप इसकी अपेक्षा क्यों नहीं करेंगे? – SLaks

+0

वैसे मैं आपका बिंदु देखता हूं, मुझे पता है कि यह है और यह विशेष रूप से "\ u2603" है लेकिन मुझे नहीं पता कि यह कैसे किया जा सकता है, और पूर्ववत किया गया है ...: - धन्यवाद। –

+1

यह किसी भी अन्य चर नाम की तरह है। उदाहरण के लिए, आप एक चर 'x' नाम दे सकते हैं।यह सिर्फ एक चर है जिसका नाम '☃' है। कोई "पूर्ण" या "पूर्ववत" नहीं है, यह सिर्फ इतना है कि आप जो भी पात्र चाहते हैं उसके साथ एक वैरिएबल नाम लिख सकते हैं। –

उत्तर

10

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

आपके बारे में स्पिगॉट का उल्लेख करते हुए, स्पिगॉट वास्तव में खुला स्रोत है। हालांकि आप मूल रूप से मूल मोजांग माइनक्राफ्ट सर्वर से मूल रूप से एक वर्ग को अपनाने की संभावना रखते हैं, जो खुला स्रोत नहीं है और वास्तव में यह खराब है।

संपादित करें: मामले आप इन कक्षाओं की जाँच करना चाहते में, मैं हाल ही में एक उपकरण Bytecode व्यूअर कहा जाता है, जो उपलब्ध है https://github.com/Konloch/bytecode-viewer यह उपकरण में एकाधिक डीकम्पाइलर साथ ही कुछ विकल्पों में से संस्करण की तरह एक और अधिक बाईटकोड देखने पर है पाया कक्षा फाइल एक समारोह मैंने पाया का एक उदाहरण निम्नलिखित बाईटकोड डेटा शामिल हैं:

 <localVar:index=1 , name=☃ , desc=D, sig=null, start=L1, end=L2> 
    <localVar:index=3 , name=☃ , desc=D, sig=null, start=L1, end=L2> 
    <localVar:index=5 , name=☃ , desc=D, sig=null, start=L1, end=L2> 

दरअसल के रूप में दिखाई दे रहा है, यूनिकोड नाम ही स्थापित किया गया है, लेकिन यह अंत सूचकांकों में के रूप में कोई फर्क नहीं पड़ता (1,3 , 5) इन चरों को संदर्भित करने के लिए उपयोग किया जाता है।

+0

वास्तव में यह net.minecraft.server से है लेकिन पिछले obfuscation में बहुत ही लोकप्रिय था: - ( प्रदान किया गया संसाधन बिल्कुल मुझे चाहिए जो चाहिए! बहुत बहुत धन्यवाद !!! इसके अलावा क्या फ़ंक्शन वह था? अब तक मेरे पास कोड पढ़ने में कठोर समय है क्योंकि यह या तो यूनिकोड मान के रूप में उपरोक्त है या ऊपर दिखाया गया है लेकिन यह एक लिटल भ्रष्ट है: 3 धन्यवाद: -) –

+1

ओओफ़ मैंने इसे नीचे नहीं लिखा मुझे लगता है कि यह बायोम से शुरू होने वाली कक्षा का एक निर्माता था। ध्यान दें कि प्रोग्राम में व्यू/डिकंपेलर को व्यू के तहत बदलने के विकल्प हैं और फिर फलक 1-3। – user254948

+0

एक त्वरित रूप ले लिया। वह विशिष्ट वर्ग बायोमेबेसबेस था। आप फर्नफ्लॉवर को दूसरे फलक में पठनीय जावा कोड और बाइटकोड देखने की कोशिश कर सकते हैं। इसके अलावा कक्षा डीबग जानकारी से चर नामों को लेने का विकल्प भी है। – user254948

1
protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃) 

यह मान्य नहीं है। आपके पास एक ही नाम के साथ एकाधिक पैरामीटर नहीं हो सकते हैं। यह हो सकता है कि आप सही टेक्स्ट प्रारूप के साथ यूनिकोड टेक्स्ट नहीं पढ़ रहे हैं।

+1

आप वास्तव में इसे संकलित नहीं कर सकते हैं। हालांकि इसे बाइटकोड में अनुमति है। – user254948

+0

अच्छा बिंदु, और अच्छा उत्तर @ user254948 –

0

आपका टेक्स्ट एडिटर यूनिकोड चरित्र का मूल्य दिखा रहा है।

मैंने अभी ग्रहण पर परीक्षण किया है और यूनिकोड वर्णों के साथ नाम स्वीकार्य हैं।

public String publicationXmlUrl(int \u9090currentPage) { 

लेकिन मूल्यों के साथ नहीं लिख रहे हैं:

public String publicationXmlUrl(int ♥currentPage) { 
संबंधित मुद्दे