Problema de ocultación del código fuente de Java
El siguiente pasaje está tomado del libro "Introducción a la programación Java de teléfonos móviles/PDA", que puede usarse como una visión general del desempeño del ofuscador:
El autor No he usado DashO, por lo que no puedo evaluarlo. Haz una evaluación personal. Por lo tanto, el autor actualmente solo presenta productos que ha utilizado. El autor personalmente cree que, en términos de nivel de confusión, ZKM es el mejor, JAX es medio y RetroGuard y ProGuard son los peores. Obtienes lo que pagas. Esta es una verdad eterna. Desde un punto de vista funcional, tanto ZKM como JAX son buenos. Sin embargo, JAX es un producto desarrollado por IBM, por lo que hereda la mayoría de las características más importantes de los productos de IBM, que es "súper potente, pero puede que sea difícil de usar". Simplemente leer los archivos de configuración JAX es un gran problema.
A continuación se muestran varios ofuscadores representativos para comparar el rendimiento de sus productos. Usamos diferentes ofuscadores para ofuscar el mismo fragmento de código Java, enumerar los resultados de la descompilación del código ofuscado y brindar una experiencia de uso directa.
Código java original:
la clase pública SimpleBean implementa Serializable {
cadena privada[] nombre = {"nombre0", "nombre1", "nombre2", "nombre3"};
lista privada myList = null;
public void SimpleBean() {
myList = new ArrayList(4);
}
public void init_public() {
myList.add("nombre");
for(int i= 1; i < 4 ; i++){
init_private(i);
}
}
}
} p>
privado void init_private(int j) {
myList.add(nombre[j]);
}
}
writeObject privado vacío (java.io.ObjectOutputStream out)
lanza IOException {
}
}
I.ProGuard 4.5.1
ProGuard es un compresor, optimizador y ofuscador de archivos de clase Java gratuito. Puede encontrar y eliminar clases, campos, métodos y valores de atributos (propiedades) inútiles. También optimiza el código de bytes y elimina instrucciones inútiles. Finalmente, también cambia el nombre de clases, campos y métodos por nombres simples y sin sentido. Como resultado, los archivos jar se vuelven más pequeños y más difíciles de aplicar ingeniería inversa. Admite control de scripts, puede usar una interfaz GUI, las cadenas no están cifradas y es compatible con J2ME.
Ofuscadores de código abierto con funcionalidad similar:
RetroGuard yGuard (versión mejorada de RetroGuard) JODE
Jad descompila la clase ofuscada para obtener el código:
clase pública SimpleBean
implementa Serializable
{
public SimpleBean()
{
a_java_util_List_fld = nulo
}
public void SimpleBean()
{
a_java_util_List_fld = nuevo ArrayList(4);
}
public void init_public()
{
a_java_util_List_fld.add("nombre");
for(int i = 1; i < 4; i++)
{
int j = i;
SimpleBean simplebean = esto;
a_java_util_List_fld.add(simplebean.name);
a_java_util_List_fld.add(simplebean.name);
a_java_util_List_fld.add(simplebean.name)a_java_lang_String_array1d_fld[j]);
}
}
cadena privada a_java_lang_String_ array1d_fld[] = {
"nombre0", "nombre1", "nombre2", "name3"
};
Lista privada a_java_util_List_fld;
}
Ventajas:
1 .Interno Los métodos privados llaman a llamadas en línea, pero el efecto de ofuscación básicamente no se logra;
2. La documentación de uso es detallada y muchos ejemplos están escritos en el archivo de configuración de la opción de ofuscación;
3. Ofuscación La granularidad de las opciones es relativamente buena, puede usar la interfaz GUI, admitir la protección de métodos locales, etc.;
4. Admite j2me y se puede integrar en Eclipse;
5. Código abierto.
Desventajas:
1. La denominación de la ofuscación de símbolos es sugerente, la cadena no está cifrada y no existen otras medidas de ofuscación.
2. el Xlet y Midlet principal Para otras aplicaciones, los archivos de configuración pueden resultar complicados al ofuscar los archivos de la biblioteca.
2. Jocky
Jocky es el trabajo personal del Sr. Yuan Honggang, el líder de tecnología middleware de Kingdee (anteriormente conocido como JOC). Desarrollado originalmente para facilitar el desarrollo del servidor de aplicaciones Apusic, ahora está abierto para uso gratuito. El compilador de ofuscación Jocky se basa en el compilador JDK Java (javac) proporcionado por Sun. Completa la modificación del proceso de generación de código, ofusca el código intermedio generado por el compilador y finalmente genera el archivo de clase. La ofuscación solo requiere Hecho en un solo paso. En otras palabras, funciona directamente desde el código fuente, que es la mayor diferencia entre Jocky y otros compiladores ofuscados. Además, puede insertar instrucciones de conservación de símbolos en el programa fuente para controlar qué símbolos deben conservarse, integrando el proceso de ofuscación con el proceso de desarrollo sin la necesidad de un archivo de configuración de opción de ofuscación independiente. Las características anteriores de Jocky son más adecuadas para ofuscar bibliotecas de Java.
Jad descompila la clase ofuscada para obtener el código:
clase pública SimpleBean
implementa Serializable
{
público SimpleBean()
{
esto;
público SimpleBean()
{
esto;
String as[] = new String[4];
as[4];
as[0] = "nombre0";
como;
intercambio JVM INSTR
1;
"nombre1";
JVM INSTR aastore ; > p>
JVM INSTR dup;
intercambio JVM INSTR
2;
"nombre2";
JVM INSTR; aastore ;
JVM INSTR dup ;
JVM INSTR intercambio
3;
"nombre3";
JVM INSTR aastore ;
_$2;
_$1 = nulo;
retorno;
}
public void SimpleBean()
{
esto;
JVM INSTR nuevo #9
JVM INSTR dup ;
intercambio JVM INSTR
4;
ArrayList();
_$1;
}
public void init_public()
{
_$1.add("nombre");
for(int i = 1 ; i < 4; i++)
_$ 1(i);
}
vacío privado _$1(int i)
{
_$1.add(_$2[i]);
}
escritura vacía privadaObject(ObjectOutputStream objectoutputstream)
lanza IOException
{
}
cadena privada _$2[];
lista privada _$1;
}
Ventajas:
1.p>1. Además de la confusión de símbolos, se agrega confusión de datos (inicialización de la matriz de caracteres)
2. las declaraciones son contradictorias. Solo se pueden obtener instrucciones de código de bytes después de la compilación;
3. La compilación y la ofuscación se completan según el compilador de Java (javac) proporcionado por Sun JDK y no se requiere ofuscación.
4
Desventajas:
1. La opción de ofuscación es de grano grueso. Al usarla, es posible que necesites agregar la directiva @preserve en un código específico. para lograrlo, la cantidad es grande;
2. No hay confusión en el flujo de control.
3. Allatori 3.1_demo
Allatori es un ofuscador de segunda generación que puede proteger completamente sus derechos de propiedad intelectual.
Allatori tiene los siguientes tipos de protección: ofuscación de nombres, ofuscación de transmisiones, ofuscación de información de depuración, codificación de cadenas y tecnología de marcas de agua. Obfuscator es gratuito para proyectos educativos y no comerciales. La versión 2.1 admite los formatos de archivo war y ear y le permite agregar fechas de vencimiento para aplicaciones que requieren código ofuscado.
Jad descompiló el código obtenido de la clase ofuscada:
clase pública SimpleBean
implementa Serializable
{
public void init_public()
{
d.add(c.k("{u{0"))
{
d.add(c.k("{u{0"))k("{u{0"));
int i = 1;
ir a _L1
_L3:
H(i);
++i;
_L1:
4;
JVM INSTR icmplt 21;
ir a _L2 _L3
_L2:
}
public void SimpleBean() p >
{
d = new ArrayList(4);
}
private void H( int a)
{
d.add(c[a]);
}
public SimpleBean()
{
d = null;
}
private void H( ObjectOutputStream objectoutputstream)
lanza IOException
{
}
cadena privada c[] = {
c.k("\177q\177te"), c.k("\177q\177td"), c.k("\177q\ 177tg "), c.k("\177q\177tf")
};
Lista privada d;
}
Nota: c.k es un método estático de clase c, que además se genera para realizar el cifrado de cadenas.
Ventajas:
1. El diseño tuvo en cuenta el escenario de uso de archivos de biblioteca para ofuscar;
2 Se utilizó documentación detallada, en la configuración de la opción de ofuscación. file Escribió muchos ejemplos;
3. Además de la ofuscación de símbolos, también se utilizan dos ofuscaciones avanzadas: ofuscación de control (reescritura de bucles for) y cifrado de cadenas (inicialización de matriz de cadenas);
4. Las opciones de ofuscación son granulares y admiten protección de método parcial;
5. Admite tecnología de marca de agua, lo que permite agregar la fecha de vigencia al código que debe ofuscarse
6. Soporte j2me;
Desventajas:
1. Software comercial (precio adjunto), gratuito para uso educativo y no comercial (el enlace al sitio web es /price.html).
Apéndice: Precios
Licencia de desarrollador único
1 licencia $290
2-5 licencias $260
$230 para 6-10 licencias
$200 para más de 11 licencias
$3750 para licencia de sitio web
Certificado de licencia comercial $4850
Actualizaciones anuales de soporte $45
4. Zelix KlassMaster (ZKM)
Zelix KlassMaster es un mezclador comercial de Zelix Pty Ltd. Hay muy poca introducción a sus capacidades de ofuscación en la documentación oficial. Tiene funciones de protección de ofuscación de control y ofuscación de símbolos muy poderosas, admite protección de cifrado de cadenas complejas, ofuscación de pila, soporte de reconstrucción de excepciones, soporte de ofuscación incremental y soporte J2ME. Puede descargar una versión de prueba de Zelix KlassMaster.
V.DashO Pro
DashO Pro es un ofuscador comercial desarrollado por Preemptive Solutions. Una versión de evaluación gratuita está disponible para descargar. La protección de código DashO Pro es potente, fácil de usar, conveniente y flexible (software comercial, no de código abierto). DashO Pro tiene la capacidad de cambiar el nombre de las ID a caracteres sin sentido; ofuscar metadatos; cambiar el flujo de control, etc., ¡todo lo cual puede hacer que el código Java sea confuso y difícil de entender! .Las características del producto incluyen:
Mecanismo líder de protección del código fuente de Java;
Uso de tecnología patentada de inducción de sobrecarga para cambiar el nombre de paquetes/clases/métodos/campos;
Flujo avanzado controlar el mecanismo de ofuscación;
Cifrado de cadenas;
Evitar que el descompilador genere resultados útiles;
Marca de agua.
Software de marca de agua;
Eficiencia mejorada del código fuente de Java;
Sin clases/métodos/campos y eliminación completa de repositorios constantes;
Las optimizaciones a nivel de clase/método mejoran los resultados JIT;
Carga dinámica de clases detectadas;
Extensión e implementación de código fuente Java integral y eficiente;
Soporta todos los JDK versiones (JSE, J2EE, J2ME, etc.), incluida la 1.5;
Conversión automática de seguimiento de pila;
Empaquetado o jars de Java en la ruta especificada;
Admite cualquier tipo empaquetado de contenido Java: programas, bibliotecas, subprogramas, servidores pequeños, EJB, etc.
Admite arquitectura basada en J2ME CLDC, incluidos MIDP e iAppli.
Admite clases en la biblioteca de verificación previa de CLDC.
Se puede descargar desde la ruta especificada; , paquete comprimido o jar;
Admite exportar Java 100 % puro y verificarlo;
La interfaz de línea de comandos es adecuada para la integración en el entorno de compilación;
Fácil de usar basado en un archivo de configuración XML;
Guía de usuario completa y precisa en formato PDF.