Πώς να ανοίξετε το APK και πώς να το επεξεργαστείτε; Χρήση του apktool Ένα πρόγραμμα για την αποσυναρμολόγηση και τη συναρμολόγηση ενός αρχείου apk

Μερικές φορές ορισμένες εφαρμογές στο Android δεν ταιριάζουν με κάποιο τρόπο στον χρήστη. Ένα παράδειγμα είναι η παρεμβατική διαφήμιση. Και συμβαίνει επίσης το πρόγραμμα να είναι καλό για όλους, αλλά η μετάφραση σε αυτό είτε είναι στραβή είτε απουσιάζει εντελώς. Ή, για παράδειγμα, το πρόγραμμα είναι δοκιμαστικό, αλλά δεν υπάρχει τρόπος να αποκτήσετε την πλήρη έκδοση. Πώς να αλλάξετε την κατάσταση;

Εισαγωγή

Σε αυτό το άρθρο θα μιλήσουμε για το πώς να αποσυναρμολογήσουμε ένα πακέτο APK με μια εφαρμογή, να δούμε την εσωτερική του δομή, να αποσυναρμολογήσουμε και να απομεταγλωττίσουμε τον bytecode και επίσης να προσπαθήσουμε να κάνουμε αρκετές αλλαγές στις εφαρμογές που μπορούν να μας φέρουν το ένα ή το άλλο όφελος.

Για να τα κάνετε όλα αυτά μόνοι σας, θα χρειαστείτε τουλάχιστον βασικές γνώσεις της γλώσσας Java, στην οποία είναι γραμμένες οι εφαρμογές Android, και της γλώσσας XML, που χρησιμοποιείται παντού στο Android - από την περιγραφή της ίδιας της εφαρμογής και των δικαιωμάτων πρόσβασής της μέχρι την αποθήκευση συμβολοσειρών που θα εμφανιστεί στην οθόνη. Θα χρειαστείτε επίσης τη δυνατότητα χρήσης εξειδικευμένου λογισμικού κονσόλας.

Λοιπόν, τι είναι ένα πακέτο APK στο οποίο διανέμεται απολύτως όλο το λογισμικό Android;

Αποσυμπίεση εφαρμογής

Σε αυτό το άρθρο, δουλέψαμε μόνο με αποσυναρμολογημένο κώδικα εφαρμογής, αλλά αν γίνουν πιο σοβαρές αλλαγές σε μεγάλες εφαρμογές, η κατανόηση του κώδικα smali θα είναι πολύ πιο δύσκολη. Ευτυχώς, μπορούμε να απομεταγλωττίσουμε τον κώδικα dex σε κώδικα Java, ο οποίος, αν και δεν είναι πρωτότυπος και δεν έχει μεταγλωττιστεί ξανά, είναι πολύ πιο εύκολο να διαβαστεί και να κατανοηθεί η λογική της εφαρμογής. Για να το κάνουμε αυτό, θα χρειαστούμε δύο εργαλεία:

  • Το dex2jar είναι ένας μεταφραστής του bytecode Dalvik σε bytecode JVM, βάσει του οποίου μπορούμε να λάβουμε κώδικα στη γλώσσα Java.
  • Το jd-gui είναι ένας ίδιος ο απομεταγλωττιστής που σας επιτρέπει να λαμβάνετε αναγνώσιμο κώδικα Java από τον bytecode JVM. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το Jad (www.varaneckas.com/jad). Αν και είναι αρκετά παλιό, σε ορισμένες περιπτώσεις δημιουργεί πιο ευανάγνωστο κώδικα από το Jd-gui.

Έτσι πρέπει να χρησιμοποιούνται. Αρχικά, εκκινούμε το dex2jar, καθορίζοντας τη διαδρομή προς το πακέτο apk ως όρισμα:

% dex2jar.sh mail.apk

Ως αποτέλεσμα, το πακέτο Java mail.jar θα εμφανιστεί στον τρέχοντα κατάλογο, ο οποίος μπορεί ήδη να ανοίξει στο jd-gui για να προβάλετε τον κώδικα Java.

Τακτοποίηση πακέτων APK και λήψη τους

Ένα πακέτο εφαρμογών Android είναι ουσιαστικά ένα κανονικό αρχείο ZIP που δεν απαιτεί ειδικά εργαλεία για την προβολή του περιεχομένου του ή την εξαγωγή του. Αρκεί να έχετε έναν αρχειοθέτη - 7zip για Windows ή αποσυμπίεση κονσόλας στο Linux. Αλλά πρόκειται για το περιτύλιγμα. Τι είναι μέσα? Γενικά, έχουμε την ακόλουθη δομή στο εσωτερικό:

  • META-INF/- περιέχει ψηφιακό πιστοποιητικό της εφαρμογής, με ταυτοποίηση του δημιουργού της και αθροίσματα ελέγχου των αρχείων του πακέτου.
  • res/ - διάφορους πόρους που χρησιμοποιεί η εφαρμογή στην εργασία της, όπως εικόνες, δηλωτική περιγραφή της διεπαφής, καθώς και άλλα δεδομένα.
  • AndroidManifest.xml- περιγραφή της αίτησης. Αυτό περιλαμβάνει, για παράδειγμα, μια λίστα με τα απαιτούμενα δικαιώματα, την απαιτούμενη έκδοση Android και την απαιτούμενη ανάλυση οθόνης.
  • τάξεις.dex- μεταγλωττισμένο bytecode εφαρμογής για την εικονική μηχανή Dalvik.
  • πόροι.arsc- επίσης πόροι, αλλά διαφορετικού είδους - συγκεκριμένα, συμβολοσειρές (ναι, αυτό το αρχείο μπορεί να χρησιμοποιηθεί για ρωσοποίηση!).

