29
Java ja .NET Framework programmide kompileerimine masinkoodi Siim Karus

Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Embed Size (px)

Citation preview

Page 1: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java ja .NET Framework programmide kompileerimine

masinkoodi

Siim Karus

Page 2: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Kava• Sissejuhatus

– Mis on baitkood või vahekeel?– Võrdlus masinkoodiga– Koodi sogastamine– Masinkoodiks kompileerimine

• Java– Kuidas töötab Java?– Kuidas kompileerida Java baitkoodi masinkoodi?

• .NET Framework– Kuidas töötab .NET Framework?– MSIL?– Kuidas kompileerida .NET Framework vahekeelt

masinkoodiks?

Page 3: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Mis on baitkood?• Käivitatavat programmi sisaldav binaarfail,

mille moodustavad operatsiooni koodi ja andmete paarid (The Free On-line Dictionary of Computing ).

• Ka masinkood on tegelikult (enamasti) baitkood.

• Mõistet baitkood kasutatakse tihti märkimaks keeli, mis on inimese jaoks loetamatud kuid pole masinkood.

Page 4: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Mis on vahekeel?

• Keel, mis on teiste keelte vahel (näiteks ühest keelest teise transleerimiseks).

• Pole mõeldud otse programmeerimiseks.

• Lihtsalt dekompileeritav.

Page 5: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Interpreteeritav vahekeel vs. masinkood

Vahekeel• Võimalik käivitada

igal platvormil, millele on loodud interpretaator

• Reeglina sisaldab täiendavat informatsiooni programmi kohta

Masinkood• Optimeeritud oma

platvormile, seega kiirem oma platvormil

• Raskem dekompileerida

Page 6: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Miks kompileerida baitkood masinkoodiks?

• Jõudlusvõit

http://www.excelsior-usa.com/jetinternals.html

Page 7: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Miks kompileerida baitkood masinkoodiks?

• Mugavam paigaldus (pole vaja eraldi paigaldada interpretaatorit)

• Lihtsam kaitsta intellektuaalomandit (dekompileerimine, algoritmide eraldamine ja neist aru saamine on keerulisemad)– Lisaks kasutatakse koodi sogastamist

Page 8: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Koodi sogastamine

• Muudame meetodite, klasside ja nimeruumide nimed.

• Lisame täiendavaid “vigaseid” metaandmeid.

• Lisame koodjuppe, mida reaalselt ei käivitata.

• Krüpteerime koodijupid/sõned.

Page 9: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Koodi sogastamine

http://www.aisto.com/roeder/dotnet/

Page 10: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Koodi sogastamine (dotfuscator community edition)

http://www.aisto.com/roeder/dotnet/

Page 11: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Kompileerimine masinkoodiks

• Kasutusel kaks lahendust– JIT (Just-In-Time)

• Kompileeritakse hetkel mil koodi reaalselt kasutada on vaja

– AOT (Ahead-Of-Time)• Kompileeritakse enne koodi kasutamist

Page 12: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java = platvorm + keel

http://java.sun.com/j2se/1.5.0/docs/index.html

Page 13: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java rakenduste tööpõhimõte

• .java inimesele loetav lähtekood kompileeritakse javac abil Java baitkoodi.

• Käsuga java käivitatakse interpretaator (Java Virtual Machine ehk JVM), mis interpreteerib baitkoodi.

http://java.sun.com/docs/books/tutorial/getStarted/intro/definition.html

Page 14: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java baitkoodi kompileerimine masinkoodi (JHSVM)

• Java HotSpot Virtual Machine (J2SE SDK-ga kaasas, kasutab ka näiteks Bea) kompileerib tihedamini kasutatavad koodijupid– klient (java –client minu.class ) ja – server (java –server minu.class) mood

• Tegemist JIT kompilaatoriga

Page 15: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java baitkoodi kompileerimine masinkoodi (Excelsior JET)

• Excelsior JET kompileerib kogu koodi (AOT kompilaator)

• Võimaldab panna kompileeritud koodi suhtlema Java baitkoodis olevate klasside ja objektidega

• Viited Java API klassidele ja meetoditele asendatakse viidetega Excelsior JET enda teekidele

Page 16: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java baitkoodi kompileerimine masinkoodi (Excelsior JET)

Page 17: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Java baitkoodi kompileerimine masinkoodi (GCJ)

• GCJ kompileerib kogu koodi (AOT kompilaator)

• GCC (Gnu Compiler Collection) osa

• Vaba vabavaraline tarkvara

