Προγραμματισμός

Java Tip 22: Προστατέψτε τους bytecodes σας από την αντίστροφη μηχανική / αποσυμπίεση

Εάν γράφετε μαθήματα Java και τα διανέμετε μέσω Διαδικτύου, θα πρέπει να γνωρίζετε ότι οι άνθρωποι μπορούν να ανασυγκροτήσουν, να αποσυναρμολογήσουν ή να αποσυνθέσουν τα μαθήματά σας σε πηγαίο κώδικα Java. Ο πιο ευρέως χρησιμοποιούμενος αποκωδικοποιητής (τουλάχιστον δημόσια) είναι ο Mocha. Το Mocha διαβάζει ένα ή περισσότερα αρχεία bytecodes (τάξεις) και τα μετατρέπει σε πηγαίο κώδικα Java. Αν και ο κώδικας που δημιουργείται από τη Mocha δεν είναι ακριβώς ο ίδιος με τον αρχικό πηγαίο κώδικα, είναι αρκετά κοντά για να κατανοήσει και να τροποποιήσει κάποιος. Εάν ενδιαφέρεστε να αναπτύξετε μαθήματα Java και να τα διανείμετε μέσω του Διαδικτύου - και θα θέλατε να τα προστατεύσετε από την αποσύνθεση - διαβάστε.

Mocha: ένα παράδειγμα

Πριν παρουσιάσουμε το Crema, θα δούμε ένα παράδειγμα χρησιμοποιώντας το Mocha. Το παρακάτω απλό πρόγραμμα εμφανίζει τη συμβολοσειρά "Γεια σου" στην οθόνη:

δοκιμή τάξης {public static void main (String argv []) {System.out.println ("Γεια σου"); }} 

Εάν οι παραπάνω τέσσερις γραμμές είχαν αποθηκευτεί σε ένα αρχείο, test.java, στη συνέχεια, μεταγλώττιση test.java θα δημιουργήσει ένα νέο αρχείο, test.class, που περιέχει τους bytecodes Java που αντιπροσωπεύουν αυτόν τον πηγαίο κώδικα Java. Τώρα ας εκτελέσουμε το Mocha στο αρχείο τάξης και να δούμε την έξοδο Mocha:

% java mocha.Decompiler test.class // το% είναι το C shell μου προτροπή στο UNIX. 

Η παραπάνω εντολή δημιουργεί ένα αρχείο που ονομάζεται test.mocha, ο οποίος περιέχει τον πηγαίο κώδικα Java που δημιουργήθηκε από τη Mocha:

% περισσότερα test.mocha / * Αποσυγκροτήθηκε από τον Mocha από το test.class * / / * Αρχικά συντάχθηκε από το test.java * / import java.io.PrintStream; δοκιμή τάξης {public static void main (String astring []) {System.out.println ("Γεια σου"); } δοκιμή () {}} 

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

Κρέμα για τη διάσωση!

Πώς μπορείτε λοιπόν να προστατέψετε τα μαθήματά σας από την αποσύνθεση; Μια απάντηση είναι η Crema. Το Crema ανακατεύει τις συμβολικές πληροφορίες στο δικό σας .τάξη αρχεία, έτσι ώστε να γίνουν λιγότερο ευάλωτα στην αποσύνθεση. Οι συμβολικές πληροφορίες που ανακαλύπτει η Crema περιλαμβάνουν το όνομα της κλάσης, το superclass, τις διεπαφές, τα ονόματα μεταβλητών, τις μεθόδους και ούτω καθεξής. Αυτά τα συμβολικά ονόματα απαιτούνται από την εικονική μηχανή Java (JVM) για τη σύνδεση των τάξεων σας με πακέτα βιβλιοθηκών. Η Crema ανακαλύπτει αυτά τα συμβολικά ονόματα και κάνει αναφορές σε αυτά με τον ίδιο τρόπο, έτσι ώστε το JVM να μπορεί να επιτύχει τη σωστή σύνδεση μεταξύ τάξεων και πακέτων.

Πώς λειτουργεί λοιπόν το Crema; Βασικά, πριν διανείμετε τα αρχεία τάξης σας στο Διαδίκτυο, εκτελέστε το Crema σε αυτά. Η Crema θα ανακαλύψει τις συμβολικές πληροφορίες που περιέχονται σε αυτές και θα τοποθετήσει κάθε νέα τάξη στο αρχείο 1. κρεά. Η δουλειά σας είναι τότε να μετονομάσετε 1. κρεά σε κάτι σαν filename.class πριν το διανείμετε στο Διαδίκτυο.

Ας τρέξουμε το Crema στο δικό μας test.class παράδειγμα που φαίνεται παραπάνω και, στη συνέχεια, προσπαθήστε να το αποσυνθέσετε με το Mocha:

Το% java Crema -v test.class // -v είναι μια επιλογή για να ενεργοποιήσετε τη λειτουργία verbose //. Υπάρχουν πολλές ακόμη επιλογές. CREMA - The Java Obfuscator - ΕΚΤΙΜΗΣΗ ΑΞΙΟΛΟΓΗΣΗΣ Copyright (c) 1996 Hanpeter van Vliet Loading test.class Obfuscating test Αποθήκευση δοκιμής ως 1.crema ΣΗΜΕΙΩΣΗ: Τα μαθήματα που υποβάλλονται σε επεξεργασία με την έκδοση αξιολόγησης του Crema μπορούν να χρησιμοποιηθούν μόνο τοπικά, καθώς τα περισσότερα προγράμματα περιήγησης θα αρνηθούν φορτώστε τα. Για την πλήρη έκδοση του Crema, τοποθετήστε το πρόγραμμα περιήγησής σας στη διεύθυνση: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (βλ. Πόρους) 

Η παραπάνω εντολή δημιούργησε ένα νέο αρχείο, 1. κρεά, το οποίο περιέχει τους bytecodes με ανακεφαλαιωμένες συμβολικές πληροφορίες. Σημειώστε ότι το Crema έχει πολλές παραμέτρους επιλογής γραμμής εντολών που μπορείτε να χρησιμοποιήσετε. για περισσότερες πληροφορίες σχετικά με το Crema, ανατρέξτε στην ενότητα Πόροι.

Τώρα ας μεταφέρουμε αυτό το αρχείο test.class και πάλι και αποικοδομήστε το χρησιμοποιώντας Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * παράβαση τμηματοποίησης si_signo [11]: SIGSEGV 11 * παράβαση τμηματοποίησης si_errno [0]: Σφάλμα 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Full thread dump: "Finalizer thread" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_thread_t: 1) νήμα "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" χειριστής ρολογιού "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main "(TID: 0xee3000a0, sys_thread_t: 0x .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Οθόνη Cache Dump: Registered Monitor Dump: Finalize me queue lock: unown κλείδωμα ουράς: κλειστό κλείδωμα κλάσης: κλειδωμένο κλείδωμα στοίβας Java: μη κλειδωμένο κλείδωμα επανεγγραφής κώδικα: μη κενού ως οριστικοποίηση κλειδώματος ουράς: κλειδωμένη οθόνη IO lock: unown Child death monitor: unown Monitor monitor: unown I / O monitor: unown Alarm monitor: unown Περιμένοντας ειδοποίηση: "clock handler" Sbrk lock: unown Monitor cache lock: unown Monitor μητρώο : κάτοχος οθόνης: "main" Συναγερμός νήματος Ε: Ακύρωση (ο πυρήνας έχει απορριφθεί) 

Όπως μπορείτε να δείτε στον παραπάνω κώδικα, το πρώτο πράγμα που παραπονιέται η Mocha είναι το NullPointerException γιατί μπερδεύτηκε για τις συμβολικές πληροφορίες. Ως εκ τούτου, επιτυγχάνεται ο στόχος μας να κάνουμε δύσκολη την αποικοδόμηση του κώδικα μας.

Πρέπει να σημειωθεί ότι ο συγγραφέας του Mocha, Hanpeter van Vliet, είναι επίσης ο συγγραφέας του Crema! Το Mocha διανέμεται χωρίς χρέωση. Ένα αντίγραφο αξιολόγησης του Crema είναι διαθέσιμο χωρίς χρέωση, αλλά η πλήρης έκδοση είναι ένα εμπορικό προϊόν.

Κατά τη διανομή τάξεων Java μέσω του Διαδικτύου, μπορείτε να προστατεύσετε τον κώδικα bytava Java από τον κίνδυνο να δημιουργήσετε αντίστροφη μηχανική. Τα παραπάνω παραδείγματα κώδικα δείχνουν πώς χρησιμοποιείται το Mocha για την πραγματοποίηση της αποσύνθεσης και πώς μπορεί η Crema να βοηθήσει στη διάσωση, αποτρέποντας τέτοια δραστηριότητα.

Ο Qusay H. Mahmoud είναι μεταπτυχιακός φοιτητής στην επιστήμη των υπολογιστών στο Πανεπιστήμιο του New Brunswick, στην πανεπιστημιούπολη του Αγίου Ιωάννη του Καναδά.

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Σημείωση του συντάκτη Από τον θάνατο του κ. Van Vliet (από καρκίνο) οι ιστότοποι που δημιούργησε για τη διανομή των Mocha και Crema έπαψαν να υπάρχουν.
  • Ιστότοπος διανομής Mocha του Eric Smith //www.brouhaha.com/~eric/computers/mocha.html
  • Crema στον ιστότοπο CERN //java.cern.ch:80/CremaE1/DOC/quickstart.html

Αυτή η ιστορία, "Java Tip 22: Protect your bytecodes from reverse engineering / decompilation" δημοσιεύθηκε αρχικά από την JavaWorld.