Instrumentação de bytecode Java

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

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 of Instrumentação de bytecode Java

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