instrumentação de bytecode java

14
Instrumentação de bytecode Java Eduardo Lourenço Apolinário

Upload: sonja

Post on 19-Jan-2016

26 views

Category:

Documents


0 download

DESCRIPTION

Eduardo Lourenço Apolinário. Instrumentação de bytecode Java. Problema. Como alterar um programa que já pode estar em execução?. Tentativa #1. Alterar o código fonte e tentar recompilar o código (fazendo parsing pra achar o método main, etc). Problemas: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Instrumentação de bytecode Java

Instrumentação de bytecode Java

Eduardo Lourenço Apolinário

Page 2: Instrumentação de bytecode Java

Problema

• Como alterar um programa que já pode estar em execução?

Page 3: Instrumentação de bytecode Java

Tentativa #1

• Alterar o código fonte e tentar recompilar o código (fazendo parsing pra achar o método main, etc).

• Problemas:– O usuário não (re)compila os fontes de um

programa– Em programas proprietários, o fonte não está

disponível

• Abordagem ingênua

Page 4: Instrumentação de bytecode Java

Tentativa #2

• Decompilar uma classe e mexer no código fonte decompilado.

• Problemas:– Obfuscação dos .class

Page 5: Instrumentação de bytecode Java

Tentativa #3

• Alteração do Extensions Class Loader para patching de classes do core.

• Para isntrumentação de bytecode java, algumas alternativas:– Asm– BCEL– SERP– Javassist

Page 6: Instrumentação de bytecode Java

Mas vamos por partes...

Page 7: Instrumentação de bytecode Java

Divisão dos Class Loaders

• Bootstrap Class Loader– Diretórios e arquivos JAR listados na

propriedade do sistema sun.boot.class.• Pode ser manipulado com -Xbootclasspath

• Extensions Class Loader– Diretórios e arquivos listados em java.ext.dirs,

que geralmente aponta pra lib/ext do JRE.• Comando: -Djava.ext.dirs=<path>

• Application Class Loader– Diretórios listados em java.class.path, que é o

CLASSPATH

Page 8: Instrumentação de bytecode Java

Mas por que o Extensions ?

• As classes em Java são carregadas do bootstrap pra baixo, ou seja, primeiro o bootstrap tenta, depois o extensions, depois o application.

• É mais complicado alterar o Bootstrap class loader.

• Poderia alterar o application, mas ficaria preso a uma só aplicação.

Page 9: Instrumentação de bytecode Java

O Class Loader

• Carrega as classes, logo, é um ponto fundamental de um sistema java.

• Não é difícil construir um class loader, basta herdar de java.lang.ClassLoader e alterar, no mínimo, o método findClass.

Page 10: Instrumentação de bytecode Java

Instrumentação de bytecode

• Alteração de bytecode java• ASM:

– Biblioteca muito pequena, com ótima performance e, o melhor, de fácil utilização

– Plugins para eclipse

• BCEL:– Projeto da Apache– Mais antigo– Tamanho 10 vezes maior que a ASM,

performance 700% menor

Page 11: Instrumentação de bytecode Java

Instrumentação de bytecode

• Javassist:– Tem facilidades de alteração de bytecode via

código java.– Projeto do JBoss– É muito maior que as outars bibliotecas– Performance entre 400% e 500% menor que a

ASM

Page 12: Instrumentação de bytecode Java

Tá, mas qual eu escolhi?

• Testei o ASM e o Javassist• O ASM te força a entender dos bytecode

java (que não é difícil de entender, vide http://www-128.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

• Como dito anteriormente, o javassist é quase uma mãe.

Page 13: Instrumentação de bytecode Java

Exemplo

• Classe Person e Main.• Demonstração

Page 14: Instrumentação de bytecode Java

Referências

• Covert Java, 2004, Sams Publishing

• Manning - Java Reflection in Action (2005)

• Addison-Wesley - Component Development for the Java Platform (2002)

• ttp://asm.objectweb.org/doc/tutorial-asm-2.0.html

• http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html

• http://www-128.ibm.com/developerworks/java/library/j-onejar/

• http://www-128.ibm.com/developerworks/java/library/j-dyn0916.html

• http://www-128.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

• http://weblogs.java.net/blog/kellyohair/archive/2005/05/bytecode_instru.html

• http://www.kevinboone.com/classpath.html