Pregunta

Tengo un archivo jar extraña, que contiene alguna clase que cuando uso JD Decompiler, se muestra un segmento de esta manera:

public final void a(ak aa) {
    this.jdField_a_of_type_Ak = aa;
}

public final void a(cn ccn) {
  this.jdField_a_of_type_Cn = ccn;
}

public final cN a() {
  return this.jdField_a_of_type_CN;
}

public final void a() {
  super.b();
}

public final boolean a() {
    return this.jdField_a_of_type_Boolean;
}

Me pregunto por qué una / un compilador / Ofuscador producto puede un código de bytes de clases de esa manera, me refiero a la firma del método. No cualquiera sabe un ofuscador puede hacer esto?

¿Fue útil?

Solución

@Joachim Sauer correctamente señala : La JVM especificación poses menos restricciones a la sobrecarga de métodos en el código de bytes de los JLS hace en los programas de Java.

Desde el JVM Specification (Sección 4.6 , Métodos) :

No hay dos métodos en un solo archivo de clase pueden tener el mismo nombre y el descriptor (§4.3.3).

Y un descriptor procedimiento incluye el tipo de retorno: ( 4.3.3 Método Descriptores )

MethodDescriptor:
( ParameterDescriptor* ) ReturnDescriptor

Los métodos que usted ha mencionado en su pregunta todos tienen descriptores distintos, por lo que están bien:

public final void a(ak aa)     ->     (Lsomepkg1/ak;)V
public final void a(cn ccn)    ->     (Lsomepkg2/ccn;)V
public final cN a()            ->     ()Lsomepkg3/cN;
public final void a()          ->     ()V
public final boolean a()       ->     ()Z

Este es hábilmente explotada por ofuscadores. Un código de bytes-programa válido ya no tiene una "directamente correspondiente" programa Java. ProGuard hace esto, por ejemplo. Aquí hay un fragmento de su manual de:

-overloadaggressively
Especifica que se aplican sobrecarga agresivo, mientras que la ofuscación. Múltiples campos y métodos se pueden obtener los mismos nombres, , siempre y cuando sus argumentos y tipos de retorno son diferentes (no sólo sus argumentos) .

Existen otras técnicas similares usando, por ejemplo, la instrucción de código de bytes jsr o utilizando identificadores de variables que son palabras reservadas en el lenguaje Java. Aquí es una página del listado de algunas técnicas.


Para contestar el seguimiento obvia pregunta:? ¿Cómo funciona el saber qué método JVM a la llamada a la llamada in situ

Los invocación-instrucciones requieren que se especifique una referencia a una firma de método completo, (incluyendo el tipo de retorno del método) que se va a llamar.

Otros consejos

Los soportes de código de bytes de Java construcciones que no son válidos en el código fuente de Java. Obfuscators explotan ese hecho mediante la modificación de código de bytes para utilizar esos constructos (mientras que todavía da el mismo resultado que el código de bytes no-ofuscado).

... Un ofuscador produce nombres / firmas de los métodos de esta manera porque eso es su trabajo. Cualquier Ofuscador debe trabajar para este propósito.

La clase ha sido compilada sin información de depuración (por lo menos la información variable local no se encuentra) y ofuscado más tarde.

Una estrategia básica ofuscación es reemplazar (casi) todo el paquete, clase y methodnames por nuevos nombres, sin sentido, por lo que no se puede entender el código descompilación.

estrategias adicionales se ofuscar cuerdas y la adición de construcciones de código de bytes que no se puede descompilado al código java.

Usted todavía será capaz de crear un equivalente de código java para el archivo de clase ofuscado pero sólo con gran esfuerzo.

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