Τα αρχεία και οι κατάλογοι που αναφέρονται βρίσκονται, αν όχι σε όλα, τότε, ίσως, στη συντριπτική πλειοψηφία των APK. Ωστόσο, υπάρχουν μερικά ακόμη όχι και τόσο συνηθισμένα αρχεία/κατάλογοι που αξίζει να αναφερθούν:

  • περιουσιακά στοιχεία- ανάλογο πόρων. Η κύρια διαφορά είναι ότι για να αποκτήσετε πρόσβαση σε έναν πόρο πρέπει να γνωρίζετε το αναγνωριστικό του, αλλά η λίστα των στοιχείων μπορεί να ληφθεί δυναμικά χρησιμοποιώντας τη μέθοδο AssetManager.list() στον κώδικα της εφαρμογής.
  • lib- εγγενείς βιβλιοθήκες Linux γραμμένες με χρήση NDK (Native Development Kit).

Αυτός ο κατάλογος χρησιμοποιείται από παραγωγούς παιχνιδιών που τοποθετούν εκεί τις μηχανές παιχνιδιών τους γραμμένες σε C/C++, καθώς και από δημιουργούς εφαρμογών υψηλής απόδοσης (για παράδειγμα, Google Chrome). Καταλάβαμε τη συσκευή. Πώς όμως αποκτάτε το αρχείο πακέτου της εφαρμογής που σας ενδιαφέρει; Δεδομένου ότι δεν είναι δυνατή η λήψη αρχείων APK από τη συσκευή χωρίς root (βρίσκονται στον κατάλογο /data/app) και το root δεν είναι πάντα σκόπιμο, υπάρχουν τουλάχιστον τρεις τρόποι για να μεταφέρετε το αρχείο της εφαρμογής στον υπολογιστή σας:

  • Επέκταση APK Downloader για Chrome.
  • Πραγματική εφαρμογή APK Leecher.
  • διάφορα αρχεία φιλοξενίας και Varezniks.

Ποιο να χρησιμοποιήσω είναι θέμα γούστου. προτιμάμε να χρησιμοποιούμε ξεχωριστές εφαρμογές, επομένως θα περιγράψουμε τη χρήση του Real APK Leecher, ειδικά επειδή είναι γραμμένο σε Java και, κατά συνέπεια, θα λειτουργεί είτε σε Windows είτε σε Nix.

Μετά την εκκίνηση του προγράμματος, πρέπει να συμπληρώσετε τρία πεδία: Email, Κωδικός πρόσβασης και Αναγνωριστικό συσκευής - και να επιλέξετε μια γλώσσα. Τα δύο πρώτα είναι το e-mail και ο κωδικός πρόσβασης του λογαριασμού σας Google που χρησιμοποιείτε στη συσκευή. Το τρίτο είναι το αναγνωριστικό συσκευής και μπορείτε να το λάβετε πληκτρολογώντας τον κωδικό στο dialer # #8255## και στη συνέχεια εύρεση της γραμμής Αναγνωριστικό συσκευής. Κατά τη συμπλήρωση, χρειάζεται μόνο να εισαγάγετε το αναγνωριστικό χωρίς το πρόθεμα android.

Μετά τη συμπλήρωση και την αποθήκευση, εμφανίζεται συχνά το μήνυμα "Σφάλμα κατά τη σύνδεση με τον διακομιστή". Δεν έχει καμία σχέση με το Google Play, οπότε μη διστάσετε να το αγνοήσετε και να αναζητήσετε πακέτα που σας ενδιαφέρουν.

Προβολή και Τροποποίηση

Ας υποθέσουμε ότι βρήκατε ένα πακέτο που σας ενδιαφέρει, το κατεβάσατε, το αποσυσκευάσατε... και όταν προσπαθήσατε να δείτε κάποιο αρχείο XML, ανακαλύψατε με έκπληξη ότι το αρχείο δεν ήταν κείμενο. Πώς να το απομεταγλωττίσω και πώς να δουλέψετε με πακέτα γενικά; Είναι πραγματικά απαραίτητη η εγκατάσταση του SDK; Όχι, δεν είναι απαραίτητο να εγκαταστήσετε το SDK καθόλου. Στην πραγματικότητα, όλα τα βήματα για την εξαγωγή, την τροποποίηση και τη συσκευασία πακέτων APK απαιτούν τα ακόλουθα εργαλεία:

  • Αρχειοθέτηση ZIPγια αποσυσκευασία και συσκευασία.
  • smali- Dalvik εικονική μηχανή bytecode assembler/disassembler (code.google.com/p/smali);
  • aapt- ένα εργαλείο για τη συσκευασία πόρων (από προεπιλογή, οι πόροι αποθηκεύονται σε δυαδική μορφή για τη βελτιστοποίηση της απόδοσης της εφαρμογής). Περιλαμβάνεται στο Android SDK, αλλά μπορεί να ληφθεί ξεχωριστά.
  • υπογράφων- ένα εργαλείο για την ψηφιακή υπογραφή ενός τροποποιημένου πακέτου (bit.ly/Rmrv4M).

Μπορείτε να χρησιμοποιήσετε όλα αυτά τα εργαλεία ξεχωριστά, αλλά αυτό είναι άβολο, επομένως είναι καλύτερο να χρησιμοποιείτε λογισμικό υψηλότερου επιπέδου που έχει κατασκευαστεί στη βάση τους. Εάν εργάζεστε σε Linux ή Mac OS X, υπάρχει ένα εργαλείο που ονομάζεται apktool. Σας επιτρέπει να αποσυσκευάζετε πόρους στην αρχική τους μορφή (συμπεριλαμβανομένων των δυαδικών αρχείων XML και arsc), να ξαναφτιάχνετε ένα πακέτο με αλλαγμένους πόρους, αλλά δεν γνωρίζει πώς να υπογράφει πακέτα, επομένως θα πρέπει να εκτελέσετε το βοηθητικό πρόγραμμα υπογραφών με μη αυτόματο τρόπο. Παρά το γεγονός ότι το βοηθητικό πρόγραμμα είναι γραμμένο σε Java, η εγκατάστασή του είναι αρκετά μη τυπική. Πρώτα πρέπει να λάβετε το ίδιο το αρχείο jar:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ εξαγωγή PATH=~/bin:$PATH

