डेक्सपैचर: जावा का उपयोग करके एंड्रॉइड एपीके को पैच करें

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

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

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

अधिक गंभीरता से... आइए शुरुआत से शुरू करें। यदि आप एंड्रॉइड एप्लिकेशन को संशोधित करने से परिचित नहीं हैं, तो आप सोच रहे होंगे कि स्माली क्या है। एंड्रॉइड ऐप्स को कोड करने के लिए डेवलपर्स आमतौर पर जावा प्रोग्रामिंग भाषा का उपयोग करते हैं। एक प्रोग्राम (कंपाइलर) उस कोड को आपके डिवाइस के लिए उपयुक्त किसी अन्य प्रारूप में "अनुवाद" करता है, जिसके परिणामस्वरूप एप्लिकेशन पैकेज (या एपीके) के अंदर .dex फ़ाइलें समाहित हो जाती हैं।

उस समय, आप मूल स्रोत कोड तक नहीं पहुंच सकते (जब तक कि आप डेवलपर न हों या एप्लिकेशन खुला स्रोत न हो)। हालाँकि, आपके पास जो है वह एपीके है, क्योंकि यह वही है जो आपके डिवाइस पर इंस्टॉल है। इससे, आप डेक्स फ़ाइलें (आमतौर पर क्लासेस.डेक्स) प्राप्त कर सकते हैं और फिर इसे उस प्रारूप में अनुवाद करने का प्रयास कर सकते हैं जिसे आप समझ सकते हैं। यहीं पर स्माली अधिक पठनीय लेकिन विश्वसनीय अनुवाद के रूप में सामने आती है। आप एक कदम आगे बढ़ सकते हैं और इसे वापस जावा में अनुवाद कर सकते हैं, हालांकि यह प्रक्रिया पर्याप्त विश्वसनीय नहीं है - आपको एक मिलेगा समझने योग्य परिणाम, लेकिन संभावना है कि आप इसे दोबारा दूसरे तरीके से अनुवाद नहीं कर पाएंगे क्योंकि कुछ विवरण खो जाएंगे जिस तरह से साथ। दूसरे शब्दों में, आपके द्वारा किया गया कोई भी संशोधन व्यर्थ होगा क्योंकि आप इसे अपने डिवाइस पर इंस्टॉल करने के लिए दोबारा एपीके में नहीं बदल पाएंगे... कम से कम बिना बहुत प्रयास के तो नहीं।

स्माली/बक्समाली वास्तव में डेक्स प्रारूप के लिए एक असेंबलर/डिसेम्बलर है - आइसलैंडिक में इसका शाब्दिक अर्थ यही है। हालाँकि, जब हम 'स्माली' कहते हैं तो हम आम तौर पर उस प्रारूप का उल्लेख करते हैं जिसे स्माली समझता है (इसे निर्देश के रूप में सोचें)। हर छोटे विवरण को परिभाषित करना, भले ही यह हम मनुष्यों के लिए आवश्यक न हो - इसलिए यह उससे कहीं अधिक क्रियात्मक है जावा)। यह भी ध्यान दें कि उपरोक्त स्पष्टीकरण थोड़ा सरल है, लेकिन समझने में आसान होने के साथ-साथ एक करीबी सादृश्य होना चाहिए।

किसी ऐप को संशोधित करने के लिए (स्रोत तक पहुंच के बिना) डेवलपर को क्या करने की आवश्यकता होगी? यह प्रक्रिया कमोबेश इस प्रकार है:

  1. एपीके प्राप्त करें (वेब ​​से या डिवाइस से)।
  2. कुछ इस तरह प्रयोग करें एपीकेटूल एपीके को स्माली में विघटित करने के लिए। (एपीकेटूल स्माली/बक्समाली का उपयोग करता है, लेकिन एपीके को डिकंपाइल और पुनर्निर्माण करना बहुत आसान बनाता है, और एक्सएमएल फाइलों जैसे डिकोडिंग संसाधनों का भी ख्याल रखता है।)
  3. एपीके से क्लासेस.डेक्स निकालें, फिर उपयोग करें dex2jar और अंत में एक जावा डिकंपाइलर (अधूरा, अक्सर टूटा हुआ, लेकिन अधिकतर समझने योग्य) जावा कोड प्राप्त करने के लिए। (यह वैकल्पिक है, लेकिन सहायक हो सकता है क्योंकि स्माली को समझना अधिक कठिन है।)
  4. पहचानें कि क्या संशोधित करना है.
  5. दरअसल स्माली कोड को सीधे संपादित करके इसे संशोधित करें।
  6. वैकल्पिक रूप से, जावा में संशोधन लिखें, इसे संकलित करें, इसे फिर से स्माली में विघटित करें, फिर परिणामी स्माली कोड को कॉपी करें।
  7. एक बार जब सब कुछ ख़त्म हो जाए, तो उपयोग करें एपीकेटूल एपीके को फिर से बनाने के लिए।
  8. एपीके पर हस्ताक्षर करें (लेखक की पहचान सत्यापित करने के लिए; सभी पैकेजों पर हस्ताक्षर होना चाहिए) और अंत में इसे स्थापित करें।

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