• Konsoolirakendus• gcj --main=HelloWorld -o HelloWorld

HelloWorld.java ./HelloWorld

• Seob Java C++-ga (GCC jaoks on Java C++ kärbitud versioon + API komponendid)

Page 18: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework = platvorm• Baseerub ECMA standarditel ja raportitel:

– CLI: • ecma-335, • TR-84 ja • TR-89

– C# (keel loodud spetsiaalselt .NET Framework jaoks):

• ecma-334

• tulevikus ISO/IEC.

http://www.mono-project.com/ECMA

European Computer Manufacturers Association

Common Language Infrastructure

International Organization for Standardization

International Electrotechnical Commission

Page 19: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework = platvorm• Algatajad olid Microsoft Corporation, Hewlett-

Packard ja Intel Corporation (1. oktoober 2000).• Arendamisest on osa võtnud veel Borland,

Fujitsu, Hewlett-Packard, Intel Corporation, International Business Machines, ISE, IT University Copenhagen, Microsoft Corporation, Monash University, Netscape, Novell Corporation, OpenWave, Plum Hall, Sun Microsystems ja University of Canterbury New Zealand

http://www.mono-project.com/ECMA

Page 20: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET keeledAPL Fortran Pascal C++ Haskell Perl C# Java Language Python

COBOL Microsoft JScript® RPG Component Pascal Mercury Scheme

Curriculum Mondrian SmallTalk Eiffel Oberon Standard ML Forth Oz Microsoft Visual Basic®

Page 21: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework

Page 22: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework rakenduste tööpõhimõte 1

1. Rakendus kompileeritakse MSIL failiks (tulemuseks .il fail).

2. Lisatakse “assembly-manifest” (fail sõltuvuste, metaandmete ja rakenduse turvainfoga seonduva infoga) ning lisatakse PE kood (tulemuseks .exe või .dll assembly). Samas optimeeritakse koodi. (ilasm)

3. Käivitades rakenduse .NET Framework kompileerib käivitatava koodi (JIT tüüpi kompilaator).

Page 23: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework rakenduste tööpõhimõte 1

• Tulemus:

Page 24: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework rakenduste tööpõhimõte 2

1. Rakendus kompileeritakse MSIL failiks (tulemuseks .il fail).

2. Lisatakse “assembly-manifest” (fail sõltuvuste, metaandmete ja rakenduse turvainfoga seonduva infoga) ning lisatakse PE kood (tulemuseks .exe või .dll assembly). Samas optimeeritakse koodi. (ilasm)

3. Loodud assembly kompileeritakse ngen abil masinkoodiks.

4. Käivitades rakenduse tegeleb .NET Framework vaid mälu haldamisega (ega interpreteeri koodi).

Page 25: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

.NET Framework “Assembly Cache”

• Kahte tüüpi vahemälu:– MSIL assembly cache

• Võib olla osaliselt kompileeritud JIT poolt• Lisab versioneeritud komponentide/moodulite

kasutamise võimaluse

– Native image cache• ngen tööriista (AOT kompilaator) poolt

kompileeritud (ja platvormile/riistvarale optimeeritud) moodulid ja komponendid

ngen = Native Image Generator Tool

Page 26: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

MSIL

• Punktiga algavad read on kompilaatori direktiivid.

• Ilma punktita algavad read sisaldavad MSIL käske.

• Meetodil tagastustüüp ja nimi, argumendid, sisu { ja } poolt eraldatud blokis.

• Sarnane assemblerile ja C++-le.

http://www.devcity.net/Articles/54/msil_1_intro.aspx

Page 27: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

MSIL• Näide:

.assembly AssemblyNimi {}

.method static void HelloWorld() {

.entrypointldstr “Hello World.”call void [mscorlib]System.Console::WriteLine(class

System.String)ret

}

• Kompileerime:ilasm HelloWorld.il

http://www.devcity.net/Articles/54/msil_1_intro.aspx

Märgib programmi käivitamisel käivitatavat meetodit

Paneb stringi pinusse

Kutsub mscorlib.dll nimeruumi System klassi Console meetodit WriteLineVäljub meetodist

Page 28: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

MSIL kompileerimine masinkoodi (Salamander)

• Salamander võimaldab kompileerida .NET Framework-i kasutava rakenduse masinkoodi kompileerides (staatiliselt) sisse ka kõik vajalikud lisakomponendid.

• Integreeritav Visual Studioga.

Page 29: Java ja.NET Framework programmide kompileerimine masinkoodi Siim Karus

Tänan

Küsimused?