Programavimas

„Java“ patarimas 22: Apsaugokite savo baitų kodus nuo atvirkštinės inžinerijos / dekompiliavimo

Jei rašote „Java“ klases ir platinate jas internete, turėtumėte žinoti, kad žmonės gali pakeisti jūsų klases, jas išardyti ar išskaidyti į „Java“ šaltinio kodą. Labiausiai naudojamas dekompiliatorius (bent jau viešai) yra „Mocha“. Mocha nuskaito vieną ar daugiau bytecodes (klasių) failų ir paverčia juos atgal į Java šaltinio kodus. Nors „Mocha“ sugeneruotas kodas nėra visiškai tas pats, kas pirminis šaltinio kodas, jis yra pakankamai arti, kad kažkas galėtų suprasti ir modifikuoti. Jei jus domina plėtoti „Java“ klases ir platinti jas internete - ir norėtumėte apsaugoti jas nuo suskaidymo - skaitykite toliau.

Mocha: pavyzdys

Prieš pristatydami „Crema“, mes apžvelgsime pavyzdį naudodami „Mocha“. Ši paprasta programa ekrane rodo eilutę „Sveiki!“:

klasės testas {public static void main (String argv []) {System.out.println ("Hi there"); }} 

Jei pirmiau nurodytos keturios eilutės buvo išsaugotos faile, testas.java, tada kompiliuojama testas.java sugeneruotų naują failą, testas.klasė, kuriame yra Java bytecodes, žymintys tą Java šaltinio kodą. Dabar paleiskime „Mocha“ klasės faile ir pamatykime „Mocha“ išvestį:

% java mocha.Decompiler test.class //% yra mano C apvalkalo raginimas UNIX. 

Pirmiau nurodyta komanda sukuria failą, vadinamą testas.mocha, kuriame yra „Mocha“ sugeneruotas „Java“ šaltinio kodas:

% daugiau test.mocha / * Sudarė Mocha iš test.class * / / * Iš pradžių sudaryta iš test.java * / import java.io.PrintStream; klasės testas {public static void main (String astring []) {System.out.println ("Hi there"); } testas () {}} 

Kaip matote iš aukščiau pateikto pavyzdžio, „Mocha“ mums suteikė „Java“ šaltinio kodą, kurį lengva skaityti ir suprasti. Jei nukopijuosite šį failą į testas.java, dar kartą sukompiliuokite ir paleiskite, jis sukompiliuos ir veiks puikiai.

Crema į pagalbą!

Taigi, kaip galite apsaugoti savo klases nuo suskaidymo? Vienas atsakymas yra „Crema“. „Crema“ koduoja simbolinę informaciją jūsų .klasė failus, kad jie taptų mažiau pažeidžiami dekompiliavimo. Simbolinėje informacijoje, kurią „Crema“ iššifruoja, yra klasės pavadinimas, jo superklasė, sąsajos, kintamųjų pavadinimai, metodai ir kt. Šie simboliniai pavadinimai reikalingi „Java“ virtualiai mašinai (JVM), kad susietų jūsų klases su bibliotekos paketais. „Crema“ šifruoja šiuos simbolinius pavadinimus ir daro nuorodas į juos tokiu pačiu būdu, kad JVM vis tiek galėtų pasiekti teisingą klasių ir paketų susiejimą.

Taigi, kaip veikia „Crema“? Iš esmės, prieš platindami klasės failus internete, paleiskite juose „Crema“. „Crema“ sukrapštys jose esančią simbolinę informaciją ir į failą įrašys kiekvieną naują klasę 1. krema. Tavo darbas tada yra pervadinti 1. krema į kažką panašaus failo pavadinimas.klasė prieš platindami jį internete.

Vykdykime „Crema“ testas.klasė aukščiau pateiktą pavyzdį, tada pabandykite jį dekompiliuoti naudodami „Mocha“:

% java Crema -v test.class // -v yra galimybė įjungti žodinį // režimą. Yra daug daugiau galimybių. CREMA - „Java Obfuscator“ - VERTINIMO VERSIJA Autorių teisės (c) 1996 m. Hanpeter van Vliet Įkeliant test.class Obfuscating test Išsaugojimo testas kaip 1. crema PASTABA: Klasės, apdorotos naudojant „Crema“ įvertinimo versiją, gali būti naudojamos tik vietoje, nes dauguma naršyklių atsisakys juos pakrauti. Norėdami rasti pilną „Crema“ versiją, nukreipkite savo naršyklę į: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (žr. Ištekliai) 

Pirmiau nurodyta komanda sukūrė naują failą, 1. krema, kuriame yra baitų kodai su užkoduota simboline informacija. Atminkite, kad „Crema“ turi daug komandinės eilutės parinkčių parametrų, kuriuos galite naudoti; daugiau informacijos apie „Crema“ rasite skyriuje „Ištekliai“.

Dabar perkelkime tą failą į testas.klasė dar kartą ir dekompiliuokite jį naudodami „Mocha“:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * segmentavimo pažeidimas si_signo [11]: SIGSEGV 11 * segmentavimo pažeidimas si_errno [0]: klaida 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Pilnas sriegio išvedimas: "Finalizer thread" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_xreadread0t gija "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" laikrodžio tvarkytuvas "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" pagrindinis "(TID: 0xee3000a0, sys_io 35_a0) .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitoriaus talpyklos išpardavimas: užregistruotas stebėjimo laikinas užraktas: užbaikite mane eilės užraktas: neturintis Klasės užraktas: neturintis „Java“ kamino užraktas: neturintis kodas Kodo perrašymo užraktas: neturintis Neapsaugotas krūvos užraktas: neturintis savybės H kaip užbaigimo eilės užraktas: neveikia Monitoriaus IO užraktas: neveikia Vaiko mirties stebėjimo priemonė: neveikia Įvykio stebėjimo priemonė: neveikia I / O monitorius: neveikia Signalizacijos monitorius: neveikia Laukia, kol bus pranešta: „laikrodžio tvarkyklė“ : monitoriaus savininkas: "pagrindinis" sriegio pavojaus signalas Q: nutraukti (šerdis išmestas) 

Kaip matote aukščiau pateiktame kode, pirmiausia Mocha skundžiasi: „NullPointerException“ nes buvo supainiota dėl simbolinės informacijos. Taigi, mūsų tikslas apsunkinti kodo dekompiliavimą yra pasiektas.

Pažymėtina, kad „Mocha“ autorius Hanpeter van Vliet yra ir „Crema“ autorius! Moka platinama nemokamai. Vertinimo „Crema“ kopiją galima gauti nemokamai, tačiau pilna versija yra komercinis produktas.

Skleisdami „Java“ klases internetu, galite apsaugoti savo „Java“ baitkodą nuo rizikos, kad bus sukurta atvirkščiai. Pirmiau pateikti kodų pavyzdžiai rodo, kaip „Mocha“ naudojama dekompiliacijai atlikti ir kaip „Crema“ gali padėti, užkertant kelią tokiai veiklai.

Qusay H. Mahmoudas yra magistras informatikos srityje Naujojo Bransviko universitete, Sent Džono miestelyje, Kanadoje.

Sužinokite daugiau apie šią temą

  • Redaktoriaus pastaba Nuo p. Van Vlieto mirties (nuo vėžio) nustojo egzistuoti jo sukurtos vietos „Mocha“ ir „Crema“ platinimui.
  • Erico Smitho „Mocha“ platinimo svetainė //www.brouhaha.com/~eric/computers/mocha.html
  • „Crema“ CERN svetainėje //java.cern.ch:80/CremaE1/DOC/quickstart.html

Šią istoriją „Java Tip 22: Apsaugokite savo baitekodus nuo atvirkštinės inžinerijos / dekompiliavimo“ iš pradžių paskelbė „JavaWorld“.