XDA के वरिष्ठ सदस्य द्वारा डेक्सपैचर लैंचोन इसका उद्देश्य प्रक्रिया को सरल बनाकर और डेवलपर्स को स्माली से निपटने से पूरी तरह से बचने की अनुमति देकर इन मुद्दों को ठीक करना है। इसके बजाय, डेवलपर अकेले जावा में पैच लिख सकते हैं और डेक्सपैचर बाकी सब कुछ संभाल सकता है।

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

  • खुला स्त्रोत.
  • क्रॉस-प्लेटफ़ॉर्म: इसे लिनक्स, मैक और विंडोज़ पर चलना चाहिए।
  • पैच फ़ाइलें: आपके द्वारा किए गए संशोधन जावा पैच फ़ाइलों में समाहित होते हैं जिन्हें आप स्वतंत्र रूप से साझा कर सकते हैं।
  • जावा: यह स्माली नहीं है।

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

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

आइए एक उदाहरण देखें (लिनक्स पर):

डेक्सपैचर स्क्रिप्ट स्थापित करें

$# Make a directory where we can test stuff out and enter it. 

$ mkdir xda-test

$cd xda-test

$ git clone https://github.com/Lanchon/DexPatcher-scripts.git dexpatcher # Clone the DexPatcher helper scripts repo.

$cd dexpatcher

$ chmod +x dxp-* # Not necessary, but for clarity: we need to make sure the files we'll call later are executable.

डेक्सपैचर स्क्रिप्ट कॉन्फ़िगर करें

खुला dxp.config अपने पसंदीदा टेक्स्ट एडिटर में और अपने सिस्टम के अनुरूप आवश्यक वेरिएबल्स को बदलना सुनिश्चित करें। आपको अपने Android SDK के इंस्टॉलेशन स्थान को इंगित करने के लिए केवल निम्नलिखित पंक्ति को बदलने की आवश्यकता है:

dxp_android_sdk_dir=(~/android/sdk)

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

पहुंच में आसानी के लिए, हम इसे जोड़ सकते हैं dexpatcher हमारे लिए निर्देशिका पथ, या यहां तक ​​कि अलग-अलग सिम्लिंक भी करें डीएक्सपी-* उस स्थान की स्क्रिप्ट जो पहले से ही आपके पास है पथ, जैसे कि ~/बिन:

export PATH=$PWD:$PATH

किसी एप्लिकेशन को संशोधित करें

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

हम बेसिल2स्टाइल द्वारा "आईडी प्राप्त करें" एप्लिकेशन लेंगे, एक एप्लिकेशन जो आपको आपके डिवाइस के बारे में कुछ विवरण दिखाता है। हमारा लक्ष्य "डिवाइस आईडी" के लिए "कॉपी" बटन को संशोधित करना है और इसके बजाय इस आईडी को साझा करना है:

  • सबसे पहले, आइए उस एपीके को डाउनलोड करें जिसे हम संशोधित करने जा रहे हैं: आईडी प्राप्त करें.
  • एप्लिकेशन को डिकंपाइल करें.
  • हस्ताक्षर कुंजी बनाएं जिसका उपयोग हम बाद में एपीके पर हस्ताक्षर करने के लिए करेंगे।

हम यह सब सहायक स्क्रिप्ट का उपयोग करके शेल के माध्यम से भी कर सकते हैं:

$cd dexpatcher # Go to our working directory. 

$ curl -O https://f-droid.org/repo/makeinfo.com.getid_1.apk # Download the APK.

$ dxp-setup-for-apk makeinfo.com.getid_1.apk # Unpack and decompile the APK.

$cd makeinfo.com.getid_1 # Go to the newly created directory where everything is unpacked/decompiled to.