Εάν εργάζεστε σε Windows, τότε υπάρχει ένα εξαιρετικό εργαλείο για αυτό που ονομάζεται Virtuous Ten Studio, το οποίο επίσης συγκεντρώνει όλα αυτά τα εργαλεία (συμπεριλαμβανομένου του ίδιου του apktool), αλλά αντί για μια διεπαφή CLI παρέχει στον χρήστη μια διαισθητική γραφική διεπαφή με την οποία μπορείτε να εκτελέστε λειτουργίες αποσυσκευασίας, αποσυναρμολόγησης και αποσυμπίλησης με λίγα κλικ. Αυτό το εργαλείο είναι Donation-ware, δηλαδή μερικές φορές εμφανίζονται παράθυρα που σας ζητούν να λάβετε άδεια, αλλά τελικά αυτό μπορεί να γίνει ανεκτή. Δεν έχει νόημα να το περιγράψω, γιατί μπορείτε να κατανοήσετε τη διεπαφή σε λίγα λεπτά. Αλλά το apktool, λόγω της φύσης της κονσόλας, θα πρέπει να συζητηθεί λεπτομερέστερα.


Ας δούμε τις επιλογές του apktool. Με λίγα λόγια, υπάρχουν τρεις βασικές εντολές: d (αποκωδικοποίηση), b (build) και if (εγκατάσταση πλαισίου). Αν όλα είναι ξεκάθαρα με τις δύο πρώτες εντολές, τότε τι κάνει η τρίτη, υπό όρους δήλωση; Αποσυσκευάζει το καθορισμένο πλαίσιο διεπαφής χρήστη, το οποίο είναι απαραίτητο σε περιπτώσεις όπου αναλύετε οποιοδήποτε πακέτο συστήματος.

Ας δούμε τις πιο ενδιαφέρουσες επιλογές της πρώτης εντολής:

  • -μικρό- μην αποσυναρμολογείτε αρχεία dex.
  • -r- μην αποσυσκευάζετε πόρους.
  • -σι- μην εισάγετε πληροφορίες εντοπισμού σφαλμάτων στα αποτελέσματα της αποσυναρμολόγησης του αρχείου dex.
  • --πλαίσιο-διαδρομή- χρησιμοποιήστε το καθορισμένο πλαίσιο διεπαφής χρήστη αντί για αυτό που είναι ενσωματωμένο στο apktool. Τώρα ας δούμε μερικές επιλογές για την εντολή b:
  • -φά- αναγκαστική συναρμολόγηση χωρίς έλεγχο αλλαγών.
  • -ένα- υποδείξτε τη διαδρομή προς το aapt (εργαλείο για τη δημιουργία αρχείου APK), εάν για κάποιο λόγο θέλετε να το χρησιμοποιήσετε από άλλη πηγή.

Η χρήση του apktool είναι πολύ απλή για να γίνει αυτό, απλώς καθορίστε μία από τις εντολές και τη διαδρομή προς το APK, για παράδειγμα:

$ apktool d mail.apk

Μετά από αυτό, όλα τα εξαγόμενα και αποσυναρμολογημένα αρχεία του πακέτου θα εμφανιστούν στον κατάλογο αλληλογραφίας.

Παρασκευή. Απενεργοποίηση διαφήμισης

Η θεωρία είναι, φυσικά, καλή, αλλά γιατί χρειάζεται αν δεν ξέρουμε τι να κάνουμε με το μη συσκευασμένο πακέτο; Ας προσπαθήσουμε να εφαρμόσουμε τη θεωρία προς όφελός μας, δηλαδή να τροποποιήσουμε κάποιο λογισμικό ώστε να μην μας δείχνει διαφημίσεις. Για παράδειγμα, ας είναι Virtual Torch - ένας εικονικός φακός. Αυτό το λογισμικό είναι ιδανικό για εμάς, γιατί είναι γεμάτο με ενοχλητικές διαφημίσεις και, επιπλέον, είναι αρκετά απλό για να μην χαθούμε στη ζούγκλα του κώδικα.


Έτσι, χρησιμοποιώντας μία από τις παραπάνω μεθόδους, κατεβάστε την εφαρμογή από την αγορά. Εάν αποφασίσετε να χρησιμοποιήσετε το Virtuous Ten Studio, απλώς ανοίξτε το αρχείο APK στην εφαρμογή και αποσυμπιέστε το, δημιουργήστε ένα έργο (Αρχείο -> Νέο έργο) και, στη συνέχεια, επιλέξτε Εισαγωγή αρχείου στο μενού περιβάλλοντος του έργου. Εάν η επιλογή σας έπεσε στο apktool, τότε απλώς εκτελέστε μία εντολή:

$ apktool d com.kauf.particle.virtualtorch.apk

Μετά από αυτό, ένα δέντρο αρχείων παρόμοιο με αυτό που περιγράφεται στην προηγούμενη ενότητα θα εμφανιστεί στον κατάλογο com.kauf.particle.virtualtorch, αλλά με έναν πρόσθετο κατάλογο smali αντί για αρχεία dex και ένα αρχείο apktool.yml. Το πρώτο περιέχει αποσυναρμολογημένο κώδικα του εκτελέσιμου αρχείου dex της εφαρμογής, το δεύτερο περιέχει πληροφορίες υπηρεσίας που είναι απαραίτητες για το apktool να συναρμολογήσει το πακέτο πίσω.

Το πρώτο μέρος που πρέπει να κοιτάξουμε είναι, φυσικά, το AndroidManifest.xml. Και εδώ αμέσως συναντάμε την εξής γραμμή:

Δεν είναι δύσκολο να μαντέψει κανείς ότι είναι υπεύθυνη για τη χορήγηση αδειών στην εφαρμογή για χρήση της σύνδεσης στο Διαδίκτυο. Στην πραγματικότητα, αν θέλουμε απλώς να απαλλαγούμε από τη διαφήμιση, πιθανότατα θα χρειαστεί απλώς να αποκλείσουμε την εφαρμογή από το Διαδίκτυο. Ας προσπαθήσουμε να το κάνουμε αυτό. Διαγράφουμε την καθορισμένη γραμμή και προσπαθούμε να δημιουργήσουμε το λογισμικό χρησιμοποιώντας το apktool:

