Petua Java 22: Lindungi kod bytek anda dari teknik / penyahkomputeran terbalik

Sekiranya anda menulis kelas Java dan menyebarkannya melalui Internet, anda harus tahu bahawa orang boleh membuat pembalikan, membongkar, atau menguraikan kelas anda ke dalam kod sumber Java. Pengurai yang paling banyak digunakan (sekurang-kurangnya secara terbuka) adalah Mocha. Mocha membaca satu atau lebih fail kod byt (kelas) dan menukarnya kembali ke kod sumber Java. Walaupun kod yang dihasilkan oleh Mocha tidak sama persis dengan kod sumber asal, ia cukup dekat untuk difahami dan diubah suai oleh seseorang. Sekiranya anda berminat untuk mengembangkan kelas Java dan menyebarkannya melalui Internet - dan anda ingin melindungi mereka daripada terurai - baca terus.

Mocha: contoh

Sebelum memperkenalkan Crema, kita akan melalui contoh menggunakan Mocha. Program sederhana berikut memaparkan rentetan "Hai," di skrin:

ujian kelas {public static void main (String argv []) {System.out.println ("Hai ada"); }}

Sekiranya empat baris di atas disimpan dalam file, test.javamaka penyusunan test.javaakan menghasilkan fail baru test.class, yang berisi bytecode Java yang mewakili kod sumber Java itu. Sekarang mari kita jalankan Mocha pada fail kelas dan lihat output Mocha:

% java mocha.Decompiler test.class //% itu adalah C shell shell saya pada UNIX. 

Perintah di atas menghasilkan fail yang disebut test.mocha, yang mengandungi kod sumber Java yang dihasilkan oleh Mocha:

% lagi test.mocha / * Diuraikan oleh Mocha dari test.class * / / * Asalnya disusun dari test.java * / import java.io.PrintStream; ujian kelas {public static void main (String astring []) {System.out.println ("Hai ada"); } ujian () {}}

Seperti yang anda lihat dari contoh di atas, Mocha telah memberi kami kod sumber Java yang mudah dibaca dan difahami. Sekiranya anda menyalin fail ini test.java, menyusunnya semula, dan menjalankannya, ia akan menyusun dan berjalan dengan baik.

Crema untuk menyelamatkan!

Oleh itu, bagaimana anda dapat melindungi kelas anda daripada terurai? Satu jawapan ialah Crema. Crema menggegarkan maklumat simbolik dalam .classfail anda sehingga tidak mudah terdedah kepada penyahkompilasi. Maklumat simbolik yang diceritakan oleh Crema merangkumi nama kelas, superclass, antaramuka, nama pemboleh ubah, kaedah, dan sebagainya. Nama-nama simbolik ini diperlukan oleh mesin maya Java (JVM) untuk menghubungkan kelas anda dengan pakej perpustakaan. Crema meneliti nama-nama simbolik ini dan merujuknya dengan cara yang sama sehingga JVM masih dapat mencapai penghubung yang betul antara kelas dan pakej.

Jadi bagaimana Crema berfungsi? Pada asasnya, sebelum menyebarkan fail kelas anda di Internet, jalankan Crema di dalamnya. Crema akan mengumpulkan maklumat simbolik yang terdapat di dalamnya, dan akan meletakkan setiap kelas baru di dalam fail 1.crema. Tugas anda kemudian adalah menamakan semula 1.cremasesuatu seperti filename.classsebelum menyebarkannya di Internet.

Mari jalankan Crema pada test.classcontoh yang ditunjukkan di atas, dan kemudian cuba menguraikannya dengan Mocha:

% java Crema -v test.class // -v adalah pilihan untuk menghidupkan mod verbose //. Terdapat banyak lagi pilihan. CREMA - Java Obfuscator - VERSI PENILAIAN Hak cipta (c) 1996 Hanpeter van Vliet Loading test.class Obfuscating test Menyimpan ujian sebagai 1.crema CATATAN: Kelas yang diproses dengan versi penilaian Crema hanya boleh digunakan di dalam negara, kerana kebanyakan penyemak imbas akan menolak memuatkannya. Untuk versi penuh Crema, arahkan penyemak imbas anda ke: //www.inter.nl.net/users/HPvan.Vliet/crema.html (lihat Sumber)

