java virtual machine ( obfuscation and java )
DESCRIPTION
Java Virtual Machine ( Obfuscation and Java ). Пименов Александр 2004. What it is all about?. Идеология Java Classfile Константный пул Структура и идеология машины Идеология системы команд байт-кода Обфускация и Java Q&A. Java Technology ( Введение ). - PowerPoint PPT PresentationTRANSCRIPT
11
Java Virtual Java Virtual MachineMachine
((Obfuscation and JavaObfuscation and Java))
Пименов АлександрПименов Александр
20042004
22
What it is all about?What it is all about?
• Идеология Идеология JavaJava
• ClassfileClassfile– Константный пулКонстантный пул
• Структура и идеология машиныСтруктура и идеология машины
• Идеология системы команд байт-Идеология системы команд байт-кодакода
• Обфускация и Обфускация и JavaJava
• Q&AQ&A
33
Java TechnologyJava Technology((ВведениеВведение))• Java Java предложена фирмой предложена фирмой SUN MicrosystemsSUN Microsystems
– 1991 1991 г. г. James Gosling – James Gosling – язык язык OakOak– 1995 1995 г. Изменение названия на г. Изменение названия на JAVA JAVA и и
выпуск первой реализации - выпуск первой реализации - JDK 1.0JDK 1.0– 1998 1998 г. Платформа г. Платформа Java 2 ( SE, EE, ME)Java 2 ( SE, EE, ME)
• JavaJava код код::– ПереносимПереносим– Динамичен Динамичен – ПредсказуемПредсказуем– Объектно-ориентировананОбъектно-ориентированан
44
What is this all for?What is this all for?
H.JARDESKTOPDESKTOP
iPAQiPAQ
PALMPALM
SMARTPHONESMARTPHONE
CELLPHONECELLPHONE
EMBEDDED EMBEDDED MEDICAL SYSTEMMEDICAL SYSTEMWEB SERVERWEB SERVER
SMART HOUSESMART HOUSE
VMVM
55
Путь кодаПуть кода в в JAVAJAVA
b.java
b.java
a.java
JAR(jar)ZIP
b. class
b. class
a.class
Compiler(other)
e.other e.class
f.png
g.txt
Manifest.mf
Compiler(javac)
H.JAR
ExternalExternalVerifierVerifier
Ob
fusca
tor
Ob
fusca
tor
66
OOP (JIC)OOP (JIC)DrawableDrawable
Draw()Draw()
SetColor()SetColor()
ChessBoardChessBoard
Draw()Draw()
SetColor()SetColor()
PawnPawn
Draw()Draw()
SetColor()SetColor()
MoveableMoveable
SetPosition()SetPosition()
ValidatePos()ValidatePos()
ValidatePos()ValidatePos()
FigureFigure
Draw()Draw()
SetColor()SetColor()
ValidatePos()ValidatePos()
2DPoint Pos2DPoint Pos
77
CLASS FILECLASS FILE
88
Classfile structureClassfile structure((идеалогияидеалогия))• Программные компоненты Программные компоненты Java Java
распространяются в виде набора распространяются в виде набора classfileclassfile-ов (или их архивов -ов (или их архивов JARJAR))– Наследование структуры Наследование структуры JAVAJAVA
•ИнкапсуляцияИнкапсуляция
– Полная платформонезависимостьПолная платформонезависимость– Позднее связываниеПозднее связывание– Динамическая загрузка программных Динамическая загрузка программных
компонентовкомпонентов
99
Classfile structureClassfile structure((метафораметафора))• Каждый Каждый classfile – classfile – представляет данные представляет данные
одного класса или интерфейсаодного класса или интерфейса• Он не обязан содержать никаких данных о Он не обязан содержать никаких данных о
символическом представлении своего класса символическом представлении своего класса или интерфейсаили интерфейса
• Classfile – Classfile – это полностью это полностью стандартизированный поток байт (big-endian)стандартизированный поток байт (big-endian)
• До критического момента До критического момента classfile – classfile – это это просто данныепросто данные
Classfile Classfile
JAVA JAVA
1010
Classfile structureClassfile structure((что содержитчто содержит))
• Пул константПул констант• Тип класса (доступ, наследование итп)Тип класса (доступ, наследование итп)• Ссылку на класс-предок (суперкласс)Ссылку на класс-предок (суперкласс)• Набор поддерживаемых интерфейсовНабор поддерживаемых интерфейсов• Описания полейОписания полей
– Атрибуты полейАтрибуты полей
• Описания методовОписания методов– Атрибуты методовАтрибуты методов
• Описания атрибутовОписания атрибутов
1111
Classfile structureClassfile structure((константный пулконстантный пул))• Набор записей позволяющих разрешать ссылки Набор записей позволяющих разрешать ссылки
при связывании и выносить констнты из кодапри связывании и выносить констнты из кода• Экономит место объединяя одинаковые Экономит место объединяя одинаковые
константыконстанты• ХранитХранит
– Константы (Константы (int, float, long, double, int, float, long, double, строки строки UTF8UTF8))– Ссылки на символические названия внешних объектов Ссылки на символические названия внешних объектов
(методов, функций, классов)(методов, функций, классов)
• Максимальный размер констпула 2Максимальный размер констпула 2^16^16• Константный пул разрешают в процессе Константный пул разрешают в процессе
исполненияисполнения
1212
ПримерПримерTYPE
class_index
name_and_type_index
10
12
18
TYPE
name_index
7
14
TYPE
length
1
9
bytes test/test1TYPE
name_index
12
22
descriptor_index 26TYPE
length
1
7
bytes callIfFailed
TYPE
length
1
9
bytes (IDLtest/test2;)Ljava/lang/Object
CONSTANT_Methodref_info
CONSTANT_Class_info
COCONSTANT_NameAndType_info
CONSTANT_Utf8_info
1313
AttributesAttributes
• SourceFileSourceFile - - описание исходникаописание исходника• ConstantValue – описание константыConstantValue – описание константы• Code –описание кодаCode –описание кода• Exceptions – список исключений кидаемых методомExceptions – список исключений кидаемых методом• InnerClasses – список внутрених классов из других InnerClasses – список внутрених классов из других
пакетовпакетов• Synthetic – отметка о том что член класса отсутствовал Synthetic – отметка о том что член класса отсутствовал
в исходникев исходнике• LineNumberTable – список ссылок на номера строкLineNumberTable – список ссылок на номера строк• LocalVariableTable – список имен локальных переменныхLocalVariableTable – список имен локальных переменных• Deprecated – отметка о том что член или класс Deprecated – отметка о том что член или класс
вытеснен (перегружен)вытеснен (перегружен)
1414
Methods and attributesMethods and attributes
method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; }
attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length]; }
Code_attribute { u2 attribute_name_index; u4 attribute_length; u2 max_stack; u2 max_locals; u4 code_length; u1 code[code_length]; u2 exception_table_length; {
u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type;
} exception_table[exception_table_length];u2 attributes_count; attribute_info attributes[attributes_count]; }
1515
JVMJVM
1616
Спецификация Спецификация JVMJVM
• В всей полноте описывает «что?»В всей полноте описывает «что?»
• Не описывает «как?» Не описывает «как?»
1717
JVM SubsystemsJVM Subsystems
GC
Verifier
Interpeter/JITC
Profiler?
ИсполняетИсполняетСобирает Собирает мусормусор
Ищет узкие Ищет узкие местаместа
Ведет Ведет статическую статическую
предпроверкупредпроверку
1818
JVM JVM (структура (структура JAVA JAVA машины)машины)
• МногопоточностьМногопоточность
• Поддержка исключенийПоддержка исключений
• Модель абстрактной памяти Модель абстрактной памяти построенной на ссылках на объектыпостроенной на ссылках на объекты
• Автоматическая сборка мусораАвтоматическая сборка мусора
• Строгая типизированость Строгая типизированость предполагаетсяпредполагается
1919
JVM JVM (структура (структура JAVA JAVA машины)машины)
• JVM – JVM – абстактная стековая машина с абстактная стековая машина с локальными переменнымилокальными переменными
• Каждый поток в Каждый поток в JVM JVM имеет свой имеет свой стек стек «вызов»«вызов» заполняемый фреймами заполняемый фреймами
• JVM JVM оперирует соперирует с::– Стеком операндов (текушие подсчеты)Стеком операндов (текушие подсчеты)– Локальными переменными + Локальными переменными +
параметрамипараметрами– Статическими переменнымиСтатическими переменными
2020
JVMJVM
Thread 1Thread 1
Thread 2Thread 2
JVM
Op S
tack
Loca
l Varia
ble
s
Para
mete
rs
Frame1Frame1JV
M O
p S
tack
Loca
l Varia
ble
s
Para
mete
rs
Frame2Frame2
JVM
Op S
tack
Loca
l Varia
ble
s
Para
mete
rs
Frame1Frame1
JVM
Op S
tack
Loca
l Varia
ble
s
Para
mete
rs
Frame3Frame3
JVM
Op S
tack
Loca
l Varia
ble
s
Para
mete
rs
Frame2Frame2
Runtime constpoolRuntime constpool
2121
MEMORY
HEAP
Thread 1
JVMJVMThread 2
FRAME2
ALU
FRAME2
FRAME1FRAME1
FRAME STACK (call stack)
FRAME3JVM Op Stack
JVM Op Stack
FRAME1
2222
BYTE codeBYTE code((КонцепцииКонцепции))• Байткоды имеют опкод в 8 бит и Байткоды имеют опкод в 8 бит и
расширяются байтоворасширяются байтово• Байткоды имеют структуру кеширующю Байткоды имеют структуру кеширующю
пространствопространство• Есть свободные байткодыЕсть свободные байткоды• Есть сложные и простые байткоды (Есть сложные и простые байткоды (IS IS
неоднороден)неоднороден)– Со всеми вытекающимиСо всеми вытекающими
• Машина работает с данными размером Машина работает с данными размером 8, 32, 64 бита8, 32, 64 бита
2323
BYTE codeBYTE code((Типы данныхТипы данных))
• byte - 8-bit знаковое целое byte - 8-bit знаковое целое • sshort - 16-bithort - 16-bit знаковое целое знаковое целое • iint nt - - 32-bit32-bit знаковое целое знаковое целое • long long -- 64-bit знаковое целое 64-bit знаковое целое • char char -- 16-bit без 16-bit без знаковое для представления знаковое для представления
UNICODEUNICODE • floatfloat• doubledouble
2424
BYTE codeBYTE code(типы)(типы)• Работа с константамиРабота с константами• Push Push байт-кодыбайт-коды• Сохранение и загрузка локальных переменныхСохранение и загрузка локальных переменных• Pop Pop байт-коды и работа со стекомбайт-коды и работа со стеком• Арифметические операцииАрифметические операции• Операции сравнения и условных переходов, операции Операции сравнения и условных переходов, операции
вызовов, операции перехода по таблицевызовов, операции перехода по таблице• Операция безусловного переходаОперация безусловного перехода• Операции загрузки статических и динамических полейОперации загрузки статических и динамических полей• Создания новых объектов, массивов, проверка приведения Создания новых объектов, массивов, проверка приведения
типовтипов• Броски исключенийБроски исключений• Захват и освобождение мониторовЗахват и освобождение мониторов• Быстрая проверка на нольБыстрая проверка на ноль• Длинные переходы и длинные загрузкиДлинные переходы и длинные загрузки
2525
Size reductionSize reduction00 00 00 00 00 00 11 00iconst_m1iconst_m1
iconst_niconst_nn = if (x < 9 && x > 3) then x – 3 else n = if (x < 9 && x > 3) then x – 3 else OTHER_OPCODEOTHER_OPCODE
push (byte)npush (byte)n
push (byte)-1push (byte)-1
bipushbipush
00 00 00 00 xx xx xx xx
xx xx xx xx xx xx xx xx00 00 00 11 00 00 00 00
sipushsipush
xx xx xx xx xx xx xx xx00 00 00 11 00 00 00 11 xx xx xx xx xx xx xx xx
push xpush x
push xpush x
ldcldc
xx xx xx xx xx xx xx xx00 00 00 11 00 00 11 00
ldc_wldc_w
xx xx xx xx xx xx xx xx00 00 00 11 00 00 11 11 xx xx xx xx xx xx xx xx
push CONST_POOL[x]push CONST_POOL[x]
push CONST_POOL[x]push CONST_POOL[x]
2626
VierifierVierifier
• invoke virtualinvoke virtual– Метод ДОЛЖЕН БЫТЬ этого класса Метод ДОЛЖЕН БЫТЬ этого класса
или класса предка. или класса предка.
• А кто проверит?А кто проверит?– verifierverifier– В В runtimeruntime
2727
JITJIT
• Pros vs ConsPros vs Cons– Time – 2x-40x fasterTime – 2x-40x faster– Memory Overhead – 5x-10xMemory Overhead – 5x-10x
• CompilationCompilation– JIT Just-In-TimeJIT Just-In-Time– AOT Ahead-Of-TimeAOT Ahead-Of-Time– HI Hotspot ImplementationsHI Hotspot Implementations
2828
Garbage collectionGarbage collection((общие мыслиобщие мысли))• Мусор в Америке – федеральная собственностьМусор в Америке – федеральная собственность• А некоторые считают – это для склеротиковА некоторые считают – это для склеротиков
• Нет нужды явно освобождать Нет нужды явно освобождать память... машина сделает это самапамять... машина сделает это сама
• Представьте себе сервер и утечку Представьте себе сервер и утечку памяти в нем...памяти в нем...
• Если воспринимать исключения как Если воспринимать исключения как необходимость, надо как необходимость, надо как необходимость воспринимать и необходимость воспринимать и сборку мусора сборку мусора
2929
ObfuscationObfuscation
3030
Obfuscation and JavaObfuscation and Java
• ProsPros– Она на самом деле необходимаОна на самом деле необходима– Java Java машина очень распростаненамашина очень распростанена– Обфускация экономит местоОбфускация экономит место
• Cons Cons – Reflection Reflection может работать неверноможет работать неверно– Идеалогия Идеалогия Java Java против обфускациипротив обфускации
3131
DecompilersDecompilers
• GotoGoto
• Бывает класс «Бывает класс «forfor»» и и ««synchronizedsynchronized»» в байт-кодев байт-коде но не но не бывает таких классов в бывает таких классов в JavaJava
• Что навсегда потеряно, того уж не Что навсегда потеряно, того уж не вернешь. Старые имена и связи не вернешь. Старые имена и связи не восстановить, если они восстановить, если они уничтоженыуничтожены
3232
DecompilersDecompilers
int tmp;int tmp;tmp = a;tmp = a;a = b;a = b;b = tmp;b = tmp;
iload_0iload_0istore_2istore_2iload_1iload_1istore_0istore_0iload_2iload_2istore_1istore_1
iload_0iload_0iload_1iload_1istore_0istore_0istore_1istore_1
b = ab = aa = ba = b
ОптимизаторОптимизатор
А бывает они даже А бывает они даже разваливаются….разваливаются….
3333
Obfuscation - Names and Obfuscation - Names and profiles profiles (Retroguard)(Retroguard)• GNU GPLGNU GPL
• СкриптовыйСкриптовый
3434
Names and profiles Names and profiles (JODE)(JODE)
• GNU GPLGNU GPL
• Переименование классов, методов и Переименование классов, методов и полейполей
• Удаление отладочной информации Удаление отладочной информации
• Удаление «мертвого» кода (классов, Удаление «мертвого» кода (классов, методов, полей)методов, полей)
• Оптимизация выделения локальных Оптимизация выделения локальных переменныхпеременных
• Есть декомпиляторЕсть декомпилятор
3535
Names and profiles Names and profiles (SandMark)(SandMark)
• Работа Аризонского университета Работа Аризонского университета – выполняет watermarking, tamper-– выполняет watermarking, tamper-proofing и code obfuscation proofing и code obfuscation
• Основан на алгоритмах Основан на алгоритмах by by Venkatesan, Collberg, Stern, and Venkatesan, Collberg, Stern, and othersothers
3636
Names and profiles Names and profiles ((DashODashO))• CommercialCommercial• Sun’s choiceSun’s choice• FeaturesFeatures
– Package/Class/Method/Field renaming using our Package/Class/Method/Field renaming using our patented Overload-Induction(tm) renaming patented Overload-Induction(tm) renaming system system
– Unused Class/Method/Field and constant pool Unused Class/Method/Field and constant pool entry removal entry removal
– Advanced Control Flow Obfuscation Advanced Control Flow Obfuscation – String Encryption String Encryption – Class and method level optimization to improve Class and method level optimization to improve
JIT performance JIT performance
3737
Сокрытие Сокрытие именимен
((name name manglingmangling))
Изменение Изменение потока потока исполенияисполения
(code mangling)(code mangling)
Кодирование Кодирование строк (строк (strings strings enscriptionenscription))
RetroguarRetroguardd
??
SandMarkSandMark ?? ??
DashO DashO
JODEJODE ??
Names and profilesNames and profiles
3838
Where is more information Where is more information available?available?• Исчерпывающая информация о Исчерпывающая информация о Java Java машине содержится в машине содержится в
спецификации спецификации SUN SUN и больше мало гдеи больше мало где: : – httphttp://sunsite.nstu.ru/java-stuff/vmspec/://sunsite.nstu.ru/java-stuff/vmspec/
• Информация о статистике и Информация о статистике и classfile classfile – ftpftp://://ftp.cs.arizona.eduftp.cs.arizona.edu//reportsreports/2004/TR04-11.pdf/2004/TR04-11.pdf
• Различные обфускаторыРазличные обфускаторы– http://www.retrologic.com/retroguard-docs.htmlhttp://www.retrologic.com/retroguard-docs.html– http://sandmark.cs.arizona.edu/publications.htmlhttp://sandmark.cs.arizona.edu/publications.html– httphttp://://www.preemptive.comwww.preemptive.com//productsproducts//dashodasho//Features.htmlFeatures.html
3939
THE ENDTHE END
Спасибо за вниманиеСпасибо за внимание
4040
Q & AQ & AТеперь совсем конецТеперь совсем конец