$ apktool b com.kauf.particle.virtualtorch

Το αρχείο APK που προκύπτει θα εμφανιστεί στον κατάλογο com.kauf.particle.virtualtorch/build/. Ωστόσο, δεν θα είναι δυνατή η εγκατάστασή του, καθώς δεν έχει ψηφιακή υπογραφή και αθροίσματα ελέγχου αρχείων (απλώς δεν έχει κατάλογο META-INF/). Πρέπει να υπογράψουμε το πακέτο χρησιμοποιώντας το βοηθητικό πρόγραμμα apk-signer. Ξεκίνησε. Η διεπαφή αποτελείται από δύο καρτέλες - στην πρώτη (Γεννήτρια κλειδιών) δημιουργούμε κλειδιά, στη δεύτερη (APK Signer) υπογράφουμε. Για να δημιουργήσετε το ιδιωτικό μας κλειδί, συμπληρώστε τα παρακάτω πεδία:

  • Αρχείο στόχου- αρχείο εξόδου keystore? Συνήθως αποθηκεύει ένα ζευγάρι κλειδιά.
  • Κωδικός πρόσβασηςΚαι Επιβεβαιώνω- κωδικός για την αποθήκευση.
  • Ψευδώνυμο- όνομα του κλειδιού στο χώρο αποθήκευσης.
  • Ψευδώνυμο κωδικόςΚαι Επιβεβαιώνω- κωδικός μυστικού κλειδιού.
  • Εγκυρότητα- περίοδος ισχύος (σε έτη). Η προεπιλεγμένη τιμή είναι η βέλτιστη.

Τα υπόλοιπα πεδία είναι, γενικά, προαιρετικά - αλλά τουλάχιστον ένα πρέπει να συμπληρωθεί.


ΠΡΟΕΙΔΟΠΟΙΗΣΗ

Για να υπογράψετε μια εφαρμογή χρησιμοποιώντας το apk-signer, πρέπει να εγκαταστήσετε το Android SDK και να καθορίσετε την πλήρη διαδρομή προς αυτό στις ρυθμίσεις της εφαρμογής.

Όλες οι πληροφορίες παρέχονται μόνο για ενημερωτικούς σκοπούς. Ούτε οι συντάκτες ούτε ο συγγραφέας ευθύνονται για οποιαδήποτε πιθανή βλάβη που προκαλείται από το υλικό αυτού του άρθρου.

Τώρα μπορείτε να υπογράψετε το APK με αυτό το κλειδί. Στην καρτέλα APK Signer, επιλέξτε το αρχείο που δημιουργήθηκε πρόσφατα, εισαγάγετε τον κωδικό πρόσβασης, το ψευδώνυμο κλειδιού και τον κωδικό πρόσβασης και, στη συνέχεια, βρείτε το αρχείο APK και κάντε κλικ με τόλμη στο κουμπί "Υπογραφή". Αν όλα πάνε καλά, το πακέτο θα υπογραφεί.

ΠΛΗΡΟΦΟΡΙΕΣ

Εφόσον υπογράψαμε το πακέτο με το δικό μας κλειδί, θα έρχεται σε διένεξη με την αρχική εφαρμογή, πράγμα που σημαίνει ότι όταν προσπαθήσουμε να ενημερώσουμε το λογισμικό μέσω της αγοράς, θα λάβουμε ένα σφάλμα.

Απαιτείται ψηφιακή υπογραφή μόνο για λογισμικό τρίτων, επομένως εάν τροποποιείτε εφαρμογές συστήματος που είναι εγκατεστημένες αντιγράφοντας τις στον κατάλογο /system/app/, τότε δεν χρειάζεται να τις υπογράψετε.

Μετά από αυτό, κατεβάστε το πακέτο στο smartphone σας, εγκαταστήστε το και εκκινήστε το. Voila, η διαφήμιση έφυγε! Αντίθετα, όμως, εμφανίστηκε ένα μήνυμα ότι δεν έχουμε Internet ή ότι δεν έχουμε τα κατάλληλα δικαιώματα. Θεωρητικά, αυτό μπορεί να είναι αρκετό, αλλά το μήνυμα φαίνεται ενοχλητικό και, για να είμαστε ειλικρινείς, απλά σταθήκαμε τυχεροί με μια ηλίθια εφαρμογή. Το κανονικά γραμμένο λογισμικό πιθανότατα θα διευκρινίσει τα διαπιστευτήριά του ή θα ελέγξει για σύνδεση στο Διαδίκτυο και διαφορετικά απλώς θα αρνηθεί την εκκίνηση. Πώς να είσαι σε αυτή την περίπτωση; Φυσικά, επεξεργαστείτε τον κώδικα.

Συνήθως, οι συντάκτες εφαρμογών δημιουργούν ειδικές κλάσεις για την εμφάνιση διαφημίσεων και μεθόδους κλήσης αυτών των τάξεων όταν εκκινείται η εφαρμογή ή μία από τις «δραστηριότητές» της (με απλά λόγια, οθόνες εφαρμογών). Ας προσπαθήσουμε να βρούμε αυτές τις τάξεις. Πηγαίνουμε στον κατάλογο smali, μετά com (το org περιέχει μόνο την ανοιχτή βιβλιοθήκη γραφικών cocos2d), μετά kauf (εδώ είναι, γιατί αυτό είναι το όνομα του προγραμματιστή και όλος ο κώδικάς του είναι εκεί) - και εδώ είναι, τον κατάλογο μάρκετινγκ. Μέσα βρίσκουμε ένα σωρό αρχεία με την επέκταση smali. Πρόκειται για κατηγορίες και η πιο αξιοσημείωτη από αυτές είναι η κατηγορία Ad.smali, από το όνομα της οποίας είναι εύκολο να μαντέψει κανείς ότι είναι αυτή που εμφανίζει διαφημίσεις.