$ dxp-create-keystore # Create the APK signing key. Press 6 times (or fill out the info), then "yes".

आपको वहां कुछ भिन्न निर्देशिकाएँ दिखाई देंगी:

  • गूढ़वाचन करना: आपको यहां संसाधन और स्माली मिलेंगे, जैसा कि डिकोड किया गया है एपीकेटूल.
  • स्रोत: खाली निर्देशिका. यहीं पर हम अपनी पैच फ़ाइलें रखेंगे।
  • स्रोत-सीएफआर: यहीं पर सीएफआर ऐप को डीकंपाइल किया गया (त्रुटियों के साथ)। यह देखने के लिए एक अच्छी जगह है कि क्या बदलना है (आपको उपरोक्त डिकोड निर्देशिका से संसाधनों और उनकी आईडी की भी आवश्यकता हो सकती है, लेकिन इस विशेष उदाहरण के लिए नहीं)।
  • src-cfr-नोडकोड: उपरोक्त के समान, लेकिन इसमें केवल खाली स्टब्स हैं (कोई कोड नहीं, केवल कंकाल)। जैसा कि हम थोड़ा आगे देखेंगे, आप इन फ़ाइलों को अपने पैच के आधार के रूप में उपयोग कर सकते हैं।

जैसा कि हमने पहले बताया है, हम आईडी टेक्स्ट को साझा करने के लिए डिवाइस आईडी "कॉपी" बटन को बदलना चाहते हैं। यदि हम स्रोत कोड के चारों ओर देखते हैं, तो हम देखेंगे कि डिवाइस आईडी कॉपी बटन (डिवाइस_कॉपी) क्लिक पर ईवेंट को अज्ञात वर्ग द्वारा प्रबंधित किया जाता है src-cfr/makeinfo/com/getid/MainActivity.java. हालाँकि हम इसे यहां संशोधित कर सकते हैं, आमतौर पर इसे करने का वैकल्पिक तरीका ढूंढना बेहतर होता है क्योंकि अज्ञात कक्षाओं में संख्यात्मक नाम होते हैं (मुख्यवर्गनाम$कुछनंबर, उदा. मुख्य गतिविधि$3) जो संस्करणों के बीच अप्रत्याशित रूप से बदल सकता है।

इसके बजाय, हम संशोधित करके ईवेंट के लिए अपनी स्वयं की कक्षा पंजीकृत करेंगे मुख्य गतिविधि कक्षा। सबसे पहले, आइए "कंकाल" संस्करण की प्रतिलिपि बनाएँ src-cfr-nocode/makeinfo/com/getid/MainActivity.java को src/makeinfo/com/getid/MainActivity.java (उसे याद रखो स्रोत यहीं पर हमारा पैच रहेगा)। (यदि आप चाहें तो पूर्ण कोड के साथ संस्करण की प्रतिलिपि भी बना सकते हैं, यह पूरी तरह से स्वाद का मामला है।)

अब हम इसे इस प्रकार संपादित कर सकते हैं:

  • DexPatcher एनोटेशन के लिए आवश्यक आयात जोड़ें:
importlanchon.dexpatcher.annotation.*;
  • यह इंगित करने के लिए एक टैग जोड़ें कि हम कक्षा का संपादन कर रहे हैं। हम पैच क्लास के सदस्यों के लिए डिफ़ॉल्ट कार्रवाई भी सेट करते हैं अनदेखा करना, जिसका अर्थ है कि जावा संकलन के दौरान सदस्यों को हमारे कोड द्वारा संदर्भित किया जाएगा, लेकिन डेक्सपैचर द्वारा उन्हें अनदेखा कर दिया जाएगा।
@DexEdit(defaultAction=DexAction.IGNORE)

publicclassMainActivity

// The reference to ActionBarActivity will be satisfied by symbols

// extracted from the app when we build the patch.

