Instrumentação de bytecode Java
description
Transcript of Instrumentação de bytecode Java
Instrumentação de bytecode Java
Eduardo Lourenço Apolinário
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:– 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
Tentativa #2
• Decompilar uma classe e mexer no código fonte decompilado.
• Problemas:– Obfuscação dos .class
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
Mas vamos por partes...
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
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.
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.
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
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
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.
Exemplo
• Classe Person e Main.• Demonstração
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