para firmar firma electronica digitales codigo certificados certifica java jar reverse-engineering method-signature

electronica - java firmar jar



¿Cómo obtener firmas de métodos de un archivo jar? (7)

Tengo un archivo jar de terceros que viene con los javadocs solo para una parte de la API. ¿Hay alguna manera de aplicar ingeniería inversa al archivo jar para obtener una lista completa de clases y métodos?


Como dijo Scott, puedes usar Eclipse para obtener mucho de lo que estás buscando.

Recomendaría obtener el complemento JadClipse que descompilará los archivos .class sobre la marcha y le mostrará el código Java real a medida que navega por las clases en el IDE.


Puede usar la biblioteca WALA para leer todas las firmas de los métodos. Sin embargo, primero deberás cargar Stub-Code para Java. El siguiente programa debe leer en voz alta todas las firmas:

import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.types.ClassLoaderReference; import java.util.jar.JarFile; import java.io.IOException; import com.ibm.wala.ipa.cha.ClassHierarchyException; public class methods { public static void main(String[] args) throws IOException, ClassHierarchyException { AnalysisScope scope = AnalysisScope.createJavaAnalysisScope(); scope.addToScope(ClassLoaderReference.Primordial, new JarFile("jSDG-stubs-jre1.5.jar")); scope.addToScope(ClassLoaderReference.Application, new JarFile("myProgram.jar")); IClassHierarchy cha = ClassHierarchy.make(scope); for (IClass cl : cha) { if (cl.getClassLoader().getReference().equals(ClassLoaderReference.Application)) { for (IMethod m : cl.getAllMethods()) { String ac = ""; if (m.isAbstract()) ac = ac + "abstract "; if (m.isClinit()) ac = ac + "clinit "; if (m.isFinal()) ac = ac + "final "; if (m.isInit()) ac = ac + "init "; if (m.isNative()) ac = ac + "native "; if (m.isPrivate()) ac = ac + "private "; if (m.isProtected()) ac = ac + "protected "; if (m.isPublic()) ac = ac + "public "; if (m.isSynchronized()) ac = ac + "synchronized "; System.out.println(ac + m.getSignature()); } } } } }

Si usa la versión WALA adaptada desde here también lo hace Dalvik (por ejemplo, aplicaciones de Android).


Si está utilizando eclipse, simplemente puede agregarlo a la ruta de clase de un proyecto y explorarlo utilizando la vista de árbol y / o la asistencia de contenido.

Asumiría que otros IDEs pueden hacer algo similar.

Desde el punto de vista de la línea de comandos, puede abrirlo (jar xf foo.jar) y usar javap contra todos los archivos.


Una ayuda rápida para conocer los métodos de una clase normal (no una clase abstracta), hago lo siguiente.

nuevo nombre de clase (). presione ctrl + espacio para los métodos que figuran en eclipse.


Use Eclipse> Package Explorer para ver las clases y su jerarquía.

La Asistencia de contenido (función de autocompletar (ctrl + espacio)) también es una buena ayuda, pero no recomendaría el uso de una API no publicada


jar tf el contenido para ti. javap le permitirá ver más detalles de las clases (consulte la guía de herramientas).

Por ejemplo, si tiene una clase llamada mypkg.HelloWorld en un jar myjar.jar , ejecútelo como

javap -classpath myjar.jar mypkg.HelloWorld

Sin embargo, ¿está seguro de que desea utilizar estas API no publicadas? Por lo general es una muy mala idea.


  • Eclipse funcionaría muy bien

  • Un Java Decompiler volvería a traducir las clases en una semblencia de código fuente que podría estudiar para aprender sobre las clases, los métodos, sus firmas y tal vez incluso alguna información sobre valores válidos para algunos argumentos (por ejemplo, no pase un nulo para este argumento o activará una NullPointerException inmediatamente). Pero enrolle las mangas para abrir el tarro y ejecutar el descompilador en todos los archivos de clase. Esencialmente, esto es lo que Eclipse está haciendo por un texto de ayuda con clases no documentadas.

  • Finalmente, por supuesto, un "programador real" leería el byte-code directamente sin necesidad de un descompilador.