extendsActionBarActivity{

  • इसके अतिरिक्त, कंस्ट्रक्टर में खाली बॉडी जोड़ें और oncreate विधि, साथ ही अन्य सभी विधियाँ जिनका हम उपयोग करने की योजना बना रहे हैं (याद रखें कि जब हमारा पैच वास्तव में लागू होगा तो उन्हें अनदेखा कर दिया जाएगा - हम उन्हें केवल इसलिए जोड़ रहे हैं ताकि जरूरत पड़ने पर हम उन्हें यहां संदर्भित कर सकें)। आप बस यह भी जोड़ सकते हैं देशी इसके बजाय कीवर्ड।
  • यदि आप उत्सुक हैं तो हम इस बिंदु पर पहले से ही पैच बना सकते हैं:
    $ dxp-make # Output: `patched.apk`.
    बहुत सरल, है ना? हालाँकि, चलो चलते रहें - हमने अभी भी काम पूरा नहीं किया है।
  • आइए संपादित करें oncreate अब खुद को स्थापित करने के लिए ऑनक्लिक श्रोता ताकि हम डिवाइस आईडी को क्लिपबोर्ड पर कॉपी करने के बजाय साझा कर सकें:
    // Rename the target method so that we can still call it (the original)// if needed.@DexEdit(target="onCreate")protectedvoidsource_onCreate(Bundlevar1){}// Add our new custom method.@Override@DexAddprotectedvoidonCreate(Bundlevar1){// Call the original method:source_onCreate(var1);// Replace the text and handler:device_copy.setText("Share");device_copy.setOnClickListener(newDeviceCopyOnClick());}// Note that we don't use an anonymous class to avoid nameclashing with// MainActivity$1, which already exists.// We also could've defined a nested MainActivity.Patch class and used// an anonymous class in MainActivity.Patch.onCreate(), and then called// MainActivity.Patch.onCreate() from MainActivity.onCreate().@DexAddclassDeviceCopyOnClickimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewobject){if(MainActivity.this.val){Intentintent=newIntent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT,"Device ID");intent.putExtra(Intent.EXTRA_TEXT,device.getText().toString());startActivity(Intent.createChooser(intent,"Share Device ID"));}else{Toast.makeText(MainActivity.this.getApplicationContext(),"Nothing to Share",0).show();}}}
  • ऐसा लगता है कि अब हमारा काम हो गया! पूरा पैच जैसा दिखना चाहिए यह. अब हम पैच किए गए एपीके का निर्माण कर सकते हैं और इसे इंस्टॉल कर सकते हैं:
    $ dxp-make$ adb install patched.apk
  • आइए एक नजर डालते हैं नतीजे पर:

(नमूना कोड में मदद के लिए लैंचन को धन्यवाद!)

एक्सपोज़ड बेहद लोकप्रिय है, और एक अच्छे कारण से - यह डेवलपर्स और उपयोगकर्ताओं के लिए मॉड बनाने, साझा करने और स्थापित करने को बहुत आसान बनाता है। डेक्सपैचर और एक्सपोज़ड के बीच कुछ अंतर हैं जो कुछ लोगों को एक दूसरे की तुलना में अधिक पसंद करने पर मजबूर कर सकते हैं:

  1. एक्सपोज़ड रनटाइम पर तरीकों को हुक करके और डेवलपर्स को किसी भी विधि से पहले, बाद में या इसके बजाय कुछ करने की अनुमति देकर अपना जादू करता है। दूसरी ओर, डेक्सपैचर रनटाइम से पहले सब कुछ संशोधित करता है और एक स्टैंडअलोन, संशोधित एपीके तैयार करता है - विधियों के पहले, बाद में या बजाय कोड चलाना अभी भी संभव है, और आपके पास वास्तव में कुछ अतिरिक्त है स्वतंत्रता।
  2. एक स्टैंडअलोन एपीके बनाने का मतलब है कि यह किसी बाहरी ढांचे पर निर्भर नहीं है। इसका मतलब यह भी है कि उपयोगकर्ता ऐप्स को संशोधित करने के लिए रूट की आवश्यकता नहीं है।
  3. चूंकि आपने DexPatcher के साथ एक नया एपीके बनाया है, इसलिए इस पर अलग तरीके से हस्ताक्षर किए जाएंगे। इसका मतलब यह है कि उपयोगकर्ता मूल लेखक से आधिकारिक अपडेट प्राप्त नहीं कर सकते हैं, और यदि हस्ताक्षर की जांच की जाती है तो Google Apps जैसे ऐप्स के साथ कुछ समस्याएं हो सकती हैं।
  4. दोनों मॉड्यूल और डेक्सपैचर पैच के स्रोत कोड को आसानी से वितरित और संशोधित किया जा सकता है। यदि आप प्रत्येक से थोड़ा परिचित हो जाएं तो उनमें कई समानताएं भी हैं।

हमने डेक्सपैचर के बारे में काफी बात की है। अब इसे आज़माने की आपकी बारी है, इसलिए आगे बढ़ें डेक्सपैचर फोरम थ्रेड तुरंत आरंभ करने के लिए!