Perintah di atas telah menghasilkan fail baru 1.crema, yang mengandungi kod byte dengan maklumat simbolik yang diacak. Perhatikan bahawa Crema mempunyai banyak parameter pilihan baris perintah yang boleh anda gunakan; untuk maklumat lebih lanjut mengenai Crema, lihat bahagian Sumber.

Sekarang mari kita pindahkan fail itu test.classlagi dan nyahkompilasi menggunakan Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * pelanggaran segmentasi si_signo [11]: SIGSEGV 11 * pelanggaran segmentasi si_errno [0]: Ralat 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 dump utas penuh: "Finalis thread" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_thread_t: thread "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" pengendali jam "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main "(TID: 0xee3000a0, sys_thread_t .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitor Cache Dump: Dump Monitor Berdaftar: Selesaikan saya kunci giliran: kunci tanpa had Thread queue: unown Lock class: unown Java stack lock: unown Code rewrite lock: unown Heap lock: unown Mempunyai finalis queue lock: unown Monitor IO lock: unown Monitor kematian kanak-kanak: tanpa monitor Monitor acara: monitor I / O yang tidak dipakai: monitor Alarm yang tidak dipakai: tanpa nama Menunggu untuk diberitahu: "pengendali jam" Kunci Sbrk: kunci cache Monitor yang tidak diketahui: Pendaftaran monitor yang tidak dikenali: pemilik monitor: "utama" Penggera Thread Batalkan (inti dibuang)monitor Penggera yang tidak dikenali: tanpa nama Menunggu untuk diberitahu: "pengendali jam" Kunci Sbrk: Kunci cache monitor yang tidak dikawal: Pendaftaran monitor yang tidak dimiliki: pemilik monitor: Penggera Benang "utama" S: Batal (inti dibuang)Monitor Penggera yang tidak dikenali: tanpa nama Menunggu untuk diberitahu: "pengendali jam" Kunci Sbrk: Kunci cache monitor yang tidak dikawal: Pendaftaran monitor yang tidak dimiliki: pemilik monitor: Penggera Benang "utama" S: Batal (inti dibuang)

Seperti yang anda lihat dalam kod di atas, perkara pertama yang dikeluhkan oleh Mocha adalah NullPointerExceptionkerana ia keliru dengan maklumat simbolik. Oleh itu, matlamat kita untuk menjadikannya sukar untuk menyusun semula kod kita tercapai.

Harus diingat bahawa pengarang Mocha, Hanpeter van Vliet, juga pengarang Crema! Mocha diedarkan tanpa bayaran. Salinan penilaian Crema tersedia tanpa bayaran, tetapi versi lengkap adalah produk komersial.

Semasa menyebarkan kelas Java melalui Internet, anda dapat melindungi kod bytec Java anda dari risiko direkayasa terbalik. Contoh kod di atas menunjukkan bagaimana Mocha digunakan untuk melakukan penyahpompakan dan bagaimana Crema dapat menyelamatkan dengan mencegah aktiviti tersebut.

Qusay H. Mahmoud adalah pelajar siswazah dalam sains komputer di The University of New Brunswick, kampus Saint John, Kanada.

Ketahui lebih lanjut mengenai topik ini

  • Catatan EditorSejak kematian Mr. van Vliet (akibat barah), laman web yang ditubuhkannya untuk menyebarkan Mocha dan Crema sudah tidak lagi ada.
  • Laman pengedaran Eric Smith Mocha //www.brouhaha.com/~eric/computers/mocha.html
  • Crema di laman CERN //java.cern.ch:80/CremaE1/DOC/quickstart.html

Cerita ini, "Petua Java 22: Lindungi kod byte anda dari teknik / penyusunan semula terbalik" pada asalnya diterbitkan oleh JavaWorld.