Instrumentao de bytecode Java Eduardo Loureno Apolinrio Problema
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. Class. Loader e alterar, no mínimo, o método find. Class.
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/ithaggar_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) • 9/25/2021 ttp: //asm. objectweb. org/doc/tutorial-asm-2. 0. html • http: //www. csg. is. titech. ac. jp/~chiba/javassist/tutorial. html • http: //www-128. ibm. com/developerworks/java/library/j-onejar/ • http: //www-128. ibm. com/developerworks/java/library/j-dyn 0916. html • http: //www-128. ibm. com/developerworks/ibm/library/ithaggar_bytecode/ • http: //weblogs. java. net/blog/kellyohair/archive/2005/05/bytecode_instr u. html • http: //www. kevinboone. com/classpath. html
- Slides: 14