Θα μπορούσαμε να αλλάξουμε τη λογική της λειτουργίας του, αλλά θα ήταν πολύ πιο εύκολο να αφαιρέσουμε απλώς τις κλήσεις σε οποιαδήποτε από τις μεθόδους του από την ίδια την εφαρμογή. Επομένως, αφήνουμε τον κατάλογο μάρκετινγκ και πηγαίνουμε στον γειτονικό κατάλογο σωματιδίων και μετά στον εικονικό φακό. Το αρχείο MainActivity.smali αξίζει εδώ ιδιαίτερη προσοχή. Αυτή είναι μια τυπική κλάση Android που δημιουργείται από το Android SDK και εγκαθίσταται ως σημείο εισόδου στην εφαρμογή (ανάλογα με την κύρια λειτουργία στο C). Ανοίξτε το αρχείο για επεξεργασία.

Στο εσωτερικό υπάρχει κωδικός smali (τοπικός συναρμολογητής). Είναι αρκετά μπερδεμένο και δύσκολο να διαβαστεί λόγω της φύσης του χαμηλού επιπέδου, επομένως δεν θα το μελετήσουμε, αλλά απλώς θα βρούμε όλες τις αναφορές στην κατηγορία διαφημίσεων στον κώδικα και θα τις σχολιάσουμε. Εισάγουμε τη γραμμή "Διαφήμιση" στην αναζήτηση και φτάνουμε στη γραμμή 25:

Ιδιωτική διαφήμιση πεδίου:Lcom/kauf/μάρκετινγκ/Διαφήμιση;

Εδώ δημιουργείται ένα πεδίο διαφήμισης για την αποθήκευση ενός αντικειμένου κατηγορίας διαφημίσεων. Σχολιάζουμε τοποθετώντας ένα σύμβολο ### μπροστά από τη γραμμή. Συνεχίζουμε την αναζήτηση. Γραμμή 423:

New-instance v3, Lcom/kauf/marketing/Ad;

Εδώ γίνεται η δημιουργία αντικειμένου. Ας σχολιάσουμε. Συνεχίζουμε την αναζήτηση και βρίσκουμε στις γραμμές 433, 435, 466, 468, 738, 740, 800 και 802 κλήσεις σε μεθόδους της κατηγορίας Ad. Ας σχολιάσουμε. Δες ότι αυτό είναι. Ας σώσουμε. Τώρα το πακέτο πρέπει να συναρμολογηθεί ξανά και να ελεγχθεί για λειτουργικότητα και παρουσία διαφήμισης. Για την καθαρότητα του πειράματος, επιστρέφουμε τη γραμμή που αφαιρέθηκε από το AndroidManifest.xml, συναρμολογούμε το πακέτο, το υπογράφουμε και το εγκαθιστούμε.

Το πειραματόζωό μας. Η διαφήμιση είναι ορατή

Ωχ! Η διαφήμιση εξαφανίστηκε μόνο κατά την εκτέλεση της εφαρμογής, αλλά παρέμεινε στο κύριο μενού, το οποίο βλέπουμε όταν εκκινούμε το λογισμικό. Λοιπόν, περιμένετε, αλλά το σημείο εισόδου είναι η κλάση MainActivity και η διαφήμιση εξαφανίστηκε κατά την εκτέλεση της εφαρμογής, αλλά παρέμεινε στο κύριο μενού, άρα το σημείο εισόδου είναι διαφορετικό; Για να προσδιορίσετε το πραγματικό σημείο εισόδου, ανοίξτε ξανά το αρχείο AndroidManifest.xml. Και ναι, περιέχει τις ακόλουθες γραμμές:

Μας λένε (και, το πιο σημαντικό, το android) ότι μια δραστηριότητα με το όνομα Start θα πρέπει να ξεκινήσει ως απόκριση στη δημιουργία μιας πρόθεσης (συμβάντος) android.intent.action.MAIN από την κατηγορία android.intent.category.LAUNCHER. Αυτό το συμβάν δημιουργείται όταν πατάτε στο εικονίδιο της εφαρμογής στη λειτουργία εκκίνησης, επομένως καθορίζει το σημείο εισόδου, δηλαδή την κλάση Έναρξη. Πιθανότατα, ο προγραμματιστής πρώτα έγραψε μια εφαρμογή χωρίς κύριο μενού, το σημείο εισόδου στο οποίο ήταν η τυπική κλάση MainActivity, και στη συνέχεια πρόσθεσε ένα νέο παράθυρο (δραστηριότητα) που περιέχει το μενού και περιγράφεται στην κλάση Έναρξη, και το έκανε χειροκίνητα την καταχώρηση σημείο.

Ανοίξτε το αρχείο Start.smali και αναζητήστε ξανά τη γραμμή "Ad", βρίσκουμε στις γραμμές 153 και 155 μια αναφορά στην κλάση FirstAd. Είναι επίσης στον πηγαίο κώδικα και, αν κρίνουμε από το όνομα, είναι υπεύθυνος για την εμφάνιση διαφημίσεων στην κύρια οθόνη. Ας δούμε περαιτέρω, υπάρχει η δημιουργία ενός στιγμιότυπου της κλάσης FirstAd και μια πρόθεση που, σύμφωνα με το πλαίσιο, σχετίζεται με αυτήν την περίπτωση, και στη συνέχεια η ετικέτα cond_10, η υπό όρους μετάβαση στην οποία πραγματοποιείται ακριβώς πριν από τη δημιουργία μιας παρουσίας της τάξης:

If-ne p1, v0, :cond_10 .line 74 new-instance v0, Landroid/content/Intent; ... :cond_10

Πιθανότατα, το πρόγραμμα υπολογίζει με κάποιο τρόπο τυχαία εάν η διαφήμιση πρέπει να εμφανίζεται στην κύρια οθόνη και, αν όχι, μεταβαίνει απευθείας στο cond_10. Εντάξει, ας απλοποιήσουμε την εργασία της και ας αντικαταστήσουμε τη μετάβαση υπό όρους με μια άνευ όρων:

#if-ne p1, v0, :cond_10 goto:cond_10

Δεν υπάρχουν περισσότερες αναφορές για το FirstAd στον κώδικα, επομένως κλείνουμε το αρχείο και συναρμολογούμε ξανά τον εικονικό μας φακό χρησιμοποιώντας το apktool. Αντιγράψτε το στο smartphone σας, εγκαταστήστε το, εκκινήστε το. Voila, όλες οι διαφημίσεις έχουν εξαφανιστεί, για το οποίο συγχαίρουμε όλους μας.

Αποτελέσματα

Αυτό το άρθρο είναι απλώς μια σύντομη εισαγωγή στις μεθόδους εισβολής και τροποποίησης εφαρμογών Android. Πολλά ζητήματα παρέμειναν στο παρασκήνιο, όπως η κατάργηση προστασίας, η ανάλυση ασαφούς κώδικα, η μετάφραση και η αντικατάσταση πόρων εφαρμογών, καθώς και η τροποποίηση εφαρμογών που γράφτηκαν με χρήση του Android NDK. Ωστόσο, με βασικές γνώσεις, είναι μόνο θέμα χρόνου να τα καταλάβουμε όλα.

Από αυτό το άρθρο θα μάθετε από τι αποτελείται η εφαρμογή Android, πώς να ανοίξετε ένα αρχείο APK και με ποια προγράμματα.

Τι είναι ένα αρχείο APK;

Το APK είναι μια μορφή του λειτουργικού συστήματος Android που χρησιμοποιείται για αρχειοθετημένα αρχεία εκτελέσιμων εφαρμογών και το όνομα του ίδιου του αρχείου μπορεί να είναι οτιδήποτε, αλλά η επέκταση θα πρέπει να μοιάζει μόνο με αυτό.apk. Τα ανάλογα APK σε άλλα λειτουργικά συστήματα είναι το .msi στα Windows, το .sis στο Symbian, το .rpm ή το .deb στο Linux.

Ας δούμε τι υπάρχει μέσα
Στην πραγματικότητα, το .apk είναι ένα αρχείο ZIP, ώστε να μπορείτε να δείτε την εσωτερική συσκευή χρησιμοποιώντας οποιονδήποτε διαχειριστή αρχείων ή αρχειοθέτηση, για παράδειγμα το WinRAR ή την εφαρμογή για κινητά X-plore.




Αξίζει να θυμάστε ότι έχετε μόνο οπτική πρόσβαση σε εσωτερικούς πόρους.

Ας δούμε τη δομή
Μέσα στο .apk βλέπουμε έναν αριθμό αρχείων και φακέλων, ας μάθουμε σε τι χρησιμεύουν:

  • Το AndroidManifest.xml είναι ένα είδος «διαβατηρίου» της εφαρμογής από το οποίο μπορείτε να μάθετε όλα τα κύρια σημεία, τις απαιτήσεις, την έκδοση, τα δικαιώματα κ.λπ.
  • META-INF αυτό το αρχείο περιέχει μεταδεδομένα, δηλαδή δεδομένα σχετικά με δεδομένα, αθροίσματα ελέγχου, διαδρομές προς δεδομένα, διαδρομές και αθροίσματα ελέγχου πόρων, πιστοποιητικά. Μπορείτε να ανοίξετε αυτό το αρχείο με οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου, αλλά συνιστάται η χρήση του Notepad++.
  • Ο φάκελος res περιέχει όλους τους πόρους του προγράμματος, γραφικά, όπως εικονίδια, εικόνες, κείμενο και στοιχεία γραφικής διεπαφής. Μπορείτε επίσης να έχετε εύκολη πρόσβαση στον φάκελο.
  • Το classes.dex είναι ο άμεσος κώδικας του προγράμματος εφαρμογής που εκτελείται από την εικονική μηχανή Dalvik VM, μπορείτε να δείτε τι υπάρχει μέσα σε αυτό το αρχείο μόνο αποσυμπιέζοντας το .apk. resources.arsc - μεταγλωττισμένο αρχείο XML, αυτό το αρχείο περιέχει δεδομένα σχετικά με όλους τους πόρους που εμπλέκονται στο πρόγραμμα.
  • lib - ένας φάκελος με εγγενείς βιβλιοθήκες, στους πόρους των οποίων είναι δυνατή η πρόσβαση μόνο όταν χρησιμοποιείτε εξειδικευμένα προγράμματα. Το APK μπορεί επίσης να περιέχει αρχεία και φακέλους όπως com, org, udk, αλλά όχι πάντα.

Τώρα ας δούμε την εσωτερική δομή με περισσότερες λεπτομέρειες για αυτό χρειαζόμαστε ένα πρόγραμμα αποσυμπίλησης, Java και ένα αρχείο APK. Το κύριο εργαλείο για την αποσυναρμολόγηση του .apk είναι το Apktool, αλλά αυτό το πρόγραμμα λειτουργεί μόνο από τη γραμμή, κάτι που δεν είναι πολύ βολικό. Για ταχύτερη και πιο βολική ανάλυση, μπορείτε να χρησιμοποιήσετε το APKing, αυτό εξακολουθεί να είναι το ίδιο Apktool, αλλά με δυνατότητα εργασίας από το μενού περιβάλλοντος.


Και έτσι εγκαθιστούμε το APKing όπως κάθε εφαρμογή για Windows και, έχοντας επιλέξει .apk, κάνουμε κλικ σε αυτό με το δεξί κουμπί του ποντικιού και ταυτόχρονα Shift, και μετά θα δούμε τα εξής:



Και επιλέξτε την απαιτούμενη ενέργεια, για παράδειγμα, απομεταγλωττίστε πλήρως, τότε το πρόγραμμα θα ολοκληρώσει τη λειτουργία και θα δημιουργήσει έναν φάκελο με το ίδιο όνομα.



Ανοίγοντας το φάκελο θα έχουμε πρόσβαση σε όλους τους πόρους του αρχείου APK.



Τώρα όλα τα αρχεία κειμένου μπορούν να επεξεργαστούν, ενώ τηρώντας τους βασικούς κανόνες, μπορείτε να χρησιμοποιήσετε το δημοφιλές πρόγραμμα Notepad++, για παράδειγμα, σκεφτείτε το AndroidManifest.xml

Ανέφερα την εφαρμογή SmartAPKTool. Μπορεί να εξάγει, να συμπιέζει και να υπογράφει τροποποιημένα αρχεία apk. Το πλεονέκτημά του είναι η παρουσία μιας γραφικής διεπαφής. Ωστόσο, υπάρχει επίσης ένα σοβαρό μειονέκτημα. Το SmartAPKTool δεν έχει ενημερωθεί εδώ και πολύ καιρό και το πρόγραμμα δεν αποσυσκευάζει και συσκευάζει σωστά τις εφαρμογές για τις πιο πρόσφατες εκδόσεις του Android. Επομένως, εδώ θα προσπαθήσω να εξηγήσω πώς να χρησιμοποιήσετε την εφαρμογή για αυτούς τους σκοπούς apktool.

Σημείωση 1.
Το πρόγραμμα SmartAPKTool εξακολουθεί να είναι βολικό στη χρήση για την υπογραφή συλλεγόμενων αρχείων apk.
Σημείωση 2.
Οι σύνδεσμοι προς τα προγράμματα που αναφέρονται στο άρθρο είναι ↓

Πρόγραμμα apktoolδεν έχει γραφική διεπαφή. Αυτό είναι ένα μειονέκτημα για όσους δεν έχουν συνηθίσει να εργάζονται με τη γραμμή εντολών. Υπάρχει όμως και ένα πλεονέκτημα: σε αντίθεση με το SmartAPKTool, θα δούμε όλα τα σφάλματα, πράγμα που σημαίνει ότι θα ξέρουμε τι να διορθώσουμε.

Ας κατεβάσουμε δύο αρχεία: το ένα κοινό για όλα τα συστήματα, το άλλο για το σύστημά μας (τα Windows στο παράδειγμα):

Ας αποσυμπιέσουμε και τα δύο αρχεία στον ίδιο κενό φάκελο (στο παράδειγμά μας, C:\apktool\). Το περιεχόμενό του θα πρέπει να μοιάζει με αυτό:

Από εδώ και πέρα ​​μπορούμε να χρησιμοποιήσουμε το πρόγραμμα apktool.

Σημείωση 3.
Οι χρήστες των εκδόσεων 64-bit του Linux θα πρέπει να εγκαταστήσουν το πακέτο ia32-libs:

sudo apt-get εγκατάσταση ia32-libs

Στον ίδιο φάκελο βάζουμε το αρχείο που πρέπει να αποσυμπιέσουμε. Για παράδειγμα, ας λέγεται orig.apk
Πατήστε και κρατήστε πατημένο το πλήκτρο Shift και κάντε δεξί κλικ σε οποιοδήποτε κενό χώρο στο φάκελο (μην κάνετε κλικ σε αρχεία!). Μετά από αυτό, επιλέξτε "Άνοιγμα παραθύρου εντολών". Στην κονσόλα που εμφανίζεται, πληκτρολογήστε:

apktool decode orig.apk

Το αρχείο θα αποσυμπιεστεί:

Τώρα έχουμε έναν φάκελο με την μη συσκευασμένη εφαρμογή στον κατάλογο C:\apktool\. Ονομάζεται το ίδιο με το αρχείο προέλευσης, μείον την επέκταση: C:\apktool\orig\ . Μπορούμε να αλλάξουμε τα αρχεία προέλευσης όπως περιγράφεται στο άρθρο Android: πώς να εγκαταστήσετε δύο ίδιες εφαρμογές σε ένα τηλέφωνο. Αφού κάνουμε τις αλλαγές, θα συλλέξουμε ένα αντίγραφο της εφαρμογής συσκευάζοντας τα αρχεία προέλευσης σε ένα apk:

apktool build orig result.apk

Εδώ result.apk είναι το όνομα αρχείου που βρήκαμε για τη δημιουργία αντιγραφής. Εάν δεν υπάρχουν σφάλματα, το αρχείο θα συναρμολογηθεί:

Τα υπόλοιπα ξεφεύγουν από τον σκοπό του άρθρου:

  1. Εάν υπάρχουν σφάλματα κατά τη συναρμολόγηση, πρέπει να βρείτε την αιτία τους και να τα διορθώσετε.
  2. Το μόνο που μένει είναι να υπογράψετε το αρχείο result.apk που προκύπτει. Αυτό μπορεί να γίνει χρησιμοποιώντας το SmartAPKTool όπως αναφέρθηκε παραπάνω. Τα πάντα σχετικά με αυτό είναι διαισθητικά. Υπάρχουν επίσης άλλοι τρόποι για να υπογράψετε ένα αρχείο apk.
  3. Ενδέχεται επίσης να προκύψουν σφάλματα κατά την εγκατάσταση ενός αντιγράφου, κατά την εκκίνηση ή τη λειτουργία του. Πρέπει να συλληφθούν χρησιμοποιώντας το βοηθητικό πρόγραμμα adb που περιλαμβάνεται στο Android SDK.

Πρέπει να υπογράψετε την εφαρμογή, διαφορετικά δεν θα εγκατασταθεί. Τα σφάλματα δεν συμβαίνουν τόσο συχνά και τα πιο συνηθισμένα προβλήματα που τα προκαλούν περιγράφονται στο άρθρο

Κατά τη διαδικασία χρήσης διαφόρων υλικολογισμικών για συσκευές Android, μερικές φορές καθίσταται απαραίτητο να αλλάξετε τις εφαρμογές συστήματος που είναι ενσωματωμένες στο λειτουργικό σύστημα με τον ένα ή τον άλλο τρόπο. Σε αυτό το υλικό θα εξετάσουμε αυτό το θέμα λεπτομερώς.

Φυσικά, πρέπει να αποσυναρμολογήσετε και να επανασυναρμολογήσετε το αρχείο APK του συστήματος, ώστε να λειτουργεί σωστά και σταθερά. Ας καταλάβουμε βήμα προς βήμα τι πρέπει να γίνει για αυτό.

Πρώτα, πρέπει να πραγματοποιήσετε τη διαδικασία απεγγραφής αρχείων APK συστήματος. Θα σας πούμε πώς να το κάνετε αυτό μέσα.

Έτσι, το αρχείο .apk έγινε dedex και decompiled. Ας αναλύσουμε την εφαρμογή που μας ενδιαφέρει, ας έχει το όνομα, για λόγους σαφήνειας, δομή- res. apk. Το θυμόμαστε στο μυαλό μας ως την αρχική εφαρμογή.

Ας υποθέσουμε ότι έχουμε κάνει όλες τις απαραίτητες αλλαγές στην εφαρμογή. Θα μιλήσουμε περισσότερα για όλες τις πτυχές των αρχείων APK στο. Τώρα πρέπει να το συσκευάσετε πίσω. Ας θυμηθούμε την ολοκληρωμένη συσκευασμένη εφαρμογή στο μυαλό μας ως τροποποιημένη εφαρμογή 2.

Τώρα θα εξηγήσουμε γιατί ήταν απαραίτητο να θυμόμαστε νοερά τις εφαρμογές ως πρωτότυπες και τροποποιημένες 2. Η εφαρμογή που μεταγλωττίστηκε από το πρόγραμμα ApkTool (ή χρησιμοποιώντας μια επέκταση γραφικής διεπαφής χρήστη όπως το SmartApkTool) δεν θα λειτουργήσει, αλλά αυτό δεν είναι πρόβλημα. Εκτελούμε τις παρακάτω ενέργειες:

Η συλλογή τέτοιων αρχείων πίσω στο APK είναι αρκετά απλή. Για να το κάνετε αυτό, πρέπει να εκτελέσετε το apktool με την κατάλληλη σημαία κατασκευής και να του περάσετε τη διαδρομή προς το φάκελο με την απομεταγλωττισμένη εφαρμογή μέσα. Για παράδειγμα, εάν έχουμε έναν φάκελο εφαρμογής που βρίσκεται στον ίδιο κατάλογο με το apktool, τότε η εντολή θα μοιάζει με αυτό:

Κέλυφος

java -jar apktool.jar b app

java - jar apktool .jar b app

Μετά τη συναρμολόγηση, το τελικό αρχείο APK θα βρίσκεται στον κατάλογο εφαρμογή/κατασκευή. Στη συνέχεια, πρέπει να υπογράψετε το APK. Αυτό γίνεται για να διασφαλιστεί ότι η εφαρμογή λειτουργεί σε συσκευές όπου ο εντοπισμός σφαλμάτων απαγορεύεται. Δηλαδή, η εκκίνηση ανυπόγραφων εφαρμογών σε τέτοιες συσκευές απαγορεύεται. Μπορείτε να διαβάσετε περισσότερα για τα ψηφιακά πιστοποιητικά και τη διαδικασία υπογραφής αρχείων εδώ.

Η υπογραφή ενός αρχείου είναι πολύ απλή: υπάρχει ένα ειδικό βοηθητικό πρόγραμμα για αυτό που ονομάζεται signapk. Πρέπει να ξεκινήσει περνώντας πρώτα πιστοποιητικά ως ορίσματα, μετά τη διαδρομή προς την εφαρμογή και, τέλος, τη διαδρομή για την υπογεγραμμένη εφαρμογή (το αποτέλεσμα, πού να την αποθηκεύσετε). Μοιάζει κάπως έτσι:

Κέλυφος

java -jar signapk.jar testkey.x509.pem testkey.pk8 *.apk apk_signed.apk

java - jar signapk .jar testkey .x509 .pem testkey .pk8 * .apk apk_signed .apk

Πού μπορείτε να πάρετε ένα τέτοιο πιστοποιητικό, ρωτάτε; Τα πιστοποιητικά μπορούν να βρεθούν στο Διαδίκτυο. Ή δημιουργήστε το μόνοι σας. Μπορείτε να βρείτε αναλυτικές οδηγίες για τη ρύθμιση και τη δημιουργία όλων των απαραίτητων αρχείων, για παράδειγμα, .

συμπέρασμα

Όπως μπορείτε να δείτε, η αποσυμπίληση και η συναρμολόγηση αρχείων APK είναι μια αρκετά απλή διαδικασία, η οποία, επιπλέον, μπορεί να αυτοματοποιηθεί, διευκολύνοντας το έργο του ερευνητή. Η ίδια η εικονική μηχανή Dalvik είναι επίσης εύκολη στην εκμάθηση και στο άνοιγμα, γεγονός που, αφενός, μειώνει το εμπόδιο εισόδου για τους προγραμματιστές, αφετέρου, είναι ο κύριος λόγος για ένα τόσο μεγάλο ποσοστό πειρατείας στην πλατφόρμα Android. Αυτός είναι εν μέρει ο λόγος που οι προγραμματιστές παιχνιδιών, για παράδειγμα, γενικά δεν ενδιαφέρονται να κυκλοφορήσουν ενδιαφέροντα παιχνίδια με πλοκή. Είναι πολύ πιο επικερδές, δεδομένης της τρέχουσας στάσης των χρηστών, να καθηλώνουν αγροκτήματα με δωρεές που μοιάζουν εντυπωσιακά μεταξύ τους. Επομένως, αγοράζουμε εφαρμογές, υποστηρίζουμε προγραμματιστές και, ως εκ τούτου, λαμβάνουμε ενδιαφέρον περιεχόμενο. Αλλά δεν υπάρχει καμία απολύτως ανάγκη για δωρεά!

Σας ευχαριστώ όλους, τα λέμε ξανά.

  • Ενότητες του ιστότοπου