140 likes | 227 Views
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:
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