1 / 14

Instrumentação de bytecode Java

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:

sonja
Download Presentation

Instrumentação de bytecode Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Problema • Como alterar um programa que já pode estar em execução?

  3. 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

  4. Tentativa #2 • Decompilar uma classe e mexer no código fonte decompilado. • Problemas: • Obfuscação dos .class

  5. 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

  6. Mas vamos por partes...

  7. 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

  8. 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.

  9. 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.

  10. 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

  11. 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

  12. 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.

  13. Exemplo • Classe Person e Main. • Demonstração

  14. 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

More Related