140 likes | 231 Vues
Explore methods to alter Java bytecode in runtime including manipulating class loaders and using libraries like ASM, BCEL, and Javassist for instrumentation. Learn about underlying issues and possible approaches with helpful references.
E N D
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: • 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
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