Pregunta

¿Hay una utilidad similar a OllyDbg / SoftIce para Java? Es decir. ejecutar la clase (del tarro / con la ruta de clase) y, sin el código fuente, mostrar el desmontaje del código intermedio con capacidad de paso a través / paso más / buscar referencias / código intermedio de edición específica en la memoria / aplicarán a editar el archivo ...

Si no es así, es incluso posible escribir algo como esto (suponiendo que estamos dispuestos a vivir sin punto de acceso para la duración de depuración)?

Edit: No estoy hablando de JAD JD o Cavaj. Estos son finas descompiladores, pero no quieren un decompilador por varias razones, más notable es que su salida no es correcta (en el mejor, a veces simplemente incorrecto llano). No estoy buscando un mágicas "bytes compilados a código Java" - Quiero ver los bytes reales que están a punto de ser ejecutado. Además, me gustaría la posibilidad de cambiar los bytes (igual que en un depurador de montaje) y, con suerte, escribir la parte trasera modificada en el archivo de clase.

Edit2: sé que existe javap - pero lo hace de una sola manera (y sin ningún tipo de análisis). Ejemplo (código tomado de la documentación vmspec): A partir de código Java, utilizamos "javac" para compilar la siguiente:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}

a un archivo .class de Java. Usando javap -c que puedo conseguir este resultado:

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn

Esto está bien para la parte desmontaje (no muy bueno sin análisis - "campo # 4 es Example.i"), pero no puedo encontrar las dos otras "herramientas":

  1. Un depurador que pasa sobre las mismas instrucciones (con la pila, volcados de memoria, etc), lo que me permite examinar el código real y el medio ambiente.
  2. Una forma de revertir el proceso -. Editar el código desensamblado y volver a crear el archivo .class (con el código editado)
¿Fue útil?

Solución

No creo que esto es realmente una respuesta completa, pero algunos indicadores que pueden proporcionar algo viable:

(1) en términos de visualización y directamente a trabajar con el viejo código de bytes BCEL Class Construction Kit puede ser útil (es el editor sólo GUI para bytecode yo sepa).

(2) en términos de la depuración y paso a paso por el código de bytes, este plugin de Eclipse , que se integra con el depurador de Eclipse pueden satisfacer sus necesidades.

No estoy al tanto de ningún servicio público que combinen estas características y le permiten manipular el código de bytes mientras se ejecuta el código (por lo menos de la misma manera que puedas en OllyDbg, etc.). Sin embargo, el Java depurador API debería haber capaz de soportar la manipulación del código en tiempo de ejecución (aunque, dada la naturaleza de HotSpot y JIT en general, no sé si sería posible volver a escribir una instrucción justo antes de que se invoca el código de operación --- código de bytes que se está ejecutando es realmente una abstracción de la forma en que escoge el intérprete para ejecutar el op, a diferencia de código nativo en el que el código de operación es desmontada, de hecho, la instrucción enviada a la CPU). Como alternativa, puede buscar en el de Java API instrumentación que proporciona una manera de redefinir el código de bytes en tiempo de ejecución. Y, por supuesto, cualquiera de las diversas bibliotecas de manipulación de código de bytes de código abierto puede ser capaz de proporcionar ayuda o inspiración.

Y, por supuesto, siempre existe la opción de de eludir toda la infraestructura de JVM y sólo conectar un depurador al proceso de JVM. Hay un poco de discusión de este en esta cuestión y en esta página enlazada desde esa pregunta .

La línea de fondo, sin embargo, es que lo que parece estar tratando de lograr, mientras que un lugar común en el mundo del código nativo, no es tan común una práctica en el mundo de Java (parte de la razón para usar Java es abstracción de todos los detalles sangrientos). Esto, y la naturaleza relativamente trivial de la descompilación de código de bytes (en comparación con, por ejemplo C ++) ha llevado a una situación en la que este tipo de requisito es escasa y también lo es este tipo de herramientas.

Otros consejos

Tome un vistazo a JAD Decomplier para descompilación del código Java. A continuación, puede ejecutar depurador integrado utilizando fuentes producidas de una IDE. IDE puede ser IntelliJ, Eclipse o NetBeans. Este enfoque no es completamente automática, pero debe hacer el trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top