Home
Descargar - Universidad de Sevilla
Contents
1. O aload 0 les ldc 25 String PRUEBA DE OFUSCACION 3 putfield 8 Field a Ljava lang String 6 aload_0 is getfield 8 Field a Ljava lang String 10 areturn private int a Code O aload 0 Ts getfield 9 Field a I 4 iconst_0 5 iconst_1 6 iastore ws aload_0 8 getfield 9 Field a I 11 iconst_0 12 iaload 13 return 35 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Progarama 3 4 Bytecode de a class Compiled from null final class a extends java lang Object public a Code O aload 0 Teg invokespecial 3 Method java lang Object lt init gt V 4 iconst_0 5 istore 1 6 return public final java lang String a java lang String Code 0 aload_1 1 areturn Comparando con los bytecodes originales podemos evaluar la m trica disefiada Ver tabla 3 5 EJENPLO 1 EJENPLO EJEMPLO toluca EJEMPLO toluca M TRICA PUNTUACI N E ER Protected pruebaOfus compos AS campos ver fs Encriptado de Strin ERUEDS DE FPRUEBADE P 8 OFUSCACION OFUSCACION vector Datos Puntuacion para Ofuscacion de Layout y Datos Tabla 3 5 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 1 3 Ofuscaci n de Ejemplo 2 Proguard 3 2 no realiza ofuscaci n de Control de Flujo no est especificado ni como opci n en l nea de comandos ni tampoco mediante el uso de l
2. none MERGED CLASSES none INLINED METHODS none OPTIMIZED BYTE CODE optimized method code Testl main Ljava lang String V optimized method code Testl lt init gt V optimized method code Testl pruebaOfus Ljava lang String optimized method cod Testl getVector I optimized method code Hola lt init gt V optimized method code Hola getHola Ljava lang String Ljava lang String RENAMED PACKAGES none 82 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java RENAMED CLASSES class Hola gt a RENAMED METHODS meth Hola getHola Ljava lang String Ljava lang String gt a meth Testl getVector I gt a meth Testl pruebaOfus Ljava lang String gt a RENAMED FIELDS field Testl aux gt b field Testl hello gt a field Testl vector gt c REMOVED DEBUG INFOS from class Testl from class Hola Programa 3 32 Archivo de resultados del proceso JoGaResults txt RRA JOGA RESULTEILE HAEA AEE AEE AE AE AE AE AEA EE EEH optimised D Temp prueba 2 files processed CLASSES before 2 after 2 gt removed 0 METHODS before 6 after 6 gt removed 0 FIELDS before 3 after 3 gt removed 0 SIZE
3. protected java lang String if Code O aload 0 a3 ldc 22 String PRUEBA DE OFUSCACION 33 putfield 8 Field a Ljava lang String 6 aload 0 7 getfield 8 Field a Ljava lang String 10 areturn private int al Code 0 aload 0 1 getfield 9 Field do I 4 iconst_0 Ds iconst_1 6 iastore Ti aload 0 8 getfield 9 Field do 1 11 iconst_0 12 iaload 13 return Programa 3 11 Bytecode a class class a extends java lang Object public a Code 0 aload 0 Ls invokespecial 1 Method java lang Object lt init gt V 4 iconst_1 Di istore 1 6 return public java lang String a java lang String Code 0 aload_1 Ls areturn Despu s de comparar podemos hacer la evaluaci n de la m trica dise ada Ver tabla 3 7 45 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java EJEMPLO 1 sin 1 EJEMPLO 1 sin EJEMPLO 1 ofuscado METRICA PUNTUACION DC IN E AA E a AS rico p m Campos a Campos vee y oeei PRUEBANDE PRUEBA DE le Sarat 8 OFUSCACION OFUSCACION vector Datos Puntuaci n para Ofuscacion de Layout y Datos Tabla 3 7 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 3 3 Ofuscaci n de Ejemplo 2 Javaguard no realiza ofuscaci n de Control de Flujo Es una opci n no disponible Por tanto puntuamos con un 0 la m trica individual correspond
4. public class generadorAleatorios int semilla Random random public generadorAleatorios int i generadorAleatorios this semilla i long 1 new Long long i 1ongValue generadorAleatorios this random new Random 1 public int generaEnteroAleatorio return generadorAleatorios this random nextInt public long generaLongAleatorio long 1 generadorAleatorios this random nextLong return 1 public static void main String strings generadorAleatorios var generadorAleatorios new generadorAleatorios 33 Comprobamos por tanto la necesidad de emplear una herramienta que impida la f cil descompilaci n del c digo fuente En otras palabras si no se toman las precauciones debidas cualquier aplicaci n en Java puede ser v ctima de la ingenier a inversa rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 2 DEFINICI N DE OFUSCACI N La Ofuscaci n del c digo como t cnica de seguridad es actualmente una de las mejores herramientas de protecci n frente al reverse engineering Proporciona un software ininteligible pero con la misma funcionalidad que el c digo fuente original Hay gran cantidad de ofuscadores disponibles en Internet debido a la creciente demanda que proporcionan diferentes niveles de seguridad para proteger programas Java En la figura 2 1 podemos observar el proceso de ofuscaci
5. 4 Comprobamos que no ha ocurrido ninguna incidencia Proguard no genera una logfile sino que muestra por salida est ndar los pasos llevados a cabo y si ha ocurrido alg n error La salida se lista en el programa 3 2 Programa 3 2 Salida por pantalla de las operaciones llevadas a cabo por Proguard ProGuard version 3 2 Reading jars Reading program jar Testl jar Reading library jar C Archivos de programa j2sdk1 4 2 07 jre lib rt jar Removing unused library classes Original number of library classes 5742 Final number of library classes 10 Shrinking Removing unused program classes and class elements Original number of program classes 2 Final number of program classes 2 Optimizing Shrinking Removing unused program classes and class elements Original number of program classes 2 Final number of program classes 2 Obfuscating Renaming program classes and class elements Printing mapping to result map Writing jars Preparing output jar Testlres jar Copying resources from program jar Testl jar 33 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Destacar los nombres del archivo de salida TestlIres jar y el archivo donde se imprime el proceso de renombramiento de clases y miembros de una clase result map 5 Comprobamos que el c digo ofuscado sigue realizando la misma funci n Para ello primeramente extraemos los bytecodes del co
6. Class Testl method Testl main Ljava lang String V Notar que hemos preservado el nombre de la clase que contiene el m todo principal Esto no puede evitarse porque Retroguard requiere al igual que Proguard de una semilla o punto de entrada desde el cual ir aplicando la ofuscaci n recursivamente 2 Ejecutar Retroguard java jar DATempetroguard v2 0 lWetroguard jar Testl jar Testlres jar script rgs retro log No se producen incidencias a destacar Para comprobarlo editamos el logfile Adem s en este archivo de incidencias se puede observar el proceso de renombrado llevado a cabo Ver programa 3 6 Programa 3 6 Logfile que refleja actuaciones durante el proceso de ofuscaci n If this log is to be used for incremental obfuscation patch generation add any class method field and attribute restrictions here DO NOT EDIT BELOW THIS LINE DO NOT EDIT BELOW THIS LINE RetroGuard Bytecode Obfuscator v2 0 1 a product of Retrologic Systems www retrologic com Logfile created on Fri Mar 18 11 12 19 CET 2005 Jar file to be obfuscated Testl jar Target Jar file for obfuscated code Testlres jar RetroGuard Script file used script rgs Memory in use after class data structure built 283232 bytes Total memory available 2031616 bytes Obfuscated name overloading frequency 38 rea de Ingenier a Telem tica Estudio y Prueba de una
7. 2 Una vez tenemos el script de directivas podemos ejecutar la aplicaci n desde l nea de comandos tecleando D Temp SmokescreenSetup341_Eval java jar Smokescreen30_Eval jar nogui directives myDirectives txt 71 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Notar que es necesario especificar la opci n nogui para indicar que no se ejecute la interfaz gr fica Adem s como se ha mencionado anteriormente debemos especificar un archivo de directivas que contiene las opciones adecuadas de ofuscaci n Esto lo hacemos mediante la opci n directives Las opciones elegidas se especifican en el apartado de utilizaci n 3 Al ejecutar la aplicaci n se genera un archivo ChangeLog txtf donde se reflejan las incidencias del proceso de ofuscaci n Destacar que en este archivo se detalla el proceso de renombrado llevado a cabo Ver programa 3 25 Comprobamos que no ha ocurrido ning n error e igualmente comprobamos que nuestro ejemplo sigue realizando la misma funci n Programa 3 25 Archivo ChangeLog txt JVM info Sun Microsystems Inc 1 4 2 07 OS info Windows XP x86 5 1 ASA AA O a Beginning Obfuscation Wednesday March 30 2005 10 56 35 AM CEST a Using Directives file D Temp SmokescreenSetup341 Eval mydirectives txt Source and destination are jar files Source is D Temp prueba Testl jar Destination is D Temp prueba
8. Obfuscating MIDlet Suites with Proguard http developers sun com techtopics mobility midp ttips proguard 8 W A Marroqu n Ofuscadores De la protecci n relativa del c digo intermedio http www microsoft com spanish msdn comunidad mtj net voices art146 asp Publicado originalmente por Universal Thread Magazine www UTMag com Spanish 130 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 6 2 REFERENCIAS MANUALES OFUSCADORES 1 Proguard http proguard sourceforge net 2 Retroguard http www retrologic com retroguard main html 3 Javaguard http sourceforge net projects javaguard 4 Jshrink http www e t com shrink html 5 CafeBabe http www geocities com CapeCanaveral Hall 2334 Programs cafebabe html 6 Zelix KlassMaster http www zelix com klassmaster 7 Smokescreen http www leesw com 8 JoGa http www ng4 de 9 Jobfuscate http www jobfuscator com 10 MarvinObfuscator http www drjava de obfuscator 11 yGuard http www yworks com en products_yguard_about htm 131 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java ANEXO UTILIZACI N APLICACIONES PROGUARD Para la ejecuci n de Proguard solo es necesario teclear java jar proguard jar Opciones Las opciones pueden especificarse en uno o m s archivos de configuraci n Generalmente esta suele ser la fo
9. 2 Ejecutamos nuestra aplicaci n D Temp Jobfuscate 3 0 jobfuscate EConfig Testl 3 Comprobamos que no ha ocurrido ning n error durante el proceso de ofuscaci n para ello inspeccionamos el logfile generado Ver programa 3 26 Programa 3 26 Archivo donde se reflejan posibles incidencias Jobfus log ON D Temp Jobfuscate 3 0 Testl class ON D Temp Jobfuscate 3 0 Hola class ADDING 1 Hola pushed toString pushed toString pushed charAt I pushed length x pushed subSequence II x pushed hasMoreElements pushed nextElement pushed registerNatives pushed hashCode pushed put Ljava lang Object Ljava lang Object pushed clone pushed equals Ljava lang Object pushed get Ljava lang Object pushed size x pushed elements pushed remove Ljava lang Object pushed keys pushed isEmpty pushed hashCode pushed put Ljava lang Object Ljava lang Object pushed equals Ljava lang Object pushed get Ljava lang Object pushed size pushed values pushed remove Ljava lang Object xxx pushed clear pushed containsKey Ljava lang Object x pushed containsValue Ljava lang Object pushed entrySet pushed isEmpty x pushed keySet pushed putAll Ljava util Map x pushed compareTo Ljava lang Ob
10. Field ajc Ljava lang String 10 areturn private int ajf Code O aload 0 13 getfield 9 Field ajd I 4 iconst_0 5 iconst_1 6 lastore Ts aload_0 8 getfield 9 Field ajd 1 11 iconst_0 12 iaload 13 return Programa 3 18 Bytecode A class Compiled from null class A extends java lang Object public A Code 0 aload 0 1 invokespecial 1 Method java lang Object lt init gt V 4 iconst_1 Dis istore 1 6 return public java lang String aja java lang String Code 0 aload_1 ls areturn En base a estos bytecodes podemos evaluar la m trica dise ada para la comparaci n de las diferentes aplicaciones de ofuscaci n En base a esta comparaci n hemos construido la tabla 3 9 58 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java EJEMPLO 1 sin EJEMPLO 1 ofuscado M TRICA PUNTUACI N Testiclass Test1 class A class mia Aaa i campos ete pp eee LT ajb aje M EA Sea eee ee o Borrado Numero Linea Numero de nea oa 1 Encriptado de Strin PRUEBA DE PRUEBA DE pta 8 OFUSCACION OFUSCACION Desestructuracion de vector dl Datos y 1 Puntuaci n para Ofuscaci n de Layout y Datos Tabla 3 9 Evaluaci n de ofuscaci n de Layout y Datos para el ejemplo 1 3 2 5 3 Ofuscaci n de Ejemplo 2 CafeBabe no realiza ofuscaci n de Control de Flujo Por tanto puntuamos con un 0 la m trica individual corr
11. gt lt target name obfuscate gt lt taskdef name obfuscate classname com yworks yguard ObfuscatorTask classpath yguard jar gt lt the following can be adjusted to your needs gt lt obfuscate logfile obfuscationlog xml replaceclassnamestrings false gt lt inoutpair in Testl jar out Testlres jar gt lt externalclasses gt lt pathelement location C j2sdk1 4 2 07 jre lib rt jar gt lt externalclasses gt lt property name error checking value pedantic gt lt property name naming scheme value small gt lt expose linenumbertable false localvariabletable false gt lt method class Test1l name void main java lang String gt lt expose gt lt obfuscate gt lt target gt lt project gt lt end file build xml gt 144
12. O s ZONA E 12 2 13 aload 0 getstatic putfield aload 0 getfield areturn int b aload 0 getfield iconst_0 iconst 1 lastore aload 0 getfield iconst_0 iaload ireturn 88 33 33 35 35 Field Qa Field La ethod b thod java lang StringBuffer append I Ljava lan thod java lang StringBuffer append Ljava lang OI Method java lang StringBuffer toString Ljava la Method java io PrintStream println Ljava lang St Ljava lang String Java lang String Field La Java lang String Field Ma Field Ma I 95 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java private static java lang String a java lang String Code 0 aload 0 25 invokevirtual 93 Method java lang String length I 5 istore les iload Oe newarray char 11 astore 2 13 Ide 94 int 0 15 store 3 17 load 3 19 iload 21 if icmpge 46 24 aload 2 26 iload 3 28 aload 0 30 iload 3 32 invokevirtual 98 Method java lang String charAt I C 35 ldce 99 int 59725 STS ERO 38 i2 c 39 castore 40 inc 3p 1 43 goto 17 46 new 92 class String 49 dup 50 aload 2 52 invokespecial 102 Method java lang String lt init gt C V 55 areturn public static Code O getstatic 31 Field Na Ljava lang String 38 invokestatic 105 Metho
13. UNIVERSIDAD de SEVILLA Estudio y Prueba de una M trica para los Ofuscadores de Java Proyecto Fin de Carrera Departamento de Sistemas y Autom tica rea de Telem tica Universidad de Sevilla Autor del proyecto Angel Miralles Ar valo 5 Tutor del proyecto Antonio Jes s Sierra Collado Sevilla Mayo 2005 NDICE 1 OBJETIVOS csssssssrsersessrsersessrsessssrserscssrsessesessessesersessesensessesessesensessesessessecensessesensenseseeses 4 2 OFUSCACI N cold 5 21 DESCOMPILACION DE CODIGO dilata 5 2 2 DEFINICI N DE OF USCACION s cs555 sistenteltsl wtes bbs i Raabe ica acute Nese ehdeteastecude 23 MEDIDA DE LA OFUSCACI N RE 8 2 4 T CNICAS DE OF USCACION a 9 2 4 1 OFUSCACI N DE ESTRUCTURA rar 9 2 4 2 OFUSCACI N DE CONTROL 10 E RN 10 24 22 Ordenaci n sn 11 2423 Calculo ntsc aldo o 11 243 OFUSCACION DE DATOS dlls 11 2 4 3 1 Almacenamiento y Codificaci n cc ceesecseescseeeecescneeeecsaeeeessecseesecneteeesaeeees 12 2 4 3 2 Agregado y Reordenaci nN cocccoonocnocnonconcnononocononnonnnononnonnnononononc cnc nn conc onnrnnon coins 13 244 CONCLUSIONES coi 14 25 PROCESO DEOFUSCA Nec 15 2 6 M TODO DE ANALISIS PARA OFUSCACI N n se 16 2 6 1 DISE O DE M TRICA DE OFUSCACI N sscssssssessssssessssssesssessessesaneesteeveaseess 16 2 6 2 DISE O DE EJEMPLOS di 17 2 6 2 1 EJEMPLO Dorta E 19 C digo BUEN te initial 19 Bytecode ia iron A 20 D scompilaci i eena a A rea A 22
14. c p l Testl D Temp prueba javap c p l a Programa 3 7 Bytecode Test1 class Compiled from null public class Testl extends java lang Object public a do protected java lang String a private int if public static void main java lang String Code 39 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java O new 1 3 dup 4 invokespecial des pop 8 return public Testl Code O aload 0 ils invokespecial 4 aload_0 5 new 4 8 dup 9 invokespecial 12 putfield 15 aload_0 16 TIG 7 18 putfield 21 aload_0 22 bipush 10 24 newarray int 26 putfield 29 getstatic 32 aload_0 33 getfield 36 Ildc 11 38 invokevirtual 41 invokevirtual ring V 44 getstatic 1 47 aload_0 48 invokevirtual 51 invokevirtual ring V 54 getstatic 57 new 15 60 dup 61 invokespecial 64 lde 17 66 invokevirtual String Ljava lang StringBuffer 69 aload_0 70 invokespecial 73 invokevirtual g StringBuffer 76 invokevirtual ng String 79 invokevirtual ring V 82 return class Testl 2 Method lt init gt V 3 Method java lang Object lt init gt V class a 5 Method a lt init gt V 6 Field do La String 8 Field a Ljava lang String 9 Field if I 10 Field java lang System out Ljava io PrintStream 6 String HOLA MUNDO F
15. m todos main de la misma Al ejecutar encontr bamos los siguientes errores que se reflejan en el programa 3 65 Programa 3 66 Resultado ejecuci n aplicaci n ofuscada Unable to load gradient presets data Exception java lang ClassNotFoundException grad PresetGradientPainter java lang ClassNotFoundException grad PresetGradientPainter at java net URLClassLoader 1 run Unknown Source at jJava security AccessController doPrivileged Native Method at java net URLClassLoader findClass Unknown Source at java lang ClassLoader loadClass Unknown Source at sun misc LauncherSAppClassLoader loadClass Unknown Source at java lang ClassLoader loadClass Unknown Source at java lang ClassLoader loadClassInternal Unknown Source at java lang Class forName0 Native Method at java lang Class forName Unknown Source at Java io ObjectInputStream resolveClass Unknown Source ava io ObjectInputStream readNonProxyDesc Unknown Source ava io ObjectInputStream readClassDesc Unknown Source ava io ObjectInputStream readOrdinaryObject Unknown Source ava io ObjectInputStream readObject0 Unknown Source ava io ObjectInputStream readArray Unknown Source ava io ObjectInputStream readObject0 Unknown Source ava io ObjectInputStream defaultReadFields Unknown Source ava io ObjectInputStream readSerialData Unknown Source ava io ObjectInputStream readOrdinaryObject Unknown Source ava io ObjectInputStream readObj
16. 22 94 33 997 default 104 bipush 101 goto 106 bipush 105 goto 106 bipush 29 goto 106 bipush 20 goto 106 bipush 54 ixor i2c castore iinc dy L swap dup_xl iload_1 if icmpgt 46 new 62 class String dup_x1 swap invokespecial 72 Method java lang String lt init gt C V invokevirtual 76 Method java lang String intern Ljava lang String swap pop ret 0 return oe Comprando el bytecode ofuscado obtenido con el original podemos comprobar que es mucho m s complicado y que las sentencias condicionales y los bucles han cambiado 69 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Las desventajas de la ofuscaci n de control es que la ejecuci n del bytecode obtenido es m s lenta y el tama o del mismo es ligeramente mayor Test2 class 799 bytes en comparaci n con a class 1 118 bytes 3 2 6 4 Conclusi n e Zelix KlassMaster puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e Es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 15 proporciona opciones de encriptado Sin embargo no realiza desestructuraci n de datos e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n Los dos ejemplos s
17. 80 iload 1 81 iconst 1 82 sub 83 istore 1 84 goto 1S 87 athrow 88 iload 1 89 iconst 1 90 if icmple 59 93 getstatic 17 Field java lang System out Ljava io PrintStream 96 getstatic 77 Field _0 Ljava lang String 99 iconst_0 100 bipush 19 102 invokevirtual 63 Method java lang String substring II Ljava lang String 105 invokevirtual 25 Method java io PrintStream print Ljava lang Stri ng V 108 goto 75 Exception table from to target type 5 9 87 any 76 83 58 any static Code O ldc 1 String vMU JIW1X 1 Z2M T 14 XtvMU IW1X 1 Z2M T 19 tvMU JW A 1 ZM T 2 invokevirtual 67 Method java lang String toCharArray C 5 iconst_ 0 6 dup2 des dup2 8 caload Os bipush 56 Trs Axor VO ZE 13 castore 14 iconst_1 15 add 16 dup 17 bipush 55 19 if icmplt 6 22 pop 23 ainvokestatic 71 Method java lang String copyValueOf C Ljava lan g String 26 putstatic 77 Field 0 Ljava lang String 29 ldc2 w 49 long 11134643087131 32 nvokestatic 56 Method java lang System currentTimeMillis J 35 lcmp 36 ldc2 w 51 long 11121683087131 39 invokestatic 56 Method java lang System currentTimeMillis J 79 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 42 43 44 47 48 49 52 53 54 from 44 1cmp dup ifgt 43 pop dup EELE 48 pop
18. 94 96 101 104 106 107 108 10 9 112 113 114 DES 118 121 122 123 126 129 130 TZI 133 dup2 caload iload 1 iconst_5 irem tableswitchf 0 to 3 0 84 Lx 897 2 94 OO default 104 bipush 8 goto 106 bipush 112 goto 106 bipush 76 goto 106 bipush 127 goto 106 bipush 61 ixor i2c c store iinc Era L swap dup_x1 iload 1 if icmpgt 46 new 82 class String dup_xl swap invokespecial 92 Method java lang String lt init gt C V invokevirtual 96 Method java lang String intern Ljava lang String swap pop ret 0 return Programa 3 21 Bytecode a class Compiled from a java class a extends java lang Object public public Code O Ou FF public Code os E static int a a aload 0 invokespecial 1 Method java lang Object lt init gt V iconst_1 istore 1 return java lang String a java lang String aload 1 areturn Una vez obtenidos los bytecodes ofuscados podemos evaluar el proceso de ofuscaci n llevado a cabo por esta aplicaci n mediante la m trica dise ada 65 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java EJEMPLO 1 sin EJEMPLO 1 ofuscado M TRICA PUNTUACI N Testiclass Test1 class a class paved pruebaOfus Ee Je E e E ee A Borrado Numero Lina Numero de Les ores 1 y A PRUEBA DE 1 Desestruct
19. Code 0 getstatic 56 Field A Z istore 3 iconst_0 istore 1 iconst_0 istore 2 iload_2 iconst_2 0 if icmpge 41 rFPoOMATA uw WW 67 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Tag Linc 1 1 16 inc Zi E 19 iload 3 20 ifne 61 232 iload 3 24 ifeq 8 27 getstatic 58 Field z Z 30 ifeq 37 33 iconst_0 34 goto 38 37 iconst 1 38 putstatic 58 Field z Z 41 iload 1 42 iconst 1 43 if icmple 61 46 getstatic 2 Field java lang System out Ljava io PrintStream 49 getstatic 78 Field B Ljava lang String 923 Aeonst e 53 aaload 54 invokevirtual 4 Method java io PrintStream print Ljava lang Strin gi V 57 iload_3 58 ifeq 72 61 getstatic 2 Field java lang System out Ljava io PrintStream 64 getstatic 78 Field B Ljava lang String 67 const 1 68 aaload 69 invokevirtual 6 Method java io PrintStream println Ljava lang Str ing V 72 iload 1 13 1COnst 1 74 if icmple 89 77 iload 1 78 iconst 1 79 isub 80 store 1 81 iload 3 82 ifne 123 85 load 3 86 ifeq 72 89 getstatic 2 Field java lang System out Ljava io PrintStream 92 invokevirtual 7 Method java io PrintStream printin V 95 getstatic 2 Field java lang System out Ljava io PrintStream 98 new 8 class StringBuffer 101 dup 102 invokespecial 9 Meth
20. Hemos imprimido el bytecode ejecutando javap con las siguientes opciones c descompilar p Incluir campos privados y numero de l nea y tablas locales e A continuaci n hemos descompilado los archivos class mediante el descompilador JODE y comparado el c digo obtenido con el original 18 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e El siguiente paso ha sido la compilaci n del c digo descompilado para cerciorarnos de que realiza la misma funcionalidad e Finalmente hemos comparado los resultados de cada paso para comprender como aparecen los ejemplos antes de ser ofuscados 2 6 2 1 EJEMPLO 1 El c digo fuente del ejemplo 1 viene dado en el fichero Test java 794 bytes Tiene dos clases Test class 1 102 bytes y Hola class 284 bytes Testl class es la clase principal C digo Fuente A continuaci n se detalla el c digo fuente de nuestro primer ejemplo Testl java Programa 2 1 C digo Fuente Testl java EjJemplol Proposito Comprobar el comportamiento de un ofuscador con respecto a ofuscacion de layout y datos Fecha realizaci n 11 3 2005 Autor Angel Miralles Arevalo public class Testl public Hola hello new Hola protected String aux private int vector new int 10 public static void main String args new Testl public Testl1 System out println hello getHola HO
21. KKEKKKK KK KK KK KK KK KK KK KK KA KK KK AAA AAA KARA AA AAA AAA AAA A AAA A Comprobamos que efectivamente no se realiza un renombrado efectivo pues los nombres de clases y miembros de clases aparecen con ap ndices de las nuevas etiquetas Esto es debido a que trabajamos con una versi n de prueba como hemos comentado anteriormente Destacar que no se ha producido error alguno Como salida hemos obtenido un contenedor Test res jar 1 414 bytes 4 A continuaci n extraemos los bytecodes ofuscados del contenedor de salida y comprobamos que siguen realizando la misma funci n Para ello D Temp prueba jar xf Testlres jar Obtenemos dos archivos Testl class 986 bytes y ZO_Hola class 206 bytes Observamos una reducci n del tama o de los bytecodes en comparaci n con los originales Hemos conseguido por tanto un c digo m s compacto D Temp prueba java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Efectivamente sigue realizando la misma funci n 5 Por ltimo comparamos los bytecodes ofuscados obtenidos con los originales para poder as evaluar la aplicaci n de acuerdo a la m trica dise ada Ver programa 3 27 y 3 28 D Temp prueba javap c p l Testl D Temp prueba javap c p 1 ZO_Hola 89 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Programa 3 27 Bytecode Testl class public class Testl extends jJava lang Object
22. digo hasta el punto de resultar imposible su descompilaci n de forma autom tica Adem s ha sido capaz de ofuscar una aplicaci n de cierto peso sin problema alguno teniendo en cuenta la mayor a de casos conflictivos que pueden aparecer al llevarse a fin tal tarea como por ejemplo Serializaci n Reflection API calls RMI manejo de m todos nativos manejo de JavaBeans Por otro lado es una herramienta completa tanto en su manejo permite ejecuci n desde l nea de comandos o mediante interfaz gr fica GUI como por las muchas opciones disponibles para la configuraci n del proceso de ofuscado El manual de usuario proporcionado es bastante completo a su vez Adem s incluye como se ha comentado en el apartado de procesado correspondiente a esta aplicaci n una opci n Stack Trace Translate para recuperar c digo ofuscado mediante el archivo de renombrado creado en el proceso de ofuscaci n Esto resulta til para RMI invocaci n de m todos remotos Esta ltima opci n no ha sido objeto de estudio en este proyecto Si nuestro objetivo a la hora de ofuscar es el adelgazamiento del tama o de nuestra aplicaci n comprobamos que Zelix KlassMaster tambi n consigue buenos resultados en este aspecto El nico pero a esta herramienta es que es una soluci n comercial Su coste es bastante elevado alrededor de 400 pero su efectividad est fuera de toda duda En el caso de querer preservar el bytecode de nuestras aplicaciones d
23. e field lt campo gt para preservar un determinado campo 134 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java JSHRINK Jshrink es una herramienta que puede ejecutarse desde l nea de comandos aunque proporciona una interfaz gr fica GUI atractiva y de f cil manejo En nuestro caso hemos optado por trabajar en l nea de comandos en orden a preservar la mayor cantidad de opciones disponibles para aplicar Para la ejecuci n de la aplicaci n Jshrink tecleamos java jar jshrink exe opciones input file opciones o output file El archivo de entrada puede ser jar o zip un directorio o un archivo individual Si es un directorio entonces todos los archivos que contiene son cargados incluyendo subdirectorios Sin embargo los archivos java no ser n cargados a menos que se especifique la opci n adecuada Si la opci n o est presente la aplicaci n se ejecuta en modo comando sin interfaz gr fica Las opciones desde l nea de comandos son rdenes independientes Las opciones m s comunes se detallan a continuaci n e classpath path especifica la ruta de los archivos que pueden requerirse para resolver dependencias superclases a la hora de compactar y ofuscar nuestro c digo Los archivos incluidos en el path son le dos exclusivamente y no incluidos en la salida de la aplicaci n e l muestra por salida est ndar informaci n referente al proceso
24. la ofuscaci n del c digo una optimizaci n reduciendo el tama o de las aplicaciones Este hecho tambi n mejora en la carga m s r pida de los applets ya que se realiza en un tiempo menor El prop sito de este proyecto es primeramente el estudio del proceso de ofuscaci n la comprensi n de las t cnicas empleadas En segundo lugar realizar un an lisis de los ofuscadores disponibles en la red as como una comparativa de la efectividad de cada uno de ellos Todo esto centr ndonos en ofuscaci n para lenguaje de programaci n Java rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 OFUSCACI N 2 1 DESCOMPILACI N DE C DIGO El Java bytecode generado durante la compilaci n del c digo fuente del fichero java contiene toda la informaci n necesaria para poder regenerar el c digo fuente original mediante la aplicaci n de una herramienta denominada descompilador Hay multitud de descompiladores gratuitos disponibles en Internet muchos de ellos basados en el proyecto JODE Entorno de Descompilaci n y Optimizaci n Java El propio JDK tambi n incorpora su propio descompilador de Java el javap si bien es cierto que ste solo es capaz de dar informaci n sobre las cabeceras de los m todos y los atributos de las clases sin regenerar cuerpo alguno de los m todos de forma similar a como lo hacen multitud de entornos de desarrollo Java cuando abren un fichero class Vamos a co
25. n de ofuscaci n de Control por tanto la ofuscaci n del ejemplo 2 no es necesaria Puntuamos con un O la m trica individual correspondiente 3 2 12 4 Conclusi n yGuard puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 15 100 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo e Se proporciona un manual de usuario muy detallado en la p gina web asociada a la aplicaci n e Dificil de utilizar si no se conoce XML y la herramienta de compilaci n Ant Aunque el manual explica como proceder desde cero 101 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 3 PROGRAMA L GICO En este apartado tratamos de comprobar la eficacia de los programas analizados con anterioridad pero en este caso al ofuscar una aplicaci n de mayor peso es decir de un mayor tama o Hasta ahora nuestro an lisis se basaba en la ofuscaci n de peque os ejemplos dise ados espec ficamente para comprobar la eficacia de los ofuscadores en cuanto a las
26. public ZO Hola AO hello protected java lang String BO_aux private int CO vector public static void main java lang String Code O new 1 class Testl 3 dup 4 invokespecial 2 Method lt init gt V ls pop 8 return public Testl Code O aload 0 dt invokespecial 3 Method java lang Object lt init gt V 4 aload_0 5s new 4 class ZO Hola 8 dup 9 invokespecial 5 Method ZO Hola lt init gt V 12 putfield 6 Field AO hello LZO Hola 15 aload 0 16 Ildc 7 String 18 putfield 8 Field BO aux Ljava lang String 21 aload_0 22 bipush 10 24 newarray int 26 putfield 9 Field CO vector 1 29 getstatic 10 Field java lang System out Ljava io PrintStream 32 aload_0 33 getfield 6 Field AO hello LZO Hola 36 ldc 11 String HOLA MUNDO 38 invokevirtual 12 Method ZO Hola DO getHola Ljava lang String Lja va lang String 41 invokevirtual 13 Method java io PrintStream printin Ljava lang St ring V 44 getstatic 10 Field java lang System out Ljava io PrintStream 47 aload_0 48 invokevirtual 14 Method EO pruebaOfus Ljava lang String 51 invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 54 getstatic 10 Field java lang System out Ljava io PrintStream 57 new 15 class StringBuffer 60 dup 61 invokespecial 16 Method java lang StringBuffer lt init gt V 64 lde 17 String Ejemplo 66
27. rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java D Temp prueba jar xf Testlres jar Obtenemos los bytecodes de las dos clases originales ofuscadas A class 1 295 bytes y B class 338 bytes Comprobamos que tienen un mayor tama o que los originales Esto es debido al proceso de ofuscaci n de control y a la encriptaci n D Temp prueba java A HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Sigue realizando la misma funci n a pesar de haber ofuscado con las opciones m s severas 4 A continuaci n comparamos los bytecodes ofuscados obtenidos con los originales para poder as evaluar el proceso de ofuscaci n llevado a cabo por la aplicaci n Smokescreen Ver programas 3 26 y 3 27 D Temp prueba javap c p l A D Temp prueba javap c p 1 B Programa 3 26 Bytecode A class public class A extends java lang Object public B A protected java lang String B private int C static java lang String 0 static Code O ldc 1 String r RZG X nOx vtzbysxgebruvisrtxqbdtvt xy 2s invokevirtual 86 Method java lang String toCharArray C 5 iconst_0 6 dup2 de dup2 8 caload 9 bipush 55 11 ixor Las ZE 13 castore 14 iconst_1 15 iadd 16 dup 17 bipush 38 19 if icmplt 6 22 pop 23 ainvokestatic 90 Method java lang String copyValueOf C Ljava lan g String 26 putstatic 95 Field 0 Ljava lang String 29
28. s algunas aplicaciones asignan etiquetas al bytecode al procesarlo que tambi n son borradas en este paso Otra tarea llevada a cabo en la etapa de optimizaci n strip es encontrar todos los m todos que pueden ser declarados como final y establecer el modificador de m todos como final a nivel de bytecode En la etapa de ofuscaci n se permite la inclusi n de paquetes clases y miembros de clases Adem s se incluye la opci n de mover clases de distintos paquetes hacia un paquete an nimo ZELIX KLASSMASTER En primer lugar debemos destacar que Zelix KlassMaster no se ejecuta desde l nea de comandos Proporciona una interfaz gr fica GUI desde donde podemos controlar todas las opciones Al abrir la aplicaci n Zelix KlassMaster obtenemos una ventana principal que contiene 5 paneles el panel de herencia en el que se muestra las clases e interfaces abiertas en orden jer rquico el panel de propiedades de la clase que nos permite 136 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java modificar el nombre y el especificador de acceso de la clase en cuesti n seleccionada el panel de propiedades de campos que nos permite las mismas modificaciones el panel de propiedades de m todos que nos permite modificar el modificador de acceso del m todo seleccionado el panel de propiedades de constantes que nos permite cambiar el valor de las mismas y el panel de visi n en el que se muestra
29. 3 2 4 2 Ofuscaci n de Ejemplo Trip teari a Ea eE E Ea E EEEE ESEESE 47 3 2 4 3 Ofuscaci n de Ejemplo 2 sssesesessesereesssieesreserceserisesrcsesersertrseceecnrisrsesit eseroeriecee 53 3 2 4 4 Conclusi n sieer e eiaei eeri a riere ii a 54 3 25 CAFEBABE coin dci 55 A RN 55 3 2 5 2 Ofuscaci n de Ejemplo 1 eee ionice aaien e a 55 3 2 5 3 Ofuscaci n de Ejemplo 2 erriren eee ee riete aE E ei 59 3 2 54 CONCIUSI N nene a e aris e r a a ii erie i as 59 3 2 6 ZELIX KLASSMASTER iiien ai arier aran n o ae a it aia 60 3 2 6 1 Introduci n ii nae tddi tddi 60 3 2 6 2 Ofuscaci n de Ejemplo 1 oes eecsesecsseeeeesecseeeceeeecaeeecsaecasesesseeseseeeeesaees 61 3 2 6 3 Ofuscaci n de Ejemplo 2 eeeecsesecsseeeessecseeseceseecaeeecsaeeaessesaeesesneeeeeeaees 66 3 2 6 4 ConChusiOnivei iiscesscevsea ede itecunda sed eae codes saveneces ves ddeunaes cet ed sabes r eE a or esei ieis 70 3 2 57 SMOKESCREEN cusco bio det Aina sti dias pal 70 IZA UC N it di ii ii 70 3 2 7 2 Ofusc ci n de Ejemplo Luci cias shin e tii dido liar 71 3 2 7 3Ofuscaci n de Ejemplo Zenit diia di a dd 76 3 2 7A COMCIUSION ta taa ra ds as Ride 80 328 JOGA caia dias hated tanned AA Macnee 81 3 2 8 1 Introducti oia rad Nave liada cita ds 81 3 2 8 2 Ofuscaci n de Ejemplo 1 eee eeeseseeeeeeeeceeeseceeeeceaeeeesaeeeeesecseesesneseeeeaees 81 3 2 8 3 Ofuscacion de Ejemplo Zenit desd stale did dd 85 3 2 8 4 CONCIUSIONES 64 ia ia it at 86 SD JZIPPER ops ia bio e
30. Eonclusi E T A E A 23 26 22 EJEMPLO 2ra ett a E a E aE T E a E 24 C digo Fuente iniii e eaaa e TE aE E E AE EE 24 A O 24 Descompilaci n ica tonel ol ata 26 Conclusiones iii 27 3 PRUEBAS Y RESULTADOS sesessssesesoosesosossesessososossesosoesosososoesoseososososoesessosososseseseesesssosoese 28 LAN TAO ts 29 3 1 1 RECOPILACI N DE OFUSCADORES cssssssessusssessesssessecssessecsssssecsesssessesseeseess 29 3 1 2 DESCARGA cia ia 30 3 13 INSTALACI N is 30 32 PROCESADO 0 A A a 31 3 21 PROGUARD ota diia 31 3 2 1 1 Introducci n coi iii di 31 3 2 1 2 Ofuscaci n de Ejemplo I cesinta irain ni 32 3 2 1 3 Ofuscaci n de Ejemplo 2 occ ceeecsesecseeecssecseeseceseeceaeeecsaeeaessesaeseeeeseeeeaees 36 3 2 1 A CONCIUSIONES cienne cat cadca cnica indie 37 3 2 2 REFROGUARD ui 37 3 2 2 1 Introduc i n cai aie e arie ri a i er esii ees 37 3 2 2 2 Ofuscaci n de Ejemplo l oooooconncnociccnoccnnconcnnconononononnnonon conc cn aii 38 3 2 2 3 Ofuscaci n de Ejemplo 2 reccsent rari eae nita s 42 3 2 2 4 CONCIUSIONES is cescievsces cabte sands datosde didnt idas 42 32 3 JAVAGUARD iu 42 3 23 IO UC o ti A ae Wave Bisse 42 3 2 3 2 Ofuscacion de Ejemplo Lccicnocntiicia dia dsd tandas destine drenan A dan 42 3 2 3 3 Ofuscacion de Ejemplo Zinc tia clan do cti dida dd 46 3 2 3 4 CONCLUSIONES cccococononcnccnnnonnonanonccnnoonnonononccnononanno nono nnononnnnonononocncnnnnonenenicncnannnnnos 46 3 2 4 SHRINK 0d iia T E E 47 e TO 47
31. Field a La 19 aload_0 20 lde 7 String 22 putfield 8 Field b Ljava lang String 25 aload_0 26 bipush 10 28 newarray int 30 putfield 9 Field c I 33 getstatic 10 Field java lang System out Ljava io PrintStream 36 aload_0 37 getfield 6 Field a La 40 getstatic 98 Field z Ljava lang String 43 iconst_1 44 aaload 45 invokevirtual 12 Method a a Ljava lang String Ljava lang String 48 invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 51 getstatic 10 Field java lang System out Ljava io PrintStream 54 aload_0 55 invokevirtual 14 Method a Ljava lang String 58 invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 61 getstatic 10 Field java lang System out Ljava io PrintStream 64 new 15 class StringBuffer 67 dup 68 invokespecial 16 Method java lang StringBuffer lt init gt V 71 getstatic 98 Field z Ljava lang String 74 iconst_0 75 aaload 76 ainvokevirtual 18 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 79 aload 0 80 invokespecial 19 Method b 1 83 invokevirtual 20 Method java lang StringBuffer append I Ljava lan g StringBuffer 86 invokevirtual 21 Method java lang StringBuffer toString Ljava la ng String 89 invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 63 rea de Ingenier a Telem tica
32. KB de menor tama o que el contenedor original Comprobamos que la el c digo compactado sigue realizando la misma funci n es decir la aplicaci n sigue funcionando A continuaci n hemos procedido a la ofuscaci n del anterior contenedor c digo compacto Al cargar la aplicaci n mediante la interfaz gr fica se nos avisa de que existen m todos que pueden que no se manejen de forma autom tica En concreto m todos relacionados con las Reflection API calls y que debemos preservar del proceso de ofuscaci n por tanto Tras preservar los m todos especificados procedemos a la ofuscaci n de la aplicaci n Al ejecutar el contenedor resultante nos encontramos con el siguiente error por pantalla Programa 3 62 Resultado ejecuci n aplicaci n ofuscada con Zelix KlassMaster Unable to load gradient presets data Exception java lang ClassNotFoundException grad PresetGradientPainter java lang ClassNotFoundException grad PresetGradientPainter at Java net URLClassloader 1 run Unknown Source at Java security AccessController doPrivileged Native Method at java net URLClassLoader findClass Unknown Source at java lang ClassLoader loadClass Unknown Source at sun misc LauncherS AppClassLoader loadClass Unknown Source at java lang ClassLoader loadClass Unknown Source at java lang ClassLoader loadClassInternal Unknown Source at java lang Class forName0 Native Method at java lang Class fo
33. M trica para los Ofuscadores Java ta used 4 times 57 vit used 2 times 28 do used 1 times 14 Other names each used in lt 1 of mappings used a total of 0 times 1 Names reserved from obfuscation Class Testl method Testl main Ljava lang String V Obfuscated name mappings some of these may be unchanged due to polymorphism constraints field_map Testl aux a field map Testl vector if field map Testl hello do method map Testl pruebaOfus Ljava lang String a method map Testl getVector I if Class map Hola a method_map Hola getHola Ljava lang String Ljava lang String a 3 Comprobamos que el c digo ofuscado sigue realizando la misma funci n Para ello primeramente extraemos los bytecodes del contenedor de salida y posteriormente los ejecutamos D Temp prueba jar xf Testlres jar Destacar que obtenemos dos clases Test class 896 bytes y a class 187 bytes Comprobamos que el tama o de nuestros bytecodes se ha reducido La clase Testl no ha sufrido renombramiento porque Proguard requiere de un punto de entrada para ir ofuscando recursivamente desde esta semilla como ese ha explicado en la introducci n del programa D Temp prueba java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 4 A continuaci n comparamos los bytecodes ofuscados con sus hom logos sin ofuscar obteniendo los programas 3 7 y 3 8 Para ello ejecutamos D Temp prueba javap
34. OF ZIP JAR FILE before 1425 after 1109 gt 77 SIZE OF ALL CLASS FIELS before 1386 after 1091 gt 78 class Hola before 284 after 185 gt 65 class Testl before 1102 after 906 gt 82 Observamos el proceso de reducci n de tama o de las aplicaciones as como de los bytecodes en el archivo de resultados Se consiguen reducciones entorno al 80 La eficacia de esta aplicaci n es sorprendente en este aspecto No debemos olvidar que JoGa es ante todo un optimizador y compactador de bytecode 4 Comprobamos que la aplicaci n optimizada y ofuscada sigue realizando la misma funci n que el bytecode original Como salida del proceso hemos seleccionado que se generase un archivo contenedor Testlres jar Este contenedor se crea por defecto dentro de un directorio cuya ruta hemos especificado previamente en el men Outputs Extraemos su contenido y compilamos mediante las instrucciones D Temp prueba JoGaDIR jar xf Testlres jar D Temp prueba JoGaDIR java Test HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 83 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Efectivamente sigue realizando la misma funci n a pesar de haber empleado las opciones m s severas de optimizaci n y ofuscaci n Notar que hemos preservado el nombre de la clase que contiene el m todo main 5 Por ltimo evaluamos el proceso mediante la comparaci n con los bytecodes originales
35. RMI y JavaBeans por defecto e Adem s permite la integraci n en J2ME Wireless Toolkit Debemos destacar que la opci n de excluir m todos espec ficos de la ofuscaci n de control solamente est disponible desde el interfaz ZKM Script La herramienta de ofuscaci n trabaja sobre todas las clases abiertas No puede ofuscar clases que no hayan sido cargadas previamente Por tanto es necesario que carguemos nuestra aplicaci n completa de manera que la dependencia entre clases pueda ser actualizada apropiadamente 3 2 6 2 Ofuscaci n de Ejemplo 1 Los pasos que hemos seguido para la evaluaci n del proceso de ofuscaci n llevado a cabo por la aplicaci n Zelix KlassMaster sobre nuestro ejemplo 1 han sido los siguientes 1 Abrir la aplicaci n Zelix Para ello desde una consola ejecutamos D Temp ZKM java jar ZKM jar 2 Cargar nuestro ejemplo Previamente hemos almacenado nuestros bytecodes en un contenedor Test jar Como hemos observado al principio podemos abrir clases desde un directorio o desde un contenedor como es nuestro caso Para ello solo tenemos que pulsar File y Open Obtendremos un explorador que nos permitir cargar el archivo deseado 3 Utilizar la herramienta de ofuscaci n Para ello seleccionamos Tools y Obfuscate A continuaci n seleccionamos las opciones de ofuscaci n que deseemos En nuestro caso hemos seleccionado las m s agresivas Ver el apartado de utilizaci n de la aplicaci n 4 Ejecu
36. Testlres jar Will use class loader to find super classes Changes and removals will be recorded Destination Class Jar or Zip files may be overwritten Unused methods will not be removed Unused fields will not be removed All class names will be changed All method names will be changed All field names will be changed Stack operations will be shuffled Fake exceptions will be added Switch statements will be obfuscated Strings will be encrypted Number of selected classes is 2 Total number of classes scanned is 3 Class Test1 changed to A Method Testl main Ljava lang String V not changed Method Testl lt init gt V not changed Method Testl pruebaOfus Ljava lang String changed to A A Method Testl getVector I changed to A B Field Testl hello LHola changed to A A Field Testl aux Ljava lang String changed to A B Field Testl vector I changed to A C Class Hola changed to B Method Hola lt init gt V not changed Method Hola getHola Ljava lang String Ljava lang String changed to B A oi aor phates cera aes iar Ending Obfuscation En el archivo de directivas hemos seleccionado obtener como salida un contenedor Testlres jar Para comprobar que nuestro ejemplo ofuscado sigue realizando la misma funci n extraemos el contenido de este contenedor y compilamos las clases extra das para ello 12
37. Ver programas 3 23 y 3 24 D Temp prueba javap c p l Testl D Temp prueba javap c p l a Programa 3 23 Bytecode Test1 class public class Testl extends java lang Object public a a protected java lang String b private in public Code os con WwW public Code ou wr Os 12 15 16 18 21 22 24 26 29 325 33 36 38 41 ing V 44 47 48 Si ing V 54 Sd 60 61 64 66 69 70 tl c static void main java lang String new 1 class Testl dup invokespecial 2 Method lt init gt V pop return Testl aload 0 invokespecial 3 Method java lang Object lt init gt V aload_0 new 49 class a dup invokespecial 50 Method a lt init gt V putfield 53 Field a La aload 0 ldc 4 String putfield 56 Field b Ljava lang String aload_0 bipush 10 newarray int putfield 59 Field c I getstatic 5 Field java lang System out Ljava io PrintStream aload_0 getfield 53 Field a La rdg 6 String HOLA MUNDO invokevirtual 61 Method a a Ljava lang String Ljava lang String invokevirtual 7 Method Java io PrintStream println Ljava lang Str getstatic 5 Field java lang System out Ljava io PrintStream aload_0 invokevirtual 63 Method a Ljava lang String invokevirtual 7 Method java io PrintStream println Ljava lang Str getstatic 5 Field java l
38. Zhe a 15 goto 4 18 iload 1 19 iconst 1 20 if icmple 34 23 getstatic 2 Field java lang System out Ljava io PrintStream 26 Il1dc 3 String Numero de bucle gt 1 28 invokevirtual 4 Method java io PrintStream print Ljava lang String V 31 goto 42 34 getstatic 2 Field java lang System out Ljava io PrintStream 37 ede 5 String Numero de bucle lt 1 39 invokevirtual 6 Method java io PrintStream println Ljava lang String V 42 iload 1 43 iconst 1 44 if icmple 54 47 iload 1 48 iconst 1 49 isub 50 istore 1 513 goto 42 54 getstatic 2 Field java lang System out Ljava io PrintStream 57 invokevirtual 7 Method java io PrintStream printin V 60 getstatic 2 Field java lang System out Ljava io PrintStream 63 new 8 class StringBuffer 66 dup 67 invokespecial 9 Method java lang StringBuffer lt init gt V 70 Ide 10 String Numero de bucle 72 ainvokevirtual 11 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 75 iload 1 76 invokevirtual 12 Method java lang StringBuffer append I Ljava lang StringBuffer 79 ainvokevirtual 13 Method java lang StringBuffer toString Ljava lang String 82 invokevirtual 6 Method java io PrintStream println Ljava lang String V 85 return LineNumberTable line 9 0 line 12 2 line 13 9 line 12 12 25 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Of
39. al ofuscar nuestras aplicaciones obtendremos una reducci n en el tama o de las mismas de manera que podremos enviarlas por la red m s r pidamente Esta aplicaci n presenta las siguientes caracter sticas para el proceso de ofuscaci n e Proporciona ofuscaci n de Estructura realizando renombrado de paquetes clases campos y m todos e Proporciona ofuscaci n de Control que cambia la mayor a de las sentencias condicionales y bucles de manera que estas construcciones no tengan un equivalente directo en Java e Puede encriptar strings para hacer el c digo descompilado menos le ble e Puede comprimir la estructura de paquetes con el objetivo de reducir el tama o del bytecode de nuestra aplicaci n en conjunto e Proporciona la funci n de exclusi n de nombres que nos da un buen control sobre los nombres que son ofuscados e Puede producir un archivo logfile muy detallado en el que se graban todos los cambios de nombres realizados y adem s proporciona una herramienta Stack Trace Translation Tool para ayudarnos a interpretar el proceso llevado a cabo e Borra el n mero de l nea para no dar a descompiladores ninguna informaci n extra 60 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Podemos cargar un archivo logfile existente de manera que obtenemos un renombramiento y una ofuscaci n de control m s consistente Esto es importante cuando utilizamos RMI e Maneja
40. b B se divide en dos versiones ofuscadas diferentes B y B El predicado opaco P selecciona uno de los dos en ejecuci n En la figura 2 5 c P siempre selecciona B sobre Bpug una versi n bug err nea de B a b c r Sie El y da A a a f B f B F B fF Bane Figura 2 5 Introduccion de predicados opacos 10 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Inlining que borra toda huella de abstracci n de un m todo Outlining que crea m todos mediante secciones de c digo no relacionadas las cuales a aden un nivel de fingida abstracci n e Interpolaci n de m todos til cuando algunos par metros son del mismo tipo e Clonaci n de m todos Se realizan m ltiples pero diferentes versiones ofuscadas de de un m todo e Transformaciones en bucles 2 4 2 2 Ordenaci n e Ofuscaci n mediante control del orden altera el orden de ejecuci n de sentencias 2 4 2 3 C lculo e Inserci n de c digo irrelevante e Inserci n de c digos con diferente ofuscaci n e Inserci n de c digo err neo buggy code Estos segmentos introducidos no afectan a la ejecuci n de las clases Java pero si rompen el proceso de descompilaci n Esta t cnica es muy peligrosa ya que hay MVJ muy estrictas en la interpretaci n del c digo y detecten estos segmentos como puntos corruptos y no contin en la interpretaci n del resto del
41. c digo e Utilizaci n de Goto El c digo fuente no lo admite pero el bytecode si Se modifica el bytecode mediante la utilizaci n de Goto en los bucles e Borrado de llamadas a librer as comunes 2 4 3 OFUSCACI N DE DATOS Tiene por objetivo el oscurecimiento de datos y estructuras de datos que pueda haber en el c digo de nuestra aplicaci n La ofuscaci n de datos rompe las estructuras de datos usadas en el c digo y las encripta literalmente Tenemos diferentes m todos para ofuscar las estructuras Ver figura 2 6 11 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Agregado Ordenaci n Codificaci n Figura 2 6 Ofuscaci n de Datos 2 4 3 1 Almacenamiento y Codificaci n e Divisi n de variables Por ejemplo separar una variable boolean en dos o m s variables v v v v Esto incrementa el procesado de la aplicaci n Ver tabla 2 1 e Convertir especificadores de acceso static en procedural Aumenta la carga de procesado y la flexibilidad Ver tabla 2 2 a true b false c true al a2 a3 true c1 a1 a2 a3 amp b1 b2 c a amp b c1 c2 Tabla 2 1 Ejemplo de divisi n de variables String t Red String retStr inti String s s 1 R s 2 e s 8 d Tabla 2 2 Conversi n Static en Procedural e Cambiar Codificaci n e Cambiar el periodo de vida de variables 12 rea de Ing
42. de m trica de ofuscaci n mediante CafeBabe 121 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 6 ZELIX KLASSMASTER OBJETOS CONTENIDO PUNTUACI N OFUSCACI N DE LAYOUT Borrado de N mero de L neas 1 Encriptado de String OFUSCACI N DE DATOS A IET AAC IN STATS Sid Tabla 3 23 Evaluaci n de m trica de ofuscaci n mediante Zelix KlassMaster 3 5 7 SMOKESCREEN OBJETOS CONTENIDO PUNTUACI N 1 Public Renombrar Identificadores Protected 1 Borrado de N mero de L neas 2 Encriptado de String Le OFUSCACION DE DATOS OFUSCACION DE LAYOUT rien rc INES E SETS orescano i C recomende rocan onsen OO o Tabla 3 24 Evaluaci n de m trica de ofuscaci n mediante Smokescreen 122 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 8 JOGA F Renombrar Identificadores OFUSCACION DE LAYOUT O e o OOO ee o o A ACI DE ANTI A A Tabla 3 25 Evaluaci n de m trica de ofuscaci n mediante JoGa OFUSCACI N DE DATOS 3 5 9 JOBFUSCATE OBJETOS CONTENIDO PUNTUACI N OFUSCACION DE LAYOUT Encriptado de String OFUSCACION DE DATOS ee o OOO e ACI PROSCAGONDECONTROL none sr O DETECTO ACI IST UNC DA A Tabla 3 26 Evaluaci n de m trica de ofuscaci n mediante Jobfuscate 123 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 10 MARVINOB
43. de nuestra aplicaci n Testl jar 1 425 bytes produce como resultado Test 2res jar 2 018 bytes A costa de obtener una mayor seguridad para la prevenci n de la ingenier a inversa 3 2 5 CAFEBABE 3 2 5 1 Introducci n CafeBabe m s que un ofuscador es un completo desensamblador de c digo Java que adem s permite ofuscar y compactar el c digo Muestra visualmente toda la informaci n contenida dentro del Java bytecode atributos m todos argumentos excepciones cuerpo de los m todos informaci n adicional incluida dentro de las clases etc En cuanto a la tarea de ofuscaci n proporciona la posibilidad de proteger el c digo de aplicaciones contra ataques de ingenier a inversa CafeBabe analiza las clases cargadas encuentra dependencias entre ellas y resuelve la tarea de ofuscaci n Podemos seleccionar los objetos a ofuscar paquetes clases o miembros de clases Adem s permite mover clases de diferentes paquetes hacia un paquete an nimo Este m todo consigue que se reduzca en gran medida el tama o de nuestro proyecto Algunas de las caracter sticas de esta aplicaci n son e Representa el bytecode tal como es dentro del formato de los archivos de las clases compiladas e Puede leer las clases directamente desde un archivo jar o zip e interpretar toda la estructura de los mismos e Permite buscar una cadena dentro del bytecode e Permite mostrar la informaci n mostrada en formato UTF8
44. el bytecode de la clase o m todo seleccionado Lo primero es cargar nuestra aplicaci n Para ello solo tenemos que ir a la pesta a File y seleccionar Open Se abrir un navegador que nos permitir abrir clases especificando un directorio o un archivo zip o jar en los cuales estar n contenidas Una vez cargada podemos ver el bytecode completo de nuestra aplicaci n estructurado por ventanas como hemos explicado anteriormente A nosotros de todas las herramientas proporcionadas por Zelix KlassMaster solo nos interesa el proceso de ofuscaci n Para ofuscar solo tenemos que ir a la pesta a de herramientas y seleccionar Obfuscate Esta herramienta renombra paquetes clases y miembros de clases En primer lugar nos aparece una ventana Obfuscate Name Exclusions desde la cual podemos especificar que paquetes clases y miembros de clases no queremos que sean renombrados En el manual de usuario se explica detalladamente como realizar esta selecci n En nuestro caso nos limitaremos a no renombrar la clase que contiene el m todo main as como ste Para ello dispone de una pesta a que directamente lo selecciona De esta forma vamos a conseguir que el renombrado sea lo mas agresivo posible A continuaci n pulsamos Next para especificar las opciones adecuadas en el proceso de ofuscaci n Las opciones que proporciona Zelix KlassMaster son e use input change log file de esta forma se especifica un archivo desde el que se rea
45. if icmpge 88 9 iinc 2 1 12 Tine Lg Ll 15 goto 4 18 getstatic 17 Field java lang System out Ljava io PrintStream 21 invokevirtual 32 Method java io PrintStream println V 24 getstatic 17 Field java lang System out Ljava io PrintStream 27 new 34 class StringBuffer 30 dup 31 invokespecial 35 Method java lang StringBuffer lt init gt V 34 getstatic 77 Field 0 Ljava lang String 37 bipush 39 393 bipush 55 41 invokevirtual 63 Method java String 44 invokevirtual 41 Method java String Ljava lang StringBuffer 47 iload 1 48 invokevirtual 44 Method java g StringBuffer lang String substring II Ljava lang lang StringBuffer append Ljava lang lang StringBuffer append I Ljava lan 78 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 51 invokevirtual 48 Method java lang StringBuffer toString Ljava la ng String 54 invokevirtual 30 Method java io PrintStream println Ljava lang St ring V 57 return 58 athrow 59 getstatic 17 Field java lang System out Ljava io PrintStream 62 getstatic 77 Field 0 Ljava lang String 65 bipush 19 67 bipush 39 69 invokevirtual 63 Method java lang String substring II Ljava lang String 72 ainvokevirtual 30 Method java io PrintStream println Ljava lang St ring V 75 iload 1 76 iconst 1 77 if icmple 18
46. invokevirtual 18 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 69 aload_0 70 invokespecial 19 Method FO getVector 1 73 invokevirtual 20 Method java lang StringBuffer append I Ljava lan g StringBuffer 76 invokevirtual 21 Method java lang StringBuffer toString Ljava la ng String 79 lt invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 82 return protected java lang String Code Os aload_0 EO pruebaOfus 90 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Ts ldc 22 String PRUEBA DE OFUSCACION 3 putfield 8 Field BO aux Ljava lang String 6 aload_0 Ps getfield 8 Field BO aux Ljava lang String 10 areturn private int FO getVector Code O aload 0 Jrs getfield 9 Field CO vector I 4 iconst_0 Ds iconst_1 6 iastore Ti aload 0 8 getfield 9 Field CO vector I 11 iconst_0 12 iaload 13 return Programa 3 28 Bytecode ZO_Hola class class ZO Hola extends java lang Object public ZO Hola Code 0 aload 0 Tes invokespecial 1 Method java lang Object lt init gt V 4 iconst_1 5 istore 1 6 return public java lang String DO getHola java lang String Code 0 aload_1 1 areturn En base a la comparaci n de estos bytecodes ofuscados y los originales podemos evaluar la m trica Ver t
47. los ejecutamos D Temp prueba jar xf Testl2res jar Obtenemos los siguientes archivos Test class 958 bytes A class 217 bytes Para comprobar que siguen realizando la misma funci n ejecutamos 56 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java D Temp prueba java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 5 Con objeto de comparar los bytecodes obtenidos ver programa 3 17 y 3 18 con los del c digo fuente original y poder evaluar as el proceso de ofuscaci n llevado a cabo por la aplicaci n CafeBabe ejecutamos D Temp prueba javap c p l Testl D Temp prueba javap c p 1 A Programa 3 17 Bytecode Test1 class Compiled from null public class Testl extends java lang Object public A ajb protected java lang String ajc private int ajd public static void main java lang String Code 03 new 1 class Testl 3s dup 4 invokespecial 2 Method lt init gt V iat pop 8 return public Testl Code O aload 0 I invokespecial 3 Method java lang Object lt init gt V 4 aload 0 5s new 4 class A 8 dup 9 invokespecial 5 Method A lt init gt V 12 putfield 6 Field ajb LA 15 aload_0 16 ide 7 String 18 putfield 8 Field ajc Ljava lang String 21 aload_0 22 bipush 10 24 newarray int 26 putfield 9 Field ajd 1 29 getstatic 10 Field java lang System ou
48. n Un conjunto de archivos class P al pasar por un ofuscador se convierten en otro conjunto de archivos class P siendo el c digo de ambos conjuntos distinto pero su funcionalidad la misma LIA cio IA class P lt gt class P Figura 2 1 Proceso de Ofuscaci n Como hemos comentado anteriormente otra de las posibles utilidades de la ofuscaci n del c digo la encontramos en aplicaciones para dispositivos m viles Estos dispositivos tienen una potencia de c lculo baja interfaces de usuario pobres y memoria limitada Mediante la ofuscaci n del c digo estamos optimizando y reduciendo el tama o de las aplicaciones rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 3 MEDIDA DE LA OFUSCACI N Para tener una idea de la efectividad de los ofuscadores es necesario estudiar el proceso de ofuscaci n de acuerdo a una serie de medidas En general la ofuscaci n puede ser medida como suma de lo siguiente e Carga de procesado Potency E P E P 1 e Flexibilidad Resilience para recuperar el c digo original trivial d bil fuerte completa en un sentido one way e Coste de la ofuscaci n e Ocultaci n de la ofuscaci n Stealth Las medidas de ofuscaci n obfuscation metrics son dise adas de acuerdo a las transformaciones y t cnicas usadas por los ofuscadores disponibles en Internet Tambi n atendiendo al uso que actualmente se da a los ofuscado
49. n proceso de ingenier a inversa capaz de deshacer los cambios realizados por un ofuscador de manera autom tica Otro beneficio que se obtiene al aplicar la ofuscaci n sobre nuestro c digo Java es que se reduce considerablemente el tama o de las clases ya que la ofuscaci n elimina como se ha comentado anteriormente toda la informaci n innecesaria y reemplaza los nombres largos puestos por los programadores para una mejor comprensi n por otros mucho m s cortos class a int c etc Esta reducci n en el tama o de las clases se traduce en una carga m s r pida de los applets ya que la transmisi n de estos v a Internet se realiza en un tiempo menor Esto tambi n supone una gran ventaja para su utilizaci n en programas o aplicaciones para dispositivos m viles para los cuales tenemos unos requerimientos mas estrictos en cuanto a me memoria y capacidad 14 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 5 PROCESO DE OFUSCACI N Los ofuscadores pueden trabajar de dos maneras seg n realicen el proceso de ofuscaci n 1 Una manera es empezar la ofuscaci n partiendo de la clase principal o su equivalente en los applets y realizar un rbol de las clases accesibles desde la clase principal y aplicar la ofuscaci n en este orden Esto se conoce como ofuscaci n con entrada de punto nico Este m todo es bastante rudimentario y muy limitado ya que c digo con m ltiples
50. o archivos jar zip 2 A continuaci n configuramos las opciones de optimizaci n compactaci n y ofuscaci n para ello navegamos por el men Optimazation seleccionando las opciones que deseemos Ver apartado de utilizaci n de la aplicaci n Se han seleccionado las opciones m s severas 3 Comprobamos que no ha ocurrido error alguno durante el proceso llevado a cabo Para ello inspeccionamos los ficheros generados Ver programas 3 31 y 3 32 81 rea de Ing Programa 3 31 Archivo que refleja incidencias del proceso JoGaLog txt enier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java output directory D Temp prueba JoGaDIR analysed classes methods fields totally i e plus system classes 10 153 19 methodCalls 12 fieldCalls 7 choosen optimizations remove debug infos compress constant pools merge classes inline methods remove classes remove methods remove fields remove superflouse byte cod rename packages rename classes rename methods rename fields optimize byte code optimize local variable order optimize local variable compression analyse local variable liveness analyse constant values optimize dead local variables REMOVED CLASSES none REMOVED METHODS none REMOVED SUPERFLUOUS BYTE CODE none REMOVED FIELDS
51. primeramente extraemos los bytecodes del contenedor de salida y posteriormente los ejecutamos D Temp prueba jar xf Test12res jar 48 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Obtenemos los siguientes archivos Testl class 914 bytes Lclass 208 bytes mas un directorio que contiene una nueva clase tambi n denominada I class 1 014 bytes Esta nueva clase aparece como consecuencia del proceso de encriptaci n Jshrink utiliza para ello llamadas a m todos que devuelven strings encriptados Al ejecutar nuestro ejemplo comprobamos que sigue realizando la misma funci n D Temp prueba java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 4 A continuaci n obtenemos los bytecodes de las clases ofuscadas para poder compararlas con sus hom logas sin ofuscar y as poder evaluar nuestra m trica D Temp prueba javap c p l Testl D Temp prueba javap c p l I Programa 3 14 Bytecode Test1 class Compiled from Testl public class Testl extends Java lang Object public I append protected java lang String out private int println public static final void main java lang String Code 0 new 1 class Test1 3 dup 4 invokespecial 2 Method lt init gt V ae pop 8 return public Testl Code O aload 0 Ig invokespecial 3 Method java lang Object lt init gt V 4 aload 0 5s new 4 class I 8 dup 9 inv
52. principales caracter sticas que una aplicaci n de este tipo debe ofrecer Con esta nueva prueba a adimos mayor realismo a los resultados obtenidos hasta el momento y por tanto a la comparativa final Para los 11 ofuscadores que hemos comprobado que funcionan correctamente de la colecci n inicial vamos a proceder como refleja el siguiente esquema Esquema 3 2 Proceso de evaluaci n de programa l gico Para cada ofuscador o Intentar ofuscar programa l gico con las opciones de seguridad mas restricctivas a Verificar que el programa realiza la misma funci n Si fallo intentar con opciones menos restricctivas Repetir o a Si fallo persiste devolver error o a Devolver o a Como programa l gico hemos seleccionado una aplicaci n que se ajuste a nuestras necesidades es decir una aplicaci n de cierto peso sin ser excesivamente compleja pues debemos ser capaces de determinar puntos de entrada para la ofuscaci n y resolver todas las dependencias para evitar conflictos debido al proceso de renombrado No es objeto de este proyecto el escribir un ejemplo de tal envergadura as pues hemos recurrido a Internet para encontrar tal aplicaci n En concreto se trata de un programa dise ado para la exploraci n del conjunto de Mandelbrot El denominado Mandelbrot Set es un fractal Los fractales son objetos que presentan ciertas similitudes a diferentes escalas Tampoco es objeto de este proyecto el an lisis de la a
53. recupera son los comentarios Renombrando los archivos descompilados notar que el archivo java ha de tener el mismo nombre que la clase principal del c digo fuente y volviendo a compilarlos comprobamos que siguen realizando la misma funci n D Temp prueba gt java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Conclusiones e Antes de ser ofuscado el c digo del ejemplo Test puede ser descompilado con xito e Comparando c digo fuente y bytecode ambos tienen los mismos identificadores e Al comparar c digo fuente original y descompilado observamos que son iguales pero no aparecen comentarios en el ltimo e El c digo descompilado realiza la misma funci n que el original 23 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 6 2 2 EJEMPLO 2 El c digo fuente del ejemplo 2 es Test2 java 634 bytes Al compilar obtenemos un solo archivo de bytecode Test2 class 780 bytes C digo Fuente A continuaci n detallamos el c digo fuente de nuestro segundo ejemplo No debemos olvidar que esta aplicaci n la dise amos para comprobar el comportamiento de los ofuscadores con respecto a la ofuscaci n de control Ver programa 2 6 Programa 2 6 C digo fuente de aplicaci n Test2 java Ejemplo2 Test2 Proposito Comprobar el comportamiento de un ofuscador con respecto a ofuscacion de control Fecha realizaci n 11 3 2005 Autor Angel
54. referido a ofuscaci n de Control Para los 12 ofuscadores recopilados intentaremos un procesado de testeo y evaluaci n reflejado en el siguiente esquema Esquema 3 1 Proceso de evaluaci n Para cada ofuscador o Para cada ejemplo i Si i 2 y ofuscador no proporciona ofuscaci n de Control Especificar No Disponible N A Intentar ofuscar ejemplo i con ofuscador o con las opciones a de seguridad mas elevadas Verficar que el programa aun realiza la misma funci n Si fallo Probar con nivel de seguridad menor Repetir 0 a i Si fallo persiste Devolver fallo Devolver xito 0 a i 3 2 1 PROGUARD 3 2 1 1 Introducci n Es un compactador optimizador y ofuscador para archivos class Java Puede detectar y borrar clases miembros m todos y atributos sin uso Puede por tanto optimizar bytecode y borrar instrucciones no usadas Finalmente puede renombrar los identificadores de clases miembros y m todos usando nombres cortos sin ning n sentido El resultado jar ser de menor tama o y m s dif cil de descompilar Ver figura 3 2 La principal ventaja con respecto a otros ofuscadores Java es probablemente su configuraci n compacta y sencilla Mediante opciones en l nea de comandos o con un archivo de configuraci n pueden realizarse f cilmente las utilidades expuestas anteriormente Proguard es una herramienta de l nea de comandos con una interfaz gr fica opcional Tambi n se proporciona
55. ACI N DE OFUSCADORES En la siguiente tabla hemos recopilado la informaci n que hemos encontrado sobre los ofuscadores que vamos a evaluar as como sus caracter sticas m s destacables OFUSCADOR VERSION LICENCIA CARACTER STICAS Optimiza y Ofusca mediante una plantilla de configuraci n Proguard v3 2 Open Source fProporciona soporte para Ant y J2ME Ofuscador Versi n actualizada de Retroguard Puede Javaguard v 1 0 Beta 4 Open Source ejecutarse desde l nea de comandos o mediante GUI R d 2 01 o S Ofuscador altamente configurable para bytecode Java con etroguar vee Pen Qource soporte para Java 2 reflexi n y encriptado eee f Borra clases innecesarias y ofusca aplicaciones applets yl Marvin v 1 2b Freeware servlets Soporta encriptado de String Ofuscador Java Soporta renombramiento selectivo borrado Smokescreen v3 41 Shareware de m todos y campos sin uso Puede usrase con o sin GUI y Freeware Open POfuscador de bytecode configurable para ejecutarse guard v 1 3 2 Source mediante Ant scripts Comercial versi n Ofuscador de Java con ofuscaci n de control de flujo Zelix KlassMaster v4 3 ie encriptado integraci n con Ant J2ME pluggin y capacidad de evaluaci n ICA de decompilaci n eB Desamblador de c digo Java que adem s permite compacta CafeBabe v1 2 7a Open Source y ofuscar Es b sicamente un optimizador de c digo Java Permite v 0 1 alpha reducir el tama o de aplicaciones applets y apis Tabla 3 1 R
56. Estudio y Prueba de una M trica para los Ofuscadores Java 92 93 96 99 102 103 106 107 110 iload 1 ifeq getstati ifeq iconst_0 goto iconst 1 putstati return 110 c 78 Field d Z 106 107 c 78 Field d Z protected java lang String a Code O RP O gO E WO e os oo oo oo private Code ZONA E T23 1 3 aload 0 getstati iconst_2 aaload putfield aload 0 getfield areturn int b aload 0 getfield iconst_0 iconst 1 iastore aload_0 getfield iconst_0 iaload ireturn static Code O Nu PF 12 133 14 16 19 20 217z 224 24 27 28 31 2 34 354 38 40 41 42 43 46 47 iconst_3 anewarra dup iconst_0 ldc jsr aastore dup iconst_1 ldc jsr aastore dup iconst_2 ldc jsr aastore putstati goto astore 0 invokevi dup C 98 Field z Ljava lang String 8 Field b Ljava lang String 8 Field b Ljava lang String 9 Field c 1 9 Field c 1 y 82 class String 17 String M gt 1MdWVq 34 11 String gt gt oE 0 r 34 22 String X1 01 02G6 13 0s 34 98 Field z Ljava lang String 133 rtual 88 Method java lang String toCharArray C arraylength swap iconst_0 istore 1 goto dup iload 1 112 64 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 48 49 50 51 52s 53 84 86 89 OF
57. FUSCATOR OBJETOS CONTENIDO PUNTUACI N Public Renombrar Identificadores Protected e eee Borrado de N mero de L neas ERP s Encriptado de String OFUSCACION DE DATOS OFUSCACI N DE LAYOUT IET NC TE ETS AI rem aci n cinema DECOMPILACI N DE PROGRAMA OFUSCADO PUNTUACI N TOTAL Tabla 3 27 Evaluaci n de m trica de ofuscaci n mediante Marvin Obfuscator 3 5 11 YGUARD OBJETOS CONTENIDO PUNTUACI N E MEE f Renombrar Identificadores Protected OFUSCACION DE LAYOUT Private Borrado de N mero de L neas E Encriptado de String i ae OFUSCACION DE DATOS ee ACI PROSCAGONDECONTROL ATENEO gt DTCC AAC DTS AAC DAT o Tabla 3 28 Evaluaci n de m trica de ofuscaci n mediante yGuard 124 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 12 CONCLUSIONES De todas las herramientas de ofuscaci n analizadas concluimos que Zelix KlassMaster es la m s completa En el apartado de ofuscaci n no solamente proporciona ofuscaci n de Estructura como la mayor a de las aplicaciones sino que aporta opciones para la ofuscaci n de Datos y Control De todo ello seg n lo estudiado en el apartado referente a t cnicas de ofuscaci n se desprende que es la aplicaci n que mayor oscurecimiento produce en el c digo Esto lo hemos podido comprobar al intentar descompilar el bytecode ofuscado Ha sido la nica herramienta capaz de oscurecer el c
58. ILIZACI N APLICACIONES cscccscscscscscscsesssssevsssssesesesesesssesesesesssecscacscacscsesesessnssvsnacavsesese 132 PROG UARID e ee eb i hs 132 REFROGUARD e ate eee cee eee 133 JAVAGUARD eso cssodcecsene aac eo ecco o a ala doo 133 SARNA ec 135 CAFEBABE 3 dera 136 ZFM IX K ASS MASTER io 136 SMOKESCREEN e n r a E TE 138 OOA a a users gaeats 140 O PUS OA E isso occ Se a aE 140 MARVINOBFUSCATOR cccccccccccecssssscssccccsessssscssccsceesesssessecscsesesssesssssesesesseseseseeeees 141 NAGAR Di sce A AT 143 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 1 OBJETIVOS Internet ha ayudado a Java a situarse como l der de los lenguajes de programaci n y por su lado Java ha tenido un profundo efecto sobre Internet La raz n de esto es bastante simple Java amplia el universo de objetos que pueden moverse libremente por el ciberespacio Antes de Java Internet estaba cerrada a la mitad de las entidades que ahora viven en ella debido a cuestiones de seguridad y portabilidad La llave que permite a Java resolver los problemas descritos anteriormente es que la salida de un compilador Java no es c digo ejecutable sino que es c digo binario bytecode Este c digo binario es un conjunto de instrucciones altamente optimizado dise ado para ser ejecutado por una m quina virtual que emula el int rprete de Java Es decir el int rprete de Java es un int rprete de c digo binario Esto hace mucho
59. LA MUNDO System out println pruebaOfus System out printin Ejemplo getVector protected String pruebaOfus aux PRUEBA DE OFUSCACION return aux private int getVector vector 0 1 return vector 0 class Hola public Hola int num 1 public String getHola String cadena return cadena 19 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Al compilar mediante J2SDK1 4 2_07 obtenemos las dos clases mencionadas anteriormente Testl class y Hola class Ejecutando comprobamos el correcto funcionamiento de nuestra aplicaci n D Temp prueba gt java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Bytecode Para obtener el bytecode de nuestro ejemplo 1 ejecutamos la aplicaci n javap con las opciones oportunas Observar lo obtenido en programa 2 2 y programa 2 3 Programa 2 2 Bytecode Test1 class D Temp prueba gt javap c p 1 Testl Compiled from Testl java public class Testl extends java lang Object public Hola hello protected java lang String aux private int vector public static void main java lang String Code O new 1 class Testl 3 dup 4 invokespecial 2 Method lt init gt V dez pop 8 return LineNumberTable line 12 0 line 13 8 public Testl Code O aload 0 des invokespecial 3 Method java lang Object lt init gt V 4 aload 0 Ds
60. Miralles Arevalo public class Test2 public static void main String args int bucleNum 0 test bucle for for int i 0 i lt 2 it bucleNum test sentencia condicional if bucleNum gt 1 System out print Numero de bucle gt 1 else System out println Numero de bucle lt 1 test bucle while while bucleNum gt 1 bucleNum bucleNum 1 System out println System out println Numero de bucle bucleNum Al compilar mediante J2SDK1 4 2_07 obtenemos el bytecode Test2 class Ejecutando comprobamos el correcto funcionamiento de nuestra aplicaci n D Temp prueba gt java Test2 Numero de bucle gt 1 Numero de bucle 1 Bytecode Ejecutando la aplicaci n javap con las opciones adecuadas obtenemos el bytecode correspondiente al segundo ejemplo Ver programa 2 7 24 Area de Ingenier a Telem tica Programa 2 7 Bytecode Test2 class Estudio y Prueba de una M trica para los Ofuscadores Java D Temp prueba gt javap c p 1 Test2 Compiled from Test2 java public class Test2 extends java lang Object public Test2 Code O aload 0 ES invokespecial 1 Method java lang Object lt init gt V 4 return LineNumberTable line 7 0 public static void main Code java lang String O iconst_0 1 istore 1 26 iconst_0 3s istore 2 4 iload_2 D s iconst_2 63 if icmpge 18 9 iinc y I 12 iine
61. No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 13 e Despu s de ser ofuscado con las opciones m s severas que permite la versi n de prueba nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo Se proporcionan unas breves indicaciones sobre su utilizaci n en la p gina web asociada 92 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 11 MARVINOBFUSCATOR 3 2 11 1 Introducci n Esta herramienta rescribe las aplicaciones Java de manera que las hace imposibles de descompilar y entender su funcionamiento interno Algunas de las caracter sticas m s destacables de MarvinObfuscator se exponen a continuaci n e Proh be virtualmente la ingenier a inversa e El c digo ofuscado no es usualmente recompilable e Procesa cualquier aplicaci n applet o servlet e El c digo resultante es compatible con cualquier JVM e Genera un archivo de salida jar muy compacto e Borra informaci n de paquetes renombra identificadores de clases m todos y campos e Encripta strings e Borra clases innecesarias e Borra toda informaci n redundante 3 2 11 2 Ofuscaci n de Ejemplo 1 Los pasos que hemos seguido para la ofuscaci n del ejemplo 1 y la posterior evaluaci n de la m trica han sido los siguientes 1 Modificar el script de configuraci n que proporciona la aplicaci n indic
62. NotFoundException grad PresetGradientPainter java lang ClassNotFoundException grad PresetGradientPainter at Java net URLClassloader 1 run Unknown Source at jJava security AccessController doPrivileged Native Method at java net URLClassLoader findClass Unknown Source at java lang ClassLoader loadClass Unknown Source at sun misc LauncherSAppClassLoader loadClass Unknown Source at java lang ClassLoader loadClass Unknown Source at java lang ClassLoader loadClassInternal Unknown Source at java lang Class forName0 Native Method at java lang Class forName Unknown Source at java io ObjectInputStream resolveClass Unknown Source at java io ObjectInputStream readNonProxyDesc Unknown Source at java io ObjectInputStream readClassDesc Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readArray Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream defaultReadFields Unknown Source at java io ObjectInputStream readSerialData Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readObject Unknown Source at g lt init gt Unknown Source at g lt init gt Unknown Source at c lt init gt Unknown Source at
63. PLO 1 ofuscado M TRICA PUNTUACI N Testiclass Test1 class a class C g Campos out ps a R PRUEBA DE 1 Desestructuracion de vector rintin Datos E Puntuaci n para Ofuscaci n de Layout y Datos Tabla 3 8 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 4 4 Conclusi n e Jshrink puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e Es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 8 proporciona opciones de encriptado Sin embargo no realiza desestructuraci n de datos e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e Debemos destacar que finaliza el c digo de manera que borra toda informaci n de throws marca todos los m todos no dominantes como final de manera que puedan ser inlined durante la ejecuci n y puede que no se preserven los miembros generados en la compilaci n usados por clases internas e invocaci n de m todos remotos RMD e No proporciona mecanismos para ofuscaci n de Control de Flujo 54 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Como hemos comentado anteriormente el proceso de encriptado supone una cierta sobrecarga que se ve reflejada en un aumento del tama o
64. SE O DE EJEMPLOS Entorno Windows XP Ordenador Personal Herramientas J2SDK1 4 2_07 Descompilador de Java Descompilador JODE 17 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Los ejemplos han sido dise ados de acuerdo a la m trica de ofuscaci n Tenemos dos ejemplos Test y Test2 Son usados para medir las diferentes m tricas individuales estudiadas anteriormente Testl mide el comportamiento de un ofuscador en lo referente a ofuscaci n de Estructura y ofuscaci n de Datos El ejemplo Test2 mide el comportamiento en cuanto a ofuscaci n de Control Con el objeto de simplificar y ver como puntuar cada m trica individual hemos listado los objetos de cada ejemplo de acuerdo a la m trica dise ada en la secci n anterior 2 6 1 Dise o de M trica de Ofuscaci n Ver tabla 2 5 EJEMPLO 1 EJEMPLO 2 M TRICA INC AE IE EEE eames lo campos Js Borrado Numero Linea__ Numero de Linea EE Transformacion Bucles y P Se if else for while Sentencias Condicionales Tabla 2 5 Identificadores originales de los objetos bajo observaci n para la m trica de ofuscaci n El proceso que se ha llevado a cabo para el dise o de los ejemplos ha sido el siguiente e En primer lugar escribir el c digo Java de los ejemplos e En segundo lugar compilaci n y ejecuci n de los archivos class resultantes para asegurarnos de que funcionan apropiadamente
65. TT TTT TTT TTT TTT TT The name of your applet or applications s main class 141 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e g executable class servlet or applet as it would appear in lt applet code gt or in java Note the double parentheses mainClasses Testl1 If you want your main class to be called differently after the obfuscation you can enter the new name including package like this mainClasses myapp Main newName main You can also have more than one main class mainClasses myapp ServletA myapp ServletB AAA AAA AAA AAA AAA AAA TAA ATA TTI TTT ATA AAA ATTA AAT Names of methods without class name that are accessed via reflection The obfuscator will not change the names of these methods preserveMethodNames methodNamel methodName2 reflected AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA ATTA TATA Classes that are accessed via reflection The obfuscator will not change the names of these classes Note Method names within these classes will still be obfuscated If you need to preserve method names too what you probably want is externalClasses Note You can use the wildcard character preserveClassNames mypackage SpecialClass AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA Cl
66. a dup invokespecial 5 Method a lt init gt V putfield 6 Field if La aload 0 ldc 7 String putfield 8 Field a Ljava lang String aload 0 bipush 10 newarray int putfield 9 Field do I getstatic 10 Field java lang System out Ljava io PrintStream aload_0 getfield 6 Field if La ldc 11 String HOLA MUNDO invokevirtual 12 Method a a Ljava lang String Ljava lang String invokevirtual 13 Method java io PrintStream printin Ljava lang St getstatic 10 Field java lang System out Ljava io PrintStream aload_0 invokevirtual 14 Method if Ljava lang String invokevirtual 13 Method java io PrintStream printin Ljava lang St getstatic 10 Field java lang System out Ljava io PrintStream new 15 class StringBuffer 44 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 60 dup 61 invokespecial 16 Method java lang StringBuffer lt init gt V 64 lde 17 String Ejemplo 66 invokevirtual 18 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 69 aload_0 70 invokespecial 19 Method a I 73 invokevirtual 20 Method java lang StringBuffer append I Ljava lan g StringBuffer 76 invokevirtual 21 Method java lang StringBuffer toString Ljava la ng String 79 ainvokevirtual 13 Method Java io PrintStream println Ljava lang St ring V 82 return
67. a Estudio y Prueba de una M trica para los Ofuscadores Java Programa 3 22 Archivo ChangeLog donde se reflejan incidencias de ofuscai n D Temp prueba log txt version 4 3 6d 2005 03 29 17 15 13 DO NOT EDIT THIS FILE You need it to interpret exception stack traces Class public Test2 NameNotChanged Source Test2 java Fieldsof Test2 public static boolean A NameNotChanged private static java lang String B NameNotChanged public static boolean z NameNotChanged MethodsOf Test2 public static void main java lang String NameNotChanged TraceBackClass Test2 Data 1638 ForwardClass Test2 Data 1567 MemberClass Test2 Data 467 El archivo de salida a class 1 118 bytes segu a realizando la misma funci n para comprobarlo ejecutamos la instrucci n D Temp prueba gt java a Numero de bucle gt 1 Numero de bucle 1 5 A continuaci n comparamos el bytecode ofuscado obtenido con el original para poder as evaluar el proceso de ofuscaci n llevado a cabo por la aplicaci n Zelix KlasMaster Ver programa 3 23 D Temp prueba javap c p l a Programa 3 23 Bytecode a class Compiled from a java public class a extends java lang Object public static boolean z public static boolean A private static java lang String B public a Code O aload 0 des invokespecial 1 Method java lang Object lt init gt V 4 return public static void main java lang String
68. a el proceso de ofuscaci n A pesar de la facilidad de configuraci n del script fueron necesarias varias simulaciones hasta conseguir el resultado deseado 142 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Para la ejecuci n de MarvinObfuscator es necesario indicar el directorio en el que se encuentra la aplicaci n a ofuscar en el que previamente hemos introducido el script de configuraci n as como el nombre del archivo de salida C MarvinObfuscator obfuscate prueba Testlres jar Donde contamos con un ejecutable obfuscate bat en el que se especifica la ruta de la m quina virtual de Java JVM y la instrucci n de llamada a la aplicaci n Marvin Ver programa 3 Programa 3 Ejecutable MarvinObfuscator echo off set JAVALIB C j2sdk1 4 2_07 jre bin java cp marvinobfuscator jar SJAVALIBS drjava marvin Obfuscate YGUARD Para hacer uso de la tarea de ofuscaci n de yGuard debemos tener instalado y configurado Ant apropiadamente Para ejecutar yGuard deberemos crear un script build xml que contendr las opciones del proceso de ofuscaci n La forma de generar este script se detalla en el manual de usuario de la aplicaci n Cabe destacar que es uno de los manuales mas detallados que hemos encontrado en el an lisis de los ofuscadores cosa de agradecer porque no todos los usuarios se hallan familiarizados con XML y el compilador Ant Las opciones se detallan en l
69. a interfaz gr fica que proporciona Por tanto puntuamos con un 0 la m trica individual correspondiente 36 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 1 4 Conclusiones e Proguard puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 5 es decir no proporciona opciones de encriptado o desestructuraci n de datos e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo e La interfaz gr fica que ofrece es bastante intuitiva y f cil de manejar Hemos comprobado que se llega al mismo resultado 3 2 2 RETROGUARD 3 2 2 1 Introducci n Retroguard es un ofuscador de bytecode una herramienta dise ada para renombrar los identificadores comprensibles asignados por el programador en las clases Java mediante strings sin sentido alguno haciendo la labor de ingenier a inversa casi imposible El resultado es un c digo m s compacto es decir de menor tama o y la confianza de que el c digo est a salvo de ingenier a inversa Las caracter sticas que proporciona se detallan a continuaci n e Reduce el tama o del byt
70. abla 3 13 Hemos puntuado el renombramiento llevado a cabo porque aunque no sea del todo efectivo demuestra que la aplicaci n es capaz de realizar ofuscaci n de Estructura 3 2 10 3 Ofuscaci n de Ejemplo 2 Jobfuscate no proporciona como opci n ofuscaci n de Control de Flujo Por tanto puntuamos con un O la m trica individual correspondiente Para la versi n de evaluaci n no se especifica como opci n Sin embargo tampoco parece que la versi n registrada ofrezca ofuscaci n de Control a juzgar por la informaci n que se ofrece al usuario en la p gina web asociada a la aplicaci n 91 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java EJEMPLO 1 sin EJEMPLO 1 ofuscado M TRICA PUNTUACI N Testiclass Test1 class 4 ES s r Ea 1 Ba pea oS ES Encriptado de Strin SERA DE TRUEBADE p 8 OFUSCACION OFUSCACION Desestructuracion de Puntuaci n para Ofuscaci n de Layout y Datos Tabla 3 13 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 10 4 Conclusiones e Jobfuscate puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private e Fn este caso el proceso de renombrado no es efectivo como hemos explicado anteriormente pero comprobamos que la versi n de prueba lleva a cabo este cometido Adem s borra toda informaci n redundante como comentarios miembros si uso etc e
71. aci n pero que presenta problemas si nuestra aplicaci n cuenta con Reflection API calls El programa l gico cuenta con este tipo de llamadas por tanto se aconseja que toda clase que las contenga sea excluida del proceso de ofuscaci n con objeto de que no se produzcan errores Despu s de varias simulaciones hemos sido incapaces de conseguir que se generara el contenedor de salida Siempre se producen errores por este tipo de llamadas En el logfile que se genera se advierte de estos errores pero no donde se producen concretamente para poder preservar todas las clases donde hay llamadas de este tipo Al no haber escrito el c digo fuente de la aplicaci n pues resulta bastante dif cil determinar en cual de las 45 clases existentes hay llamadas a Class ForName Debido a la no inclusi n de una opci n para tener en cuenta las Reflection API calls asignamos a la m trica correspondiente un 0 Jobfuscate no es capaz de ofuscar nuestro programa l gico 3 3 10 MARVINOBFUSCATOR MarvinObfuscator es una aplicaci n de ofuscaci n muy elemental permite ofuscaci n de Estructura y de Datos pero no proporciona opciones de configuraci n para el proceso de ofuscaci n concernientes a serializaci n o Reflection API calls Por tanto cabe esperar que la ofuscaci n de nuestro programa l gico no se lleve a cabo correctamente Efectivamente despu s de varias simulaciones intentando preservar clases conflictivas no hemos consegu
72. adido del proceso de ofuscaci n yGuard proporciona un fichero de salida jar de menor peso es decir consigue reducir su tama o Esto repercute en un tiempo de carga y en un tiempo de ejecuci n menores para las aplicaciones desarrolladas yGuard est basado en una versi n del ofuscador Retroguard que es distribuido bajo licencia LGPL para la que se ha mejorado el c digo existente y se ha construido una librer a reutilizable Por encima de esto cuenta con integraci n bajo Ant esto permite a desarrolladores integrar el proceso de ofuscaci n dentro del proceso de construcci n de una aplicaci n Las ventajas de la utilizaci n de yGuard frente a otras aplicaciones son e Es una aplicaci n gratuita e Integra Ant Las herramientas existentes usan mecanismos propietarios para invocar y configurar la tarea de ofuscaci n yGuard puede ser configurado completamente utilizando sintaxis XML en cualquier tarea Ant e Solventa muchos de los problemas que los usuarios experimentan al utilizar la librer a original de Retroguard e Ofusca correctamente programas que con dependencias de librer as externas e Puede autom ticamente renombrar y optimizar el c digo fuente de acuerdo a las opciones de ofuscaci n especificadas 3 2 12 2 Ofuscaci n de Ejemplo 1 98 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Los pasos que hemos seguido para la ofuscaci n de nuestro primer ejemplo y
73. adores de clases y miembros de clases En primer lugar hemos llevado a cabo el proceso de compactaci n del programa l gico El resultado ha sido un contendor de salida de menor peso que el original jmanexStrip jar 124 KB La aplicaci n compactada a n segu a funcionado correctamente Como hemos mencionado anteriormente CafeBabe no es una aplicaci n dise ada para la ofuscaci n No es compatible con serializaci n m todos nativos o Reflection API calls Despu s de ofuscar preservando nicamente la clase principal de mayor jerarqu a es necesario seleccionar punto de entrada para el proceso de ofuscaci n obtuvimos que al ejecutar nuestro programa se produc an los siguientes errores ver programa 3 60 Programa 3 60 Resultado de ejecuci n programa l gico ofuscado Unable to load gradient presets data Exception java lang ClassNotFoundException grad PresetGradientPainter java lang ClassNotFoundException grad PresetGradientPainter at java net URLClassLoader 1 run Unknown Source at jJava security AccessController doPrivileged Native Method at jJava net URLClassLoader findClass Unknown Source at java lang ClassLoader loadClass Unknown Source at sun misc LauncherS AppClassLoader loadClass Unknown Source at java lang ClassLoader loadClass Unknown Source at java lang ClassLoader loadClassInternal Unknown Source at java lang Class forName0 Native Method a
74. ados de sistemas una t cnica conocida como reciclado sem ntico Algunas caracter sticas que ofrece esta aplicaci n se detallan a continuaci n e Renombrado o eliminaci n de campos y m todos Public adem s de en Private Package Protected e Eliminaci n de clases sin uso e Renombrado de clases e Reciclado sem ntico de nombres compuestos e Incremento de opciones sobre el proceso de ofuscaci n e Una interfaz gr fica mejorada y de f cil uso e Descompilador integrado e Proporciona integraci n para J2ME MIDP e Manejo autom tico de clases ClassforName e Automatizaci n mediante scriptfile e Encriptado de cadenas e Salida como archivo jar o exe 3 2 4 2 Ofuscaci n de Ejemplo 1 Para la ofuscaci n de nuestro ejemplo hemos llevado a cabo los siguientes pasos 47 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 1 Generar el script con las opciones adecuadas para llevar a cabo la ofuscaci n m s agresiva posible Consultando el manual de usuario comprobamos que este script podemos crearlo mediante la interfaz gr fica que proporciona la aplicaci n o escribirlo directamente ver el programa 3 12 Programa 3 12 Script de configuraci n para Jshrink classpath C Archivos de programa Java j2re1 4 2 07 lib rt jar 1 noForName noGetMethod noNativePreserve stringEncrypt D Temp prueba Testl jar 2 Ejecutar Jshrink med
75. al putfield aload 0 getfield areturn int B aload_0 getfield iconst_0 iconst 1 iastore aload_0 getfield iconst_0 iaload ireturn 95 82 Method java lang String substring 25 25 27 27 Field _0 Ljava lang String Field B Ljava lang String Field B Ljava lang String Field C I Field C I IT Ljava lang Programa 3 27 Bytecode B class class B extends java lang Object static Code O ldc2 w 12 Se invokestatic 6 lcmp 7 ldc2 w 14 10 invokestatic 13 Lemp 14 dup t547 AEE 14 18 pop 19 dup 207 LLL 19 23 pop 24 return 25 athrow Exception table from to target 15 18 25 public B Code 0 iconst_1 1 aload 0 2 invokespecial 58 istore 1 long 21 long 21 type any 9 11134643087131 Method java lang System currentTimeMillis 11121683087131 Method java lang System currentTimeMillis Method java lang Object lt init gt V 75 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 6 return public java lang String A java lang String Code 0 aload_1 les areturn En base a la comparaci n de estos bytecodes ofuscados y los originales podemos evaluar la m trica Ver tabla 3 11 Hemos de destacar que a pesar de especificar la opci n de encriptado los strings de nuestro ejemplo 1 segu an apareciendo sin enc
76. al a la de Proguard si comparamos los bytecodes obtenidos en ambos casos comprobamos que la reducci n en el tama o es mayor al utilizar Proguard e Adem s hemos de destacar que Retroguard se ejecuta en l nea de comandos si ninguna opci n permitida No proporciona interfaz gr fica GUI 3 2 3 JAVAGUARD 3 2 3 1 Introducci n Ofuscador muy similar a la aplicaci n anterior Retroguard Herramienta de ofuscaci n desde l nea de comandos No muy intuitivo ya que no se proporciona manual de usuario en la p gina asociada 3 2 3 2 Ofuscaci n de Ejemplo 1 Con objeto de evaluar los apartados de la m trica dise a referentes a ofuscaci n de Estructura y Datos hemos llevado a cabo los siguientes pasos 1 Partimos del archivo Testl jar 1 425 bytes que contiene las clases de nuestro ejemplo 1 Ya vimos en casos anteriores c mo generarlo Desde l nea de comandos ejecutamos JavaGuard java JavaGuard i Testl jar o Testlres jar l logfile log v s script 42 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Obtenemos el archivo de salida Testlres jar 1 414 bytes as como un archivo donde se reflejan las incidencias del proceso de ofuscaci n logfile Ver programa 3 9 Programa 3 9 Archivo Logfile generado por JavaGuard If this log is to be used for incremental obfuscation patch generation add any class method field and attribute res
77. ando path de librer as para resolver posibles dependencias as como el nombre de la clase principal de nuestra aplicaci n que tomar MavirObfuscator como punto de entrada para el proceso de ofuscaci n Ver apartado de utilizaci n 2 Incluir este script en el directorio que contiene las clases de nuestro ejemplo 1 Testl class y Hola class 3 Ejecutar la aplicaci n MarvinObfuscator desde l nea de comandos como se ha especificado en el apartado de utilizaci n C MarvinObfuscator obfuscate prueba Testlres jar 4 Comprobar que se ha generado el archivo de salida y que no ha ocurrido error alguno durante el proceso de ofuscaci n En este caso no se proporciona opci n 93 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java para generar un logfile pero por la salida est ndar se muestran las incidencias del proceso Ver programa 3 29 Programa 3 29 Incidencias del proceso llevado a cabo por MarvinObfuscator The Marvin Obfuscator 1 2b c 2000 2001 by Dr Java www drjava de Pass 1 Pass 2 2 entries written to jar file total size 1294 processing time 150 ms Saved Testlres jar 1294 bytes 5 Extraer el contenido del archivo de salida y comprobar que efectivamente los bytecodes ofuscados siguen realizando la misma funci n C MarvinObfuscator jar xf Testlres jar Obtenemos los bytecodes de las dos clases ofuscadas Testl class 1 450 bytes y super
78. ang StringBuffer lt init gt V ethod I I 1I 1 Ljava lang String thod java lang StringBuffer append Ljava lang ethod out I thod java lang StringBuffer append I Ljava lan thod java lang StringBuffer toString Ljava la thod java io PrintStream println Ljava lang St protected final java lang String append Code O Ti PRO DW WO ee private Code Os ZO OBER 12 Pos aload 0 bipush 21 invokestatic putfield aload 0 getfield areturn int out aload_0 getfield iconst_0 iconst_1 iastore aload_0 getfield iconst_0 iaload ireturn 65 8 8 9 9 Method 1 1 1 1 Ljava lang String Field out Ljava lang String Field out Ljava lang String Field println I Field println I Programa 3 15 Bytecode Lclass Compiled from I class I extends jJava lang Object public I Code 0 OU us aload 0 invokespecial iconst 1 istore 1 return 1 Method java lang Object lt init gt V public final java lang String I java lang String Code O 18 aload_1 areturn Programa 3 16 Bytecode clase generada para encriptaci n I class 50 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Compiled from I I public class I I extends jJava lang Object static byte getClass static java lang String getResourceAsStream static int intern pu
79. ang System out Ljava io PrintStream new 8 class StringBuffer dup invokespecial 9 Method java lang StringBuffer lt init gt V ldc 10 String Ejemplo invokevirtual 11 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer aload_0 invokespecial 65 Method a 1 84 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 73 invokevirtual 12 Method java lang StringBuffer append I Ljava lan g StringBuffer 76 invokevirtual 13 Method java lang StringBuffer toString Ljava la ng String 79 ainvokevirtual 7 Method java io PrintStream println Ljava lang Str ing V 82 return protected java lang String a Code O aload 0 13 ldc 14 String PRUEBA DE OFUSCACION 3 putfield 56 Field b Ljava lang String 6 aload 0 7 getfield 56 Field b Ljava lang String 10 areturn private int a Code 0 aload 0 lis getfield 59 Field c I 4 iconst_0 Ds iconst_1 6 lastore 7 aload 0 8 getfield 59 Field c I 11 iconst_0 12 iaload 13 return Programa 3 24 Bytecode a class class a extends java lang Object public a Code O aload 0 invokespecial 1 Method java lang Object lt init gt V 4 return public java lang String a java lang String Code 0 aload_1 areturn En base a la comparaci n de estos bytecodes ofuscados y los orig
80. ap A gt lt map gt lt yguard gt Por salida estandar se muestra un mensaje de que el proceso de construcci n se ha llevado a cabo con xito Adem s en este logfile se muestra el proceso de renombrado llevado a cabo 4 Seguidamente comprobamos que el c digo ofuscado sigue realizando la misma funci n para ello en primer lugar tenemos que extraer los bytecodes del contendor de salida Testresl jar D Temp yguard 1 3 2 lib jar xf Testlres jar Obtenemos los archivos class ofuscados A class 925 bytes y B class 200 bytes Comprobamos que se han reducido con respecto a los originales D Temp yguard 1 3 2 lib gt java A HOLA MUNDO PRUEBA DE OFUSCACION 99 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Ejemplo 1 Comprobamos que efectivamente sigue realiz ndose la misma funci n 5 Por ltimo evaluamos la m trica mediante la comparaci n de los bytecodes que hemos obtenido como resultado del proceso de ofuscaci n con yGuard y los originales As podemos crear la tabla 3 15 E EJEMPLO 1 sin EJEMPLO 1 ofuscado METRICA PUNTUACI N a Private getVector Encriptado de Strin dia FERUPBA DE P 8 OFUSCACION OFUSCACION Desestructuracion de Puntuacion para Ofuscacion de Layout y Datos Tabla 3 15 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 12 3 Ofuscaci n de Ejemplo 2 yGuard no proporciona opci
81. arvinObfuscator no proporciona como opci n ofuscaci n de Control de Flujo Por tanto puntuamos con un 0 la m trica individual correspondiente 3 2 11 4 Conclusi n Smokescreen puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e Es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 14 proporciona opciones de encriptado Sin embargo no realiza desestructuraci n de datos e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo 97 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e No se proporciona un manual de usuario detallado en la p gina web asociada a la aplicaci n Quiz s sea una de las principales desventajas con respecto a otras aplicaciones estudiadas en esta comparativa e Destacar que la encriptaci n produce bytecodes de mayor peso que los originales 3 2 12 YGUARD 3 2 12 1 Introducci n yGuard es un ofuscador de bytecode Ofrece una soluci n frente a la ingenier a inversa mediante el renombramiento de identificadores de paquetes clases m todos y campos de tal manera que hace el c digo descompilado resultante completamente ilegible Adem s como efecto a
82. asses that are used by your application but should not be included in the obfuscated jar file The obfuscator also ensures that references to these classes continue to work referencing includes calling subclassing and implementing Note Any part of these libraries that is actually used must be in the classpath either system classpath or classpath line in this file externalClasses com company externallibary org apache AAA AAA AAA AAA AAA LTA TAA TATA TIT AAA AAA AAA AAA AAA AAA AAA AAA AAA Locations of resource files Tf you want resource files images properties files to be included in the jar file specify the resource directories or archives here Do NOT specify individual resources files these will be interpreted as archives Note Directories will be scanned recursively Note class files ar xcluded automatically Note You will usually want to reuse entries from the classpath line classes and resources are often bundled in the same jar files cesources resourcedir resources jar AAA AAA AAA AAA AAA AAA AAA AAA TTT TTT TT TAT TTT TTT TTT TTT TT Advanced obfuscation features encryptStrings true You can try to set this to false for troubleshooting Para su utilizaci n solo es necesario cambiar el path al de nuestro sistema en concreto e indicar la clase principal de nuestra aplicaci n como punto de entrada par
83. ate de nombre getArray y despu s del proceso de ofuscaci n en la salida aparece aun como getArray se le asignar a un O a esa m trica individual En el apartado Borrado de N mero de L neas dentro de ofuscaci n de Datos si encontramos que no hay en el bytecode ofuscado puntuaremos con un 1 En la m trica individual Encriptado de String dentro de ofuscaci n de Datos si el nombre del String ha sido encriptado en el c digo ofuscado se asignar un 1 Para el apartado Desestructuraci n de Datos tendremos en cuenta que si un array de una dimensi n en el c digo ofuscado aparece como un array de dos o m s dimensiones se puntuar con un 1 En lo referente a ofuscaci n de control puntuaremos con un 1 en el caso de que el c digo ofuscado presente modificaciones en las sentencias if else y bucles for y while Para el cuarto apartado Ofuscaci n de Programa si el ofuscador puede oscurecer el c digo del programa aplicaci n gran tama o con xito asignaremos un 1 En caso contrario un 0 En Descompilaci n de C digo Ofuscado para ejemplos de c digo ofuscado si no podemos descompilarlo o no realiza la misma funci n entonces puntuaremos esta m trica individual con un 1 Por ltimo para el apartado Descompilaci n de Programa Ofuscado si no se consigue descompilar el programa ofuscado previamente se asignar un 1 2 6 2 DI
84. ava io ObjectStreamClass initNonProxy Unknown Source at java io ObjectInputStream readNonProxyDesc Unknown Source at jJava io ObjectInputStream readClassDesc Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readArray Unknown Source at java io ObjectInputStream readObject0 Unknown Source at jJava io ObjectInputStream defaultReadFields Unknown Source at jJava io ObjectInputStream readSerialData Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readObject Unknown Source at L lt init gt Unknown Source at L lt init gt Unknown Source L at Q lt init gt Unknown Source at V lt init gt Unknown Source at W A Unknown Source at W lt init gt Unknown Source at JManEx main Unknown Source Unable to load native library jmanexNative Using Java computation instead of native Encontramos que todos los errores son debidos a serializaci n Despu s de realizar varias simulaciones incluyendo comandos en el script para preservar objetos que implementen la interfaz Serializable no conseguimos que la aplicaci n ofuscada funcione correctamente Esto es debido a que no existe ninguna opci n que nos permita preservar cualquier objeto que implemente dicha interfaz siendo imposible determinar
85. blic 1 1 Code 03 aload 0 Hie invokespecial 1 Method java lang Object lt init gt V 4 return public static final synchronized java lang String I int Code 0 iload 0 ds sipush 255 4 iand 53 istore 1 6 getstatic 2 Field intern 1 Oe iload_1 10 iaload 11 iload O 12 if icmpeq 62 15 getstatic 2 Field intern I 18 iload 1 19 iload 0 20 iastore 21 iload 0 22 ifge 30 25 iload 0 26 Il1dc 3 int 65535 28 land 29 istore 0 30 new 4 class String 333 dup 34 getstatic 5 Field getClass B 37 iload 0 38 getstatic 5 Field getClass B 41 iload 0 42 iconst 1 43 sub 44 baload 45 sipush 255 48 iand 49 invokespecial 6 Method java lang String lt init gt BII V 52 invokevirtual 7 Method java lang String intern Ljava lang String 55 astore 2 56 getstatic 8 Field getResourceAsStream Ljava lang String 59 iload 41 60 aload 2 61 aastore 62 getstatic 8 Field getResourceAsStream Ljava lang String 65 iload 1 66 aaload 67 areturn static Code O sipush 256 38 anewarray 4 class String 6 putstatic 8 Field getResourceAsStream Ljava lang String Or sipush 256 12 newarray int 51 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 14 putstatic 2 Field intern I 17 new 9 class I 20 dup 21 invokespecial 10 Method lt init gt V 24 invokevirtual 11 Met
86. btenemos Test class 1 339 bytes y a class 242 bytes Comprobamos que hemos obtenido bytecodes de mayor tamafio que los originales Esto se debe al proceso de encriptado y ofuscaci n de control como hemos explicado anteriormente Comprobamos que siguen realizando la misma funci n para ello D Temp prueba java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 5 A continuaci n comparamos los bytecodes ofuscados obtenidos con los originales para poder as evaluar el proceso de ofuscaci n llevado a cabo por la aplicaci n Zelix KlasMaster Ver programas 3 20 y 3 21 D Temp prueba javap c p l Testl D Temp prueba javap c p l A Programa 3 20 Bytecode Test1 class Compiled from Testl java public class Testl extends java lang Object 62 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java public a a protected java lang String b private int c public static boolean d private static java lang String Z public static void main java lang String Code 0 new 1 class Testl 3 dup 4 invokespecial 2 Method lt init gt V de pop 8 return public Testl Code 0 getstatic 76 Field a a I 3 istore 1 4 aload 0 De invokespecial 3 Method java lang Object lt init gt V 8 aload_0 9 new 4 class a 12 dup 13 invokespecial 5 Method a lt init gt V 16 putfield 6
87. c n de Datos mms S recon acroxnrconrcoonscane DI Tabla 3 18 Evaluaci n de m trica de ofuscaci n mediante Proguard 119 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 2 RETROGUARD F Renombrar Identificadores OFUSCACION DE LAYOUT rien nen o marin o o A ACI E ACT DI A Tabla 3 19 Evaluaci n de m trica de ofuscaci n mediante Retroguard OFUSCACI N DE DATOS 3 5 3 JAVAGUARD OBJETOS CONTENIDO PUNTUACI N N Renombrar Identificadores OFUSCACION DE LAYOUT a A Encriptado de String OFUSCACION DE DATOS Desestructurac n de Datos PRSCAGONDECONTROL ATEN A rc reros a IET AAC DT ACT Tabla 3 20 Evaluaci n de m trica de ofuscaci n mediante Javaguard 120 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 4 JSHRINK OBJETOS CONTENIDO PUNTUACI N OFUSCACION DE LAYOUT Borrado de N mero de L neas 1 Encriptado de String OFUSCACI N DE DATOS e ee ER AN AC AI AC AI o e ANNE Tabla 3 21 Evaluaci n de m trica de ofuscaci n mediante Jshrink 3 5 5 CAFEBABE OBJETOS CONTENIDO PUNTUACI N 1 E Renombrar Identificadores Protected OFUSCACION DE LAYOUT Private 1 Borrado de N mero de L neas i Encriptado de String OFUSCACION DE DATOS ee ACI PROSCAGONDECONTROL ATENEO O eC AUN tron scionrconicoonsewe gt _ DAT o Tabla 3 22 Evaluaci n
88. ca strings de manera que no aparacen en su forma original dentro del bytecode ofuscado e name exclusion directives para especificar clase m todo o campo que quiera excluirse del proceso de ofuscaci n En nuestro caso solamente hemos excluido el m todo main 139 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java JOGA JoGa ofrece una interfaz gr fica muy intuitiva que nos permite llevar a cabo f cilmente la optimizaci n y ofuscaci n de nuestra aplicaci n mediante la navegaci n por sus men s Se ofrecen las siguientes opciones de configuraci n La remove debug infos para borrar informacigon que introduce el debbuger durante la compilaci n compress constant pools merge classes asocia clases inlined methods introduce el cuerpo del m todo directamente en algunas llamadas que se producen a stos Remove partes que se pueden borrar si no son usadas Rename opciones de renombrado byte code optimizations optimizaciones que pueden llevarse a cabo sobre el bytecode como por ejemplo optimizarlo para que ocupe el menor tama o posible 6 optimizaci n comienza por el an lisis de los archivos class JoGa nos pedir que confirmemos alguna informaci n durante este paso del proceso En primer lugar JoGa resolver posibles dependencias con superclases en orden a preservar stas Despu s de esto deberemos identificar el tipo de programa esto qu
89. caci n Destacar que la ofuscaci n de Control y la encriptaci n producen bytecodes de mayor peso que los originales 80 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 8 JOGA 3 2 8 1 Introducci n JoGa principalmente es un optimizador de c digo que permite reducir el tama o de aplicaciones applets y API s Java Analiza el programa completo y determina clases m todos y campos sin uso que pueden ser borrados Adem s proporciona t cnicas de optimizaci n con el objetivo final de reducir el tama o de nuestra aplicaci n consigui ndose reducciones del 80 e Actualmente implementa las siguientes t cnicas de optimizado e Borra clases m todos y campos sin uso e Borra bytecode superfluo de m todos e Asocia clases en una sola e Proporciona inlined para m todos e Ofuscaci n mediante renombramiento de paquetes clases y miembros de clases e Trabaja con archivos jar o zip e Borra informaci n redundante 3 2 8 2 Ofuscaci n de Ejemplo 1 Los pasos que hemos seguido para la ofuscaci n de este ejemplo y la posterior evaluaci n del proceso han sido los siguientes 1 En primer lugar tenemos que especificar la aplicaci n a tratar Para ello en el men de nuestra GUI nos vamos a Project gt add classes y cargamos el archivo en cuesti n en nuestro caso Test jar Debemos destacar que JoGa permite tratar un 39 66 directorio clases
90. car la salida Es conveniente que sea del mismo tipo que la entrada e superclass_path indica el path para resolver posibles dependencias e use_class_loader_for_superclasses si se especifica esta directiva estamos indicando que la localizaci n de las superclases se tomar n del classpath de nuestro sistema Esta directiva anula a la anterior e log changes hace que el proceso de renombrado se especifique en un archivo log de salida e overwrite_classfiles para indicar que los archivos class de salida pueden ser sobreescritos e classes all_classes indica que todas las clases deben ser consideradas en el proceso de ofuscaci n e methods all_methods indica que todos los m todos han de ser incluidos en el proceso de ofuscaci n Debemos tener cuidado porque el m todo main no debe ser modoficado En caso contrario nuestra aplicaci n dejar a de funcionar Existe otra opci n para excluirlo e fields all_fields an logo pero para campos dentro de una clase e bytecode shuffle_stack_operations opci n de ofuscaci n de bytecode que realiza cambios en el orden de ejecuci n de instrucciones para que la decompilaci n sea mucho m s complicada e bytecode add_fake exceptions introduce en el bytecode bloques de excepciones que se superponen a los bloques de control existentes e bytecode change _switch_statements cambia el flujo de control en sentencias de tipo switch e bytecode encrypt_strings modifi
91. class 219 bytes Comprobamos que el tama o de la clase principal se ha incrementado Esto es debido a que MarvinObfuscator ofrece la opci n de encriptado y esto supone una carga de procesado mayor C MarvinObfuscator java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Sigue realizando la misma funci n Por tanto el proceso de ofuscaci n llevado a cabo por MarvinObfuscator ha sido exitoso 6 Por ltimo y con el objetivo de evaluar la m trica dise ada hemos comparado los bytecodes ofuscados con los originales El resultado se muestra en la tabla 3 14 D Temp prueba javap c p l Testl D Temp prueba javap c p l super Programa 3 30 Bytecode Test1 class Compiled from public class Testl extends java lang Object public super Ka protected java lang String La private int Ma private static java lang String Na private static java lang String Oa private static java lang String Pa private static java lang String Qa public static void main java lang String Code 0 new 2 class Test1 33 dup 4 invokespecial 17 Method lt init gt V dey pop 8 return public Testl 94 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Code O aload 0 L invokespecial 4 aload 0 S new 22 8 dup gu invokespecial 12 putfield 15 aload 0 16 getstatic 19 putfield 22 aload_0 23 bipush 10 25 newarray int 27 putfi
92. d a Ljava lang String Ljava lang String 6 putstatic 31 Field Na Ljava lang String O s getstatic 46 Field Oa Ljava lang String 12 invokestatic 105 Method a Ljava lang String Ljava lang String 15 putstatic 46 Field Oa Ljava lang String 18 getstatic 69 Field Pa Ljava lang String 21 invokestatic 105 Method a Ljava lang String Ljava lang String 24 putstatic 69 Field Pa Ljava lang String 27 getstatic 88 Field Qa Ljava lang String 30 invokestatic 105 Method a Ljava lang String Ljava lang String 33 putstatic 88 Field Qa Ljava lang String 36 return Programa 3 31 Bytecode super class Compiled from class super extends java lang Object public super Code O aload 0 Ts invokespecial 9 Method java lang Object lt init gt V 4 iconst_1 Ss istore_1 6 return public java lang String _ java lang String 96 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Code 0 aload_1 13 areturn EJEMPLO 1 sin EJEMPLO 1 ofuscado F METRICA PUNTUACI N Testiclass Hola class Test1 class super class campos ax _ y me E pao SL a Borrado Numero Linea Numero de nea Boras 1 PRUEBA DE d 4 Desestructuracion de Puntuaci n para Ofuscaci n de Layout y Datos Tabla 3 14 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 11 3 Ofuscaci n de Ejemplo 2 M
93. d gradient presets data Exception java lang ClassNotFoundException grad PresetGradientPainter java lang ClassNotFoundException grad PresetGradientPainter at Java net URLClassloader 1 run Unknown Source at Java security AccessController doPrivileged Native Method at java net URLClassLoader findClass Unknown Source at java lang ClassLoader loadClass Unknown Source at sun misc LauncherSAppClassLoader loadClass Unknown Source at java lang ClassLoader loadClass Unknown Source at java lang ClassLoader loadClassInternal Unknown Source at java lang Class forName0 Native Method at java lang Class forName Unknown Source at java io ObjectInputStream resolveClass Unknown Source at java io ObjectInputStream readNonProxyDesc Unknown Source at java io ObjectInputStream readClassDesc Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0O Unknown Source at java io ObjectInputStream readArray Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream defaultReadFields Unknown Source at jJava io ObjectInputStream readSerialData Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readObject Unknown Source at F lt init gt Unknown Source at lt init gt Unknown Source at lt init gt Unknown S
94. de renombramiento de s mbolos as como estad sticas de tama o Puede ser redireccionado hacia un archivo log e o outfile salva la salida en el archivo outfile Este archivo de salida puede tener extensi n jar o zip Si no se especifica archivo de salida la aplicaci n escribir la salida en el directorio actual e keep package classname fuerza la salida de esta clase y a que no sea renombrada El classname tiene que estar referido un archivo class que se haya cargado previamente por tanto la especificaci n del archivo de entrada debe ser anterior Si no hay ninguna especificaci n de reservar ning n m todo y no se encuentra el main no se proceder al renombramiento de ninguna clase Destacar que en el classname no es necesario especificar el class se supone impl cito Si el argumento termina en entonces todas las clases encontradas ser n incluidas para mantener su nombre e keepMember package classname member mediante esta opci n impedimos que un miembro de una determinada clase sea renombrado Cuidado porque no se fuerza a incluir la clase que contiene el miembro Si es un m todo debemos a adir par ntesis e script filename abre el fichero y lee las opciones especificadas como si se leyeran de la l nea de comandos Cada l nea del script debe contener una sola orden u opci n y sus atributos si fueran necesarios Estos scripts pueden generarse mediante la inter
95. der to find super classes Changes and removals will be recorded Destination Class Jar or Zip files may be overwritten Unused methods will not be removed 77 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Unused fields will not be removed All class names will be changed A11 method names will be changed All field names will be changed Stack operations will be shuffled Fake exceptions will be added Switch statements will be obfuscated Strings will be encrypted Number of selected classes is 1 Total number of classes scanned is 2 Class Test2 changed to A Method Test2 lt init gt V not changed Method UE lest2 main Ljava lang String V aaa sia Ending Obfuscation not changed Para este segundo ejemplo al tener solamente una clase de entrada obtuvimos el bytecode de salida directamente A class 1 124 bytes Comprobamos que sigue realizando la misma funci n D Temp res java A Numero de bucle gt 1 Numero de bucle 1 4 Por ltimo compramos el bytecode ofuscado mediante Smokescreen con el c digo original para ello tecleamos en consola D Temp res javap c p l A Programa 3 30 Bytecode A class public class A extends java lang Object static java lang String 0 public static void main java lang String Code O iconst_0 13 iconst_0 2 istore 1 3 3 istore 2 4 iload 2 5 iconst_2 6
96. e ataques de ingenier a inversa ser a recomendable la adquisici n de esta herramienta Frente a Zelix KlassMaster encontramos aplicaciones de ofuscaci n muy similares unas ofrecen encriptado MarvinObfuscator Jshrink otras Proguard Retroguard son mas completas a la hora de ofuscar programas de cierto peso pero sus caracter sticas son muy similares y no proporcionan ventajas sustanciales unas respecto a otras En cualquier caso si queremos ofuscar nuestras aplicaciones para evitar ataques de ingenier a inversa tenemos dos opciones una es adquirir Zelix KlassMaster asegur ndonos la mejor protecci n y otra si no deseamos gastar dinero acudir a herramientas freeware disminuyendo sustancialmente la protecci n que conseguimos 125 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 4 TEMPORIZACI N El proyecto se ha dividido en las siguientes tareas 1 Documentaci n En esta primera etapa se han adquirido los conocimientos necesarios para el posterior desarrollo del proyecto Extra da en su totalidad de Internet formato digital al no estar documentado el estudio de la ofuscaci n hasta el momento Esta tarea ha constado de e Documentaci n del proceso de ofuscaci n e Documentaci n de utilizaci n de las aplicaciones manuales de usuario 2 Recopilaci n y testeo de herramientas bajo estudio Se han recopilado todas las soluciones disponibles y accesibles freeware y ver
97. e contiene el bytecode del ejemplo 2 Test2 class Por lo dem s el archivo de opciones es an logo al empleado para la ofuscaci n del ejemplo 1 Ver programa 3 28 Programa 3 28 Directivas de control para Smokescreen myDirectivas txt source directory D Temp prueba destination directory D Temp res superclass path C Archivos de programa j2sdk1 4 2 07 jre lib rt jar use class loader for superclasses log changes overwrite classfiles classes all classes methods all methods fields all fields bytecode add fake exceptions bytecode shuffle stack operations bytecode change switch statements bytecode encrypt strings OR OF method Test2 main Notar que hemos preservado el m todo main del proceso de ofuscaci n 2 Ejecutamos la aplicaci n desde l nea de comandos D Temp SmokescreenSetup341_Eval java jar Smokescreen30_Eval jar nogui directives myDirectives txt 3 Comprobamos que no han ocurrido errores examinando el archivo ChangeLog txt Ver programa 3 29 Programa 3 29 Archivo ChangeLog txt Smokescreen 3 41 Evaluation edition Using command line JVM info Sun Microsystems Inc 1 4 2 07 OS info Windows XP x86 5 1 o Beginning Obfuscation Wednesday March 30 2005 12 15 47 PM CEST Using Directives file D Temp SmokescreenSetup341 Eval mydirectives txt Source is D Temp prueba Destination is D Temp res Will use class loa
98. e n mero de l nea en el archivo log esto es til si posteriormente queremos emplear la herramienta Stack Trace Translate y keep que dejar los n meros de l nea existentes SMOKESCREEN Smokescreen puede ser utilizado con o sin interfaz gr fica La GUI proporciona una interfaz de f cil manejo que nos permite la selecci n de las diferentes opciones de ofuscaci n Cuando la aplicaci n es abierta con GUI se presenta al usuario una ventana que tiene una serie de men s botones y campos El usuario puede seleccionar los par metros de ofuscaci n el directorio fuente y el destino Cuando la aplicaci n se ejecuta desde l nea de comandos los par metros de ofuscaci n se especifican en un archivo de directivas En nuestro caso hemos optado por ejecutar desde l nea de comandos Para ello es necesario especificar un archivo de directivas que contendr las opciones para el proceso de ofuscaci n Cada l nea de este archivo debe contener una directiva Estas directivas comienzan con un asterisco lt 138 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Todas las posibles directivas a aplicar vienen especificadas en el completo manual de usuario de la aplicaci n Las m s destacadas y las que hemos utilizado en nuestros ejemplos son e source_directory para especificar la fuente Puede ser un directorio un archivo zip o uno jar e destination directory para especifi
99. ecode generalmente reducciones del 20 30 e Dise ado para ajustarse sin problemas a la construcci n de aplicaciones Java e Permite una configuraci n completa del proceso de ofuscaci n e Soporta m ltiples puntos de entrada en el c digo Java permite el acceso a tantas aplicaciones applets javabeans y librer as como sean requeridas e Trabaja sobre archivos jar el est ndar de Java para el empaquetado de clases e El proceso de ofuscaci n es controlado por un lenguaje script flexible Se proporciona una interfaz sencilla para la creaci n de scrpits Wizard 37 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Emplea overloading para nombres de m todos y miembros para conseguir una mayor seguridad 3 2 2 2 Ofuscaci n de Ejemplo 1 Los pasos que hemos seguido para comprobar la efectividad de la aplicaci n Retroguard han sido los siguientes 1 Generar el script de configuraci n mediante Wizard D Temp retroguard v2 0 INsrc distjavac RGgui java D Temp retroguard v2 0 I src dist java Rggui Al ejecutar el Wizard buscando siempre una configuraci n para realizar la ofuscaci n m s agresiva posible obtenemos el siguiente script Ver programa 3 5 Programa 3 5 Script de configuraci n para Retroguard Automatically generated script for RetroGuard bytecode obfuscator To be used with Java JAR file D Temp prueba Testl jar 18 mar 2005 9 41 45
100. ecopilaci n de ofuscadores disponibles en internet Comprobamos la gran variedad de aplicaciones que permiten optimizar y ofuscar el c digo Java disponibles en internet La mayor a aplicaciones comerciales de las que s lamente hemos podido conseguir una versi n de evaluaci n pero tambi n muchas otras open source De las principales ventajas de cada aplicaci n cabe destacar que la mayor a de los ofuscadores realizan ofuscaci n de datos tal como renombrado de identificadores borrado de informaci n redundante etc Algunos ofrecen la posibilidad de ofuscaci n de flujo de control as como encriptado Pero todo esto lo veremos con m s detalle cuando evaluemos cada aplicaci n por separado 29 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 1 2 DESCARGA En la siguiente tabla se pone de manifiesto los aspectos m s relevantes de la descarga de las aplicaciones detalladas con anterioridad Formato de descarga tipo archivo Tama o de aplicaci n y Direcci n de bajada URL Proguard http proguard sourceforge net Javaguard http sourceforge net projects javaguard Retroguard http www retrologic com retroguard main html Jobfuscate http www duckware com jobfuscate index html Jshrink http www e t com jshrink html Jzipper http www vegatech net zipper Marvin marvinobfuscator1_2b zip 125 bytes http www drjava de obfuscator Smokescreen SmokescreenSetup341_Eval
101. ect0 Unknown Source ava io ObjectInputStream readObject Unknown Source L lt init gt Unknown Source L lt init gt Unknown Source Q lt init gt Unknown Source V lt init gt Unknown Source W W DOY p op p p p oo oo oa w w ce chet et ck S T E LN el T e aa O TE ch TOE S E te Gls ie t a E Ca Cae E e E ER A A Unknown Source lt init gt Unknown Source at JManEx main Unknown Source Unable to load native library jmanexNative Using Java computation instead of native Comprobamos que los errores son debidos por un lado a la no presencia de una clase denominada grad PresetGradientPainter y por otro a objetos que implementan la interfaz Serializable A continuaci n hemos procedido a preservar la clase que falta encontr ndonos con que segu an produci ndose los siguientes errores 114 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Programa 3 67 Resultado ejecuci n aplicaci n ofuscada Exception java io InvalidClassException grad PresetGradientPainter local class incompatible stream classdesc serialVersionUID 5786935299744842060 local class serialVersionUID 7715789927339721043 java io InvalidClassException grad PresetGradientPainter local class incompatible stream classdesc serialVersionUID 5786935299744842060 local class serialVersionUID 7715789927339721043 at j
102. egu an funcionando e Proporciona mecanismos para ofuscaci n de Control de Flujo Es la principal ventaja con respecto a otras aplicaciones e Se proporciona un manual de usuario muy detallado en la p gina web asociada a la aplicaci n e Se ejecuta mediante una interfaz gr fica e Proporciona una herramienta llamada Stack Trace Translate que nos permite traducir el c digo ofuscado Util para el caso de trabajar con RMI o serializaci n 3 2 7 SMOKESCREEN 3 2 7 1 Introducci n Smokescreen es un ofuscador Java M s all de ser capaz de modificar nombres simb licos tambi n puede modificar instrucciones de m todos en el bytecode proporciona por tanto ofuscaci n de Control Esto hace que las clases ofuscadas resultantes sean mucho m s dif ciles de descompilar Smokescreen trabaja con archivos class en directorios pero tambi n con archivos zip o j ar Permite una ofuscaci n selectiva de los nombres simb licos dependiendo del nivel de acceso de la clase m todo o campo La eliminaci n de m todos y campos sin uso tambi n puede realizarse Tambi n proporciona como antes se ha mencionado ofuscaci n de Control mediante la modificaci n de instrucciones del bytecode en los m todos de las clases 70 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Las principales caracter sticas que presenta la aplicaci n son e El programa proporciona una f c
103. el proceso llevado a cabo es tan potente que no permite ni la visualizaci n del c digo ofuscado En la siguiente tabla se resumen los resultados RESULTADO DE DESCOMPILACI N DE DESCOMPILACI N HERRAMIENTA AAA Tabla 3 16 Resultados del proceso de descompilaci n mediante JODE 116 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Destacar que para cada ejemplo hemos especificado el nombre las clases originales para poder clasificar si la descompilaci n era posible En realidad como consecuencia del proceso de ofuscaci n llevado a cabo por cada herramienta los nombres de las clases se han modificado en cada caso Aparecen huecos en blanco debido a que el ejemplo 2 no ha sido evaluado para la mayor a de las aplicaciones ya que no ofrec an ofuscaci n de Control Del an lisis realizado se desprende que la nica aplicaci n para la cual se consigue que la descompilaci n del c digo ofuscado no sea posible es Zelix KlassMaster Por tanto asignaremos un 1 para la m trica correspondiente 3 4 2 DESCOMPILACI N DE PROGRAMA L GICO Procedemos de forma an loga pero en este caso para el programa l gico en aquellos casos en los que se haya conseguido ofuscar con xito Ver tabla 3 17 RESULTADO DESCOMPILACI N HERRAMIENTA PROGRAMA LOGICO agan O ew O C smse IN E rain oras soma IO Tabla 3 17 Resultados del proceso de descompilaci n mediante JODE En el a
104. eld 30 getstatic 33 aload_0 34 getfield 37 getstatic 40 invokevirtual ing 43 invokevirtual ring V 46 getstatic 49 aload_0 50 invokevirtual 53 invokevirtual ring V 56 getstatic 59 new 62 62 dup 63 invokespecial 66 getstatic 69 invokevirtual String Ljava lang StringBuffer 72 aload_0 73 invokespecial 76 invokevirtual g StringBuffer 79 invokevirtual ng String 82 invokevirtual ring V 85 return 20 class 24 26 31 337 35 41 26 46 Method java lang Object lt init gt V super Method super lt init gt V Field Ka Field Na Field La Field Ma Field Ka Field Oa Lsuper Ljava lang String Ljava lang String I Field java lang System out Ljava io PrintStream Lsuper Ljava lang String 50 Method super Ljava lang String Ljava lang Str 56 41 60 56 41 Method java io PrintStream println Ljava lang St Field java lang System out Ljava io PrintStream Method a Method java io PrintStream println Ljava lang St Ljava lang String Field java lang System out Ljava io PrintStream class StringBuffer 64 69 73 77 80 83 56 ethod java lang StringBuffer lt init gt V Field Pa Ljava lang String Me Me protected java lang String a Code O RO J4asE4 private Code
105. enier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 4 3 2 Agregado y Reordenaci n e Redimensionar arrays Por ejemplo incrementando folding o reduciendo flattening las dimensiones del array Aumenta o disminuye la carga de procesamiento respectivamente Ver tabla 2 3 Tabla 2 3 Redimensionado de arrays e Clonar m todos Por ejemplo crear diferentes versiones de un m todo aplicando distintos tipos de ofuscaciones al c digo original e Modificar relaciones de herencia Por ejemplo dividir una clase figura 2 7 o generar m s clases extendiendo el rbol jer rquico de herencia figura 2 8 Raiz C V2 Mb C V M V2 M2 v M gt C C 0 Vi Mi v Mi vv av AAA M M Ms AAA Figura 2 7 Divisi n de una clase C V M E C V1 M C C1 V3 Ms C C3 V2 Mp C C V2 M ViA V5 0 M MN M3 0 Figura 2 8 Generaci n de clase 13 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 4 4 CONCLUSIONES Todo esto hace que los c digos ofuscados sean pr cticamente imposibles de descompilar Tras el tratamiento llevado a cabo por un ofuscador los descompiladores siguen generando c digo fuente a partir del Java bytecode pero este c digo no es como el c digo fuente original siendo totalmente incomprensible y haciendo la labor de la ingenier a inversa muy dif cil Adem s no existe ning
106. entradas como pueden ser aplicaciones un tanto complejas o Applets o JavaBeans o si el c digo es estructurado para trabajar como librer a Java la ofuscaci n no se realiza en todo el c digo 2 Otro m todo es aplicar la ofuscaci n sobre todo el c digo java permitiendo la selecci n de las clases sobre las que se aplicara ofuscaci n y en que grado se va a llevar a cabo Es lo que se conoce como ofuscaci n con m ltiples puntos de entrada 15 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 6 M TODO DE ANALISIS PARA OFUSCACI N 2 6 1 DISE O DE M TRICA DE OFUSCACI N Como hemos estudiado en anteriores apartados tenemos tres t cnicas de ofuscaci n ofuscaci n de Estructura ofuscaci n de Control y ofuscaci n de Datos Con objeto de comparar la efectividad de los ofuscadores encontrados en la red vamos a dise ar una m trica que nos permita comprobar dicha efectividad desde el punto de vista de las t cnicas mencionadas Relacionamos as teor a con el trabajo de medida de ofuscaci n llevada a cabo por cada ofuscador Nuestra m trica de ofuscaci n ser de la forma OBJETOS CONTENIDO PUNTUACI N i Renombrar Identificadores Protected OFUSCACION DE LAYOUT Borrado de N mero de L neas Encriptado de String 1 OFUSCACI N DE DATOS Tabla 2 4 M trica para evaluaci n de ofuscadores La primera parte ofuscaci n de Layout incluye Renombrar Identificadore
107. erentes mecanismos de renombrado durante la ofuscaci n este atributo puede fijarse con los siguientes valores small producir nombres cortos best nombres que complican la descompilaci n mix una mezcla de los dos anteriores e Elemento expose para especificar clases m todos o campos En este elemento puede especificarse la eleminaci n de mucha informaci n innecesaria que no deber a descompilarse Para controlar esta informaci n tenemos varios atributos boleanos linenumbertable determina si la tabla de n mero de l nea debe ser borrada Por defecto se borra localvariabletable an logo para la tabla de variables local Por defecto se borra sourcefile determina si el nombre del archivo de c digo fuente original debe mantenerse en el bytecode ofuscado Por defecto se borra e Elemento method mediante este elemento especificamos m todos que deben preservarse del proceso de ofuscado En nuestro caso lo utilizaremos para excluir el m todo main Teniendo en cuenta todas estas opciones y siguiendo las indicaciones descritas en el manual de usuario hemos generado el siguiente script ver programa 4 Programa 4 Script de configuraci n para yGuard build xml lt xml version 1 0 encoding UTF 8 gt lt file build xml in your project root directory gt lt ANT build script for yfiles gt lt project name proyecto default obfuscate basedir gt lt obfuscate
108. es decir el renombrado que lleva a cabo no es tal se renombran todas las clases y miembros de clases pero sus nombres originales siguen apareciendo como ap ndice Lo veremos m s adelante al ofuscar el ejemplo 1 Desde la p gina web asociada se advierte que de esta manera el usuario que adquiera la versi n de prueba puede comprobar como trabaja la aplicaci n y que las clases ofuscadas aunque no realmente siguen realizando la misma funci n 3 2 10 2 Ofuscaci n de Ejemplo 1 Hemos realizado los siguientes pasos para la ofuscaci n de nuestro ejemplo no debemos olvidar que sta es una versi n de prueba 1 En primer lugar hemos generado el scriptfile que contendr las opciones de configuraci n para el proceso de ofuscaci n llevado a cabo por Jobfuscate Ver programa 3 25 Programa 3 44 Script de configuraci n Config txt log D Temp prueba Jobfus log out D Temp prueba Testresl jar xm D Temp prueba Test1l main sys C Archivos de programa j2sdk1 4 2 07 jre lib rt jar 87 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Destacar que hemos redireccionado la salida por defecto a un archivo que reflejar posibles incidencias en el proceso de ofuscaci n llevado a cabo Adem s en este archivo se especifica el proceso de renombrado que se ha seguido Esto nos puede interesar para comprobar que la versi n de prueba realmente no realiza ofuscaci n de Estructura
109. espondiente 3 2 5 4 Conclusi n e CafeBabe puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 9 es decir no proporciona opciones de encriptado o desestructuraci n de datos e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo 59 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Aunque obtiene una puntuaci n igual a la de otras aplicaciones analizadas con anterioridad podemos destacar que CafeBabe proporciona un n mero mucho menor de opciones Esto puede ser debido a que es un proyecto abandonado pues desde 1999 no se han realizado actualizaciones de la aplicaci n e No podemos trabajar desde l nea de comandos e No se proporciona un manual de usuario que explique en detalle como trabajar con la aplicaci n Sin embargo es f cil de manejar y muy intuitivo si se ha trabajado con herramientas de este tipo con anterioridad 3 2 6 ZELIX KLASSMASTER 3 2 6 1 Introducci n Zelix KlassMaster puede ofuscar el bytecode de manera que c digo obtenido mediante un descompilador sea ininteligible Como ventaja adicional
110. estro programa As preservando estos paquetes en su totalidad hemos sido capaces de ofuscar la aplicaci n consiguiendo que el contenedor resultante al ser ejecutado siga realizando la misma funci n Hemos perdido efectividad a la hora oscurecer el c digo porque hemos dejado parte sin ofuscar pero hemos conseguido que la aplicaci n siga funcionando El proceso llevado a cabo es an logo al seguido para la ofuscaci n de ejemplos estudiados en el apartado anterior 3 2 8 Hemos cargado la aplicaci n indicando a JoGa que se trataba de una Application Por su parte JoGa detecta de forma autom tica clases que contienen m todos main y las preserva de la ofuscaci n Especificando las opciones deseadas para el proceso de optimizaci n y ofuscaci n obtenemos un contenedor de salida manex_JOGA jar 102 KB Observamos que se ha reducido su tama o compar ndolo con el archivo original Destacar que hemos especificado como opci n la generaci n de dos archivos uno en el que se indican los resultados del proceso de ofuscaci n y otro en el que se puede observar el proceso de renombrado llevado a cabo 3 3 9 JOBFUSCATE Jobfuscate es un ofuscador de archivos class como estudiamos en el apartado 3 2 10 Desde el manual de usuario proporcionado en la p gina web asociada se asegura 112 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java que es capaz de manejar de forma autom tica serializ
111. esultado del proceso llevado a cabo ya que Proguard no incorpora opci n de generar un logfile Ver programa 3 56 Programa 3 56 Resultado del proceso de ofuscaci n ProGuard version 3 2 Reading jars Reading program jar jmanex jar Reading library jar C Archivos de programa Java j2re1 4 2 07 lib rt jar Removing unused library classes Original number of library classes 5672 Final number of library classes 150 Shrinking Removing unused program classes and class elements Original number of program classes 54 Final number of program classes 47 Optimizing 104 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Shrinking Removing unused program classes and class elements Original number of program classes 47 Final number of program classes 47 Obfuscating Renaming program classes and class elements Printing mapping to program map Writing jars Preparing output jar jmanexRes jar Copying resources from program jar jmanex jar Una vez comprobado que no ha ocurrido error alguno ejecutamos la aplicaci n ofuscada El resultado es satisfactorio Proguard consigue ofuscar nuestro programa l gico sin problema puntuaremos en consecuencia la m trica correspondiente 3 3 2 RETROGUARD En este caso mediante el Wizard hemos generado un script de configuraci n para la ofuscaci n en el que se han preservado todos los m todos main presentes en
112. faz gr fica que proporciona la aplicaci n 135 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e stringEncrypt sustituye strings por llamadas a m todos static de clases que devuelven strings internos extra dos de un c digo encriptado Este m todo supone una cierta sobrecarga Estas son las opciones m s destacadas Mediante ellas conseguimos nuestro objetivo de ofuscar el c digo de los ejemplos de la forma m s agresiva posible Existen m s opciones disponibles que pueden consultarse en el manual de usuario proporcionado en la p gina web de la aplicaci n ver tabla 3 2 CAFEBABE CafeBabe es una herramienta que proporciona una interfaz gr fica para su utilizaci n No es posible ejecutarlo desde la l nea de comandos Al cargar un archivo class en la ventana principal aparece directamente la estructura del bytecode siguiendo el formato del archivo especificado Mediante la opci n Class Hound Service se nos presenta por pantalla una ventana que contiene toda la informaci n de las clases cargadas es decir clases miembros de clases campos y m todos as como el rbol de herencia para la clase seleccionada en cada caso Esta herramienta nos permite optimizar el c digo como paso previo a la ofuscaci n con el objetivo de borrar informaci n inservible atributos del c digo fuente atributos desconocidos o informaci n redundante en el cuerpo de los m todos Adem
113. gico ofuscado Programa 3 61 Resultado de ejecuci n programa l gico ofuscado Unable to load gradient presets data Exception java io InvalidClassException grad PresetGradientPainter local class incompatible stream classdesc serialVersionUID 5786935299744842060 local class serialVersionUID 9117130052050238138 java io InvalidClassException grad PresetGradientPainter local class incompatible stream classdesc serialVersionUID 5786935299744842060 local C lt init gt Unknown Source Ab lt init gt Unknown Source Z init Unknown Source Z lt init gt Unknown Source at JManEx main Unknown Source Exception in thread main java lang NoSuchMethodError util Av apk Ljava util O bserver V at util An apk Unknown Source at C lt init gt Unknown Source at Ab lt init gt Unknown Source at Z init Unknown Source at Z lt init gt Unknown Source at JManEx main Unknown Source class serialVersionUID 9117130052050238138 at java io ObjectStreamClass initNonProxy Unknown Source at java io ObjectInputStream readNonProxyDesc Unknown Source at java io ObjectInputStream readClassDesc Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readArray Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream defaultReadFields Unknown S
114. hod java lang Object getClass Ljava lang Cla SS 27 new 12 class StringBuffer 30 dup 31 invokespecial 13 Method java lang StringBuffer lt init gt V 34 bipush 73 36 invokevirtual 14 Method java lang StringBuffer append C Ljava lan g StringBuffer 39 bipush 46 41 lt invokevirtual 14 Method java lang StringBuffer append C Ljava lan g StringBuffer 44 bipush 103 46 invokevirtual 14 Method java lang StringBuffer append C Ljava lan g StringBuffer 49 bipush 105 51 invokevirtual 14 Method java lang StringBuffer append C Ljava lan g StringBuffer 54 bipush 102 56 invokevirtual 14 Method java lang StringBuffer append C Ljava lan g StringBuffer 59 invokevirtual 15 Method java lang StringBuffer toString Ljava la ng String 62 invokevirtual 16 Method java lang Class getResourceAsStream Ljava lang String Ljava io InputStream 65 astore 0 66 aload_0 67 ifnull 169 70 aload 0 71 invokevirtual 17 Method java io InputStream read 1 74 bipush 16 76 ishl 77 aload 0 78 invokevirtual 17 Method java io InputStream read 1 81 bipush 8 83 ishl 84 ior 85 aload_0 86 invokevirtual 17 Method java io InputStream read I 89 ior 90 store 1 91 iroad 1 92 newarray byte 94 putstatic 5 Field getClass B 97 iconst_0 98 store 2 99 iload 1 100
115. i2b 101 istore 3 102 getstatic 5 Field getClass B 105 astore 4 107 goto 161 110 aload 0 111 aload 4 113 iload 2 114 iload 1 115 invokevirtual 18 Method java io InputStream read BII I 118 istore 5 120 iload 5 122 iconst ml 123 if icmpne 129 126 goto 165 129 iload 1 130 iload 5 T320 Sub 52 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 133 Ustore il 134 iload 5 136 iload 2 137 iadd 138 istore 5 140 goto 155 143 aload 4 145 iload 2 146 dup2 147 baload 148 iload 3 149 ixor 150 i2b 151 bastore 152 iinc 2y L 155 iload 2 156 iload 5 158 if icmplt 143 161 iload 1 162 ifne 110 165 aload 0 166 invokevirtual 19 Method java io InputStream close V 169 goto 173 172 astore 0 173 return Exception table from to target type 17 169 172 Class java lang Exception Comprando los bytecodes ofuscados con los originales podemos evaluar la m trica dise ada Ver la tabla 3 8 3 2 4 3 Ofuscaci n de Ejemplo 2 Jshrink no realiza ofuscaci n de Control de Flujo no est especificado ni como opci n en l nea de comandos ni tampoco mediante el uso de la interfaz gr fica que proporciona Por tanto puntuamos con un O la m trica individual correspondiente 53 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java EJEMPLO 1 sin EJEM
116. iante la instrucci n D Temp prueba gt java jar D Temp jshrink jshrink exe script Jshrink o Test12res jar No se producen incidencias a destacar ni errores ni warnings Hemos especificado la opci n mediante la cual obtenemos por salida est ndar una tabla donde se muestra el renombramiento de clases y miembros de clases llevado a cabo as como una estad stica de la reducci n en el tama o de los archivos class Ver programa 3 13 Programa 3 13 Incidencias del proceso de ofuscaci n Jshrink 2 33 Copyright 1997 2004 Eastridge Technology www e t com Rename I lt Hola Rename I I String lt Hola getHola Rename I I getClass lt T I NGAJ Rename I I getResourceAsStream lt I I append Rename I I intern lt T I close Rename Testl append lt Testl hello Rename Testl append lt Testl pruebaOfus Rename Testl out lt Testl aux Rename Testl out lt Testl getVector Rename Testl printin lt Testl vector Class Hola 208 284 bytes 26 8 reduction Class 1 1 1 014 1 021 bytes 0 7 reduction Class Testl 914 1 102 bytes 17 1 reduction Output 3 out of 3 class files in 0 08 seconds Output class file size reduction 2 136 2 407 bytes 11 3 Obtenemos como salida un archivo jar aunque pod amos haber elegido otro formato de salida Test 2res jar 2 018 bytes 3 Comprobamos que el c digo ofuscado sigue realizando la misma funci n Para ello
117. ido que la aplicaci n ofuscada funcionara El proceso de ofuscaci n se llevaba a cabo sin errores pero al intentar ejecutar el resultado obten amos una y otra vez la siguiente salida por pantalla Ver programas 3 63 y 3 64 Programa 3 64 Resultado del proceso de ofuscaci n The Marvin Obfuscator 1 2b c 2000 2001 by Dr Java www drjava de Pass 1 Pass 2 56 entries written to jar file total size 128187 processing time 1182 ms Saved jmanexRes jar 128187 bytes Programa 3 65 Resultado ejecuci n aplicaci n ofuscada Exception in thread main java lang IncompatibleClassChangeError at volatile lt clinit gt at transient lt init gt at throw b at throw lt init gt at JManEx main Por tanto MarvinObfuscator no es capaz de ofuscar con xito el programa l gico Puntuamos con un 0 la m trica correspondiente 113 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 3 11 YGUARD Como estudiamos en el apartado 3 2 12 yGuard es un ofuscador integrado para su utilizaci n con Ant Analizando el manual de usuario comprobamos que no se proporcionan opciones explicitas para el manejo de serializaci n y Reflection API calls que es lo que nos interesa resolver a nosotros Todas las opciones van destinadas a preservar los identificadores de clases m todos y campos Para el an lisis de la aplicaci n hemos comenzado por preservar solamente los
118. ie r a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 21 aloa 22 bipu 24 newa 26 putf 29 gets 32 alpa 33 getf 36 Ide 38 invo 41 invo ring V 44 gets 47 aloa 48 invo 51 invo ring V 54 gets java lang Sy 57 new 60 dup 61 invo 64 lde 66 invo String Ljav 69 aloa 70 inyo 73 invo g StringBuff 76 inyo ng String 79 invo ring V 82 retu protected fi Code d_0 sh 10 rray int ield 9 Field a I tatic 10 Field java lang System out Ljava io PrintStream d 0 ield 7 Field a La 24 String HOLA MUNDO kevirtual 15 Method a a Ljava lang String Ljava lang String kevirtual 20 Method java io PrintStream printlin Ljava lang St tatic 10 Field java lang System out Ljava io PrintStream d 0 kevirtual 16 Method a Ljava lang String kevirtual 20 Method java io PrintStream println Ljava lang St tatic 10 Field stem out Ljava io PrintStream 5 class StringBuffer kespecial 14 Method java lang StringBuffer lt init gt V 23 String Ejemplo kevirtual 18 Method java lang StringBuffer append Ljava lang a lang StringBuffer d_0 kespecial 17 Method a I kevirtual 19 Method java lang StringBuffer append I Ljava lan er kevirtual 21 Method java lang StringBuffer toString Ljava la kevirtual 20 Method java io PrintStream println Ljava lang St rn nal java lang String a
119. ield do La 12 Method a a Ljava lang String Ljava lang String 13 Method java io PrintStream println Ljava lang St 0 Field java lang System out Ljava io PrintStream 14 Method a Ljava lang String 13 Method java io PrintStream println Ljava lang St 10 Field java lang System out Ljava io PrintStream class StringBuffer 16 Method java lang StringBuffer lt init gt V String Ejemplo 18 Method java lang StringBuffer append Ljava lang 19 20 Me ethod if I thod java lang StringBuffer append I Ljava lan 21 Method java lang StringBuffer toString Ljava la 13 Method java io PrintStream println Ljava lang St protected java lang String a Code O T 33 6 7 1 private Code O de 4 aload 0 ldc putfield aload_0 getfield areturn 22 int if aload_0 getfield iconst_0 String PRU 8 EBA DE OFUSCACION Field a Ljava lang String 8 Field a Ljava lang String 9 Field if I 40 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 5s iconst_1 6 lastore 7 aload 0 8 getfield 9 Field if 1 11 iconst_0 12 iaload 13 return Programa 3 8 Bytecode a class Compiled from null class a extends java lang Object public a Code O aload 0 Ble invokespecial 1 Method java lang Object lt init gt V 4 ic
120. iente 3 2 3 4 Conclusiones e Javaguard puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 7 es decir no proporciona opciones de encriptado o desestructuraci n de datos e Despu s de ser ofuscado con las opciones mas severas que permite nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo e Como punto negativo de la aplicaci n podr amos destacar que no se proporciona manual de usuario Aunque su utilizaci n es similar al de otras aplicaciones como por ejemplo Retroguard e Es una herramienta sin interfaz gr fica 46 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 4 JSHRINK 3 2 4 1 Introducci n Jshrink extrae el m nimo conjunto de clases necesarias para una aplicaci n borra datos y c digo que no se usa ofusca nombre simb licos finaliza el c digo para una ejecuci n ptima y almacena el resultado en un archivo jar Jshrink reduce el tama o de la aplicaci n entorno al 30 40 El c digo ofuscado es mucho m s dif cil de comprender al descompilar Lo que a primera vista parecen nombres sin sentido en el c digo ofuscado son a menudo nombres reutiliz
121. iere decir si hemos construido una applet una aplicaci n o una API Dependiendo de la opci n seleccionada tendremos que especificar el punto de entrada para el proceso de optimizaci n El resto del proceso correr de forma autom tica Debemos destacar que JoGa proporciona informaci n muy detallada del proceso llevado a cabo mediante la selecci n de un archivo de salida logfile txt y uno de resultados results txt JOBFUSCATE Jobfuscate es una herramienta ejecutada desde l nea de comandos que permite ser f cilmente integrada entornos de desarrollo Java Para ejecutar s lo tenemos que teclear jobfuscate options class 140 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Mediante class especificamos las clases que queremos ofuscar Generalmente solo necesitamos hacer referencia a la clase que contiene en m todo principal y Jobfuscate busca las posibles dependencias Las opciones pueden especificarse en linea de comandos o generar un scriptfile que las contenga todas Nosotros hemos optado por lo segundo Las opciones de las que disponemos en esta versi n de prueba se detallan a continuaci n e log lt file gt redirecciona stderr stdout del programa al archivo especificado e out lt file gt especifica el archivo jar de salida Todos los archivos ofuscados se introducen por defecto en un contenedor de este tipo e xm lt class method gt excl
122. il interfaz gr fica GUD as como la opci n de ejecutar desde l nea de comandos e Permite ofuscaci n de Layout renombrando clases m todos y campos e Da opciones de exclusi n para el anterior proceso e Borra m todos campos y constantes si uso e Proporciona ofuscaci n de Control e Encriptaci n de Strings e Permite distintos niveles de ofuscaci n 3 2 7 2 Ofuscaci n de Ejemplo 1 Con objeto de evaluar el proceso de ofuscaci n sobre el ejemplo 1 hemos realizado los siguientes pasos 1 En primer lugar como hemos optado por ejecutar la aplicaci n desde l nea de comandos es necesario crear un archivo con las directivas oportunas para indicar a la aplicaci n las opciones deseadas en el proceso de ofuscaci n De acuerdo al manual de usuario y buscando una ofuscaci n lo m s agresiva posible generamos un script de configuraci n Ver programa 3 24 Programa 3 33 Directivas de configuraci n de Smokescreen myDirectives txt source directory D Temp prueba Testl jar destination directory D Temp prueba Testlres jar superclass path C lArchivos de programa j2sdk1 4 2 07 jre lib rt jar use class loader for superclasses log changes overwrite classfiles t classes all classes methods all methods fields all fields bytecode add _ fake exceptions bytecode shuffle stack operations bytecode change switch statements bytecode encrypt strings method Testl main
123. inales podemos evaluar la m trica Ver tabla 3 12 3 2 8 3 Ofuscaci n de Ejemplo 2 JoGa no proporciona como opci n ofuscaci n de Control de Flujo Por tanto puntuamos con un O la m trica individual correspondiente No debemos olvidar que JoGa no es un ofuscador propiamente dicho es un optimizador de c digo que incluye opciones b sicas de ofuscaci n 85 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java EJEMPLO 1 sin EJEMPLO 1 ofuscado M TRICA PUNTUACI N Testiclass Test1 class a class 1 aaa N pea a a a Fa a A E Borrado Numero Lincs Numero de Lea forego 1 Encriptado de Strin FRUEBA DE ERUERA DE P 8 OFUSCACION OFUSCACION Desestructuracion de vectori E Datos Puntuaci n para Ofuscaci n de Layout y Datos Tabla 3 12 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 8 4 Conclusiones JoGa puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Se proporcionan mecanismos de renombrado severo Adem s borra toda informaci n redundante como comentarios miembros si uso etc e No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 12 e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo e A n no siendo una a
124. invokestatic 75 Method java lang System currentTimeMillis J 32 dup2 33 ldc2 w 68 long 11134643087191 36 lcmp 37 dup 38 LEGE 37 41 pop 42 ldc2 w 70 long 11121683087071 45 l1cmp 73 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 46 47 50 51 523 38 dup iflt 46 pop return athrow Exception table from to target type 45 52 any public static void main java lang String Code Ox con Ps WwW new 2 class A dup invokespecial 16 Method lt init gt V pop return public A Code Os 00 014 E 9 12 15 16 19 20 21 String 24 27 28 30 325 30 38 39 42 45 47 49 String D2 55 ring V 58 61 62 65 ring V 68 hake 74 LOS 78 81 82 84 String 87 aload 0 invokespecial 17 Method java lang Object lt init gt V aload 0 new 18 class B dup invokespecial 19 Method B lt init gt V putfield 21 Field A LB aload_0 getstatic 95 Field 0 Ljava lang String iconst_0 iconst_0 invokevirtual 82 Method java lang String substring II Ljava lang putfield 25 Field B Ljava lang String aload 0 bipush 10 newarray int putfield 27 Field C I getstatic 33 Field java lang System out Ljava io PrintStream aload_0 getfield 21 Field A LB getstatic 95 Field O Ljava lang String bipush 8 b
125. ipush 18 invokevirtual 82 Method java lang String substring II Ljava lang invokevirtual 38 Method B A Ljava lang String Ljava lang String invokevirtual 44 Method java io PrintStream printin Ljava lang St getstatic 33 Field java lang System out Ljava io PrintStream aload 0 invokevirtual 47 Method A Ljava lang String invokevirtual 44 Method java io PrintStream printin Ljava lang St getstatic 33 Field java lang System out Ljava io PrintStream new 49 class StringBuffer dup invokespecial 50 Method java lang StringBuffer lt init gt V getstatic 95 Field 0 Ljava lang String iconst_0 bipush 8 invokevirtual 82 Method java lang String substring II Ljava lang invokevirtual 56 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 90 OL aload_0 invokespecial 59 Method B I 74 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 94 invokevirtual g StringBuffer 97 invokevirtual ng String 100 invokevirtual ring V 103 return 62 Method java lang StringBuffer append 1 Ljava lan 65 Method java lang StringBuffer toString Ljava la 44 Method java io PrintStream println Ljava lang St protected java lang String A Code private Code YHOO PER T23 13 aload 0 getstatic bipush 18 bipush 38 invokevirtu
126. ject pushed toString xxx pushed charAt I pushed length x pushed subSequence II push pull push pull Testl lt Testl AO_hello lt hello BO_aux lt aux CO_vector lt vector lt main main EO pruebaOfus lt pruebaOfus FO getVector lt getVector ZO Hola lt Hola 88 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java DO_getHola lt getHola Writing files into D Temp prueba Testresl jar jobfuscate finished in 150ms 2 files 0 errors 0 warnings KKEKKKKKKKKKKKKKK KK KK KK KK KK KK KK KK KKK KKK KK KK KK KKKKKKKKKKKK KKK KKK KKKK di RUNNING IN TRIAL MODE x KKEKKKK KK KK KK KK KK KK KK KKKK KK KK KK KK KK KK KK AAA KA AAA AAA AAA AAA AAA AAA AAA All field method and class names are changed just like they are in the registered version but the names are APPENDED with the original name This intentially provides NO OBFUSCATION x PROTECTION but it allows you to 1 see what names would be obfuscated to and 2 verify that your class files continue to work after being changed by jobfuscate Please purchase K the registered version to obtain full obfuscation protection kkkkkkkxkxkxkxkkkxkkxkxkxkxkxkxkkkxkkxkxkxkxkkxkkkkkxkxkxkxkkxkkkkkxkxkxkxkkxkkkkkxkxkxkxkkkkkkxk kx k E http www duckware com support duckware com iS
127. l no debemos tener problemas con el compilador para Windows e collapse package con esta opci n se intenta reducir el tama o del bytecode Los paquetes que han sido excluidos del proceso de ofuscaci n no son comprimidos e aggressive method renaming el renombrado ser m s agresivo No debemos utilizar esta opci n cuando nuestra clase pertenece a un entramado o a una librer a e keep inner class information a nivel de bytecode el interior de una clase se distingue por una estructura de nombres y una serie de atributos Esta informaci n no es cr tica para la ejecuci n de nuestra aplicaci n Se proporciona para compiladores debuggers y utilidades similares Para nuestro caso no seleccionamos esta opci n e keep generics information a nivel de bytecode J2SDK almacena informacion gen rica en atributos especiales Como en el caso de inner class information esta informaci n no es del todo necesaria para la ejecuci n del bytecode Hemos descartado esta opci n tambi n e line number tables los compiladores Java pueden incluir line number tables en el bytecode que mapean las instrucciones de bytecode en n mero de l neas del c digo fuente Estos n meros de l nea pueden dar pistas a descompiladores Zelix KlassMaster proporciona tres formas de enfrentarnos a estos n meros de l nea delete que borra todo rastro de informaci n referente scramble que mezclar la entrada line number table y escribir el nuevo mapeo d
128. la aplicaci n Adem s ha sido necesaria una opci n para tener en cuenta la serializaci n Por ultimo tambi n se ha tenido en cuenta la presencia de Reflection API calls en concreto ha sido necesario el preservar toString presente en una de las clases de la aplicaci n Todo esto se ve reflejado en el siguiente script ver programa 3 57 Programa 3 57 Script de configuraci n para Retroguard Automatically generated script for RetroGuard bytecode obfuscator To be used with Java JAR file D Temp prueba jmanex jar O5 may 2005 20 16 20 class util ProgressiveMemoryImageProducer Class JuliaExplorerPanel Class GradPresetsEditor Class JuliaPreset Class MandelPreset Class JManEx Class MandelComputer method util ProgressiveMemoryImageProducer main Ljava lang String V method grad BasicGradientPainter toString Ljava lang String method MandelPreset main Ljava lang String V method MandelComputer main Ljava lang String V method GradPresetsEditor main Ljava lang String V method JManEx main Ljava lang String V method JuliaPreset main Ljava lang String V method JuliaExplorerPanel main Ljava lang String V field grad BasicGradientPainter serialVersionUID J option Serializable En este caso hemos especificado como opci n desde l nea de comandos la generaci n de un logfile en el que se refleje el proceso de renombrado llevado a cabo a
129. la posterior evaluaci n de la m trica has sido los siguientes 1 Generar el script necesario para correr la tarea de ofuscaci n en Ant Ver apartado de utilizaci n 2 A continuaci n hemos compilado el archivo build xml mediante Ant 3 Comprobamos que no han ocurrido ninguna incidencia en el archivo logfile que hemos especificado que se genere como opci n Ver programa 3 32 Programa 3 54 Archivo de incidencias obfuscationlog xml lt xml version 1 0 encoding UTF 8 gt lt yguard version 1 1 gt lt l yGuard Bytecode Obfuscator v1 3 2 a Product of yWorks GmbH http www yworks com Logfile created on Thu Apr 14 13 33 42 CEST 2005 Jar file to be obfuscated Testl jar Target Jar file for obfuscated code Testlres jar gt lt Memory in use after class data structure built 1228216 bytes Total memory available 2637824 bytes gt lt expose gt lt method class Test1l name void main java lang String gt lt expose gt lt map gt lt class name Testl1 map A gt lt field class Test1 name aux map A gt lt field class Test1 name vector map B gt lt field class Test1 name hello map C gt lt method class Test1l name java lang String pruebaOfus map A gt lt method class Testl name int getVector map B gt lt class name Hola map B gt lt method class Hola name java lang String getHola java lang String m
130. liza el renombrado Esto tiene cierta utilidad en aplicaciones RMI y env o por entregas serialization e produce a change log file se genera entonces un archivo log en el que se especifica el renombrado llevado a cabo Es importante generarlo por si queremos emplear la herramienta Stack Trace Translate para la traducci n de c digo ofuscado e obfuscate control flow Zelix ofuscar todas las sentencias condicionales if else y bucles for while de manera que no puedan ser descompilados directamente a c digo Java de nuevo Se dan tres opciones de ofuscaci n de control light normal y aggressive En nuestro caso seleccionamos la m s agresiva Hay que destacar que esto produce un incremento del tama o de nuestra aplicaci n de entorno a un 3 e encrypt string literals al activarlo Zelix sustituir strings por strings encriptados y a adir instrucciones al bytecode que desencriptar n los strings durante la ejecuci n runtime Tenemos dos posibilidades a la hora de encriptar normal y aggressive Hemos seleccionado la opci n m s agresiva La diferencia estriba en que con esta opci n se va m s a la hora de borrar alguna constante static final String que pueda dejarse sin encriptar en modo normal La compatibilidad del proceso de encriptado depender de la 137 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java m quina virtual de Java MJV que genere el bytecode En genera
131. llamadas de la clase java lang Class como por ejemplo Class ForName Este tipo de llamadas reciben el nombre de Reflection API calls Algunas caracter sticas sobre nuestro programa l gico son e jmanex jar tiene un tama o de 149 Kbytes e El c digo fuente cuenta con 45 archivos java e Programa con m s de 3400 l neas de c digo fuente e Ejecutable desde cualquier plataforma que utilice Java 1 2 2 e Es una aplicaci n que cuenta con varios m todos main e Es necesario tener en cuenta serializaci n e Cuenta con m todos nativos aunque no parece influir en su ejecuci n e Maneja llamadas de la clase java lang Class La forma de proceder ha sido la siguiente Una vez descargada la aplicaci n hemos comprobado su correcto funcionamiento Para ello hemos consultado el manual de usuario que se proporciona en la web asociada D Temp Aplicaciones Java gt java jar jmanex jar Unable to load native library jmanexNative Using Java computation instead of native Comprobamos que se ejecuta sin problema alguno Al parecer no cuenta con ciertas librer as nativas pero se emplean por defecto las de Java A continuaci n seguimos el esquema de an lisis mostrado anteriormente esquema 3 2 103 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 3 1 PROGUARD Para la ofuscaci n de nuestra aplicaci n hemos seguido los mismos pasos que los indicados a la ho
132. lo sentido que renombra identificadores mediante s mbolos aleatorios y borra comentarios m todos sin uso e informaci n redundante Pese a esto la ofuscaci n de estructura no evita los ataques de ingenier a inversa ya que el c digo a n puede ser estudiado y comprendido Este tipo de ofuscaci n es la m s empleada y extendida La mayor a de los ofuscadores Java utilizan esta t cnica Cambio de Formato Borrado de Comentarios Renombrado de Identificadores Figura 2 3 Ofuscaci n de Estructura ESTRUCTURA rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 4 2 OFUSCACI N DE CONTROL La ofuscaci n de control cambia el flujo de control del c digo fuente del programa Esta t cnica de ofuscaci n podemos clasificarla en Agregado Figura 2 4 Ofuscaci n de Control CONTROL 2 4 2 1 Agregado e Inserci n de predicados opacos Un predicado P se considera opaco si su valor es conocido durante el proceso de ofuscaci n P siempre evaluado como verdad P falso P evaluado como cierto algunas veces o falso en otras ocasiones Estos predicados opacos pueden introducirse en la estructura de control de flujo mediante los tres m todos expuestos anteriormente En la figura 2 5 a el bloque A B es dividido mediante la inserci n de un predicado cierto p que hace que parezca que B solamente se ejecuta solamente en algunos casos En la figura 2 5
133. m s f cil ejecutar programas en gran variedad de entornos solo es necesario implementar para cada plataforma el int rprete de Java Es bien conocido el hecho de que los archivos Java class pueden ser f cilmente descompilados debido a que el bytecode contiene gran parte de la informaci n del c digo fuente original Esto constituye una brecha en cuanto a la mencionada seguridad proporcionada por Java La flexibilidad de Java ofrece una gran cantidad de potenciales ventajas en un entorno distribuido como es Internet sin embargo se est bajo amenazas de varios tipos ingenier a inversa reverse engineering saboteos tampering y pirater a de software Es necesaria por tanto una herramienta que impida la f cil descompilaci n del c digo fuente La herramienta a la que hacemos referencia se denomina ofuscador Los ofuscadores hacen que el c digo generado sea pr cticamente imposible de descompilar Tras el tratamiento realizado por un ofuscador los descompiladores siguen generando c digo fuente a partir de bytecode pero este c digo no es como el original este ser incomprensible haciendo la labor de la ingenier a inversa muy dif cil No existe ning n proceso de ingenier a inversa capaz de deshacer los cambios realizados por un ofuscador de manera autom tica Nuevos usos de la ofuscaci n del c digo se hayan en las aplicaciones para dispositivos m viles La baja potencia de c lculo y la limitaci n de recursos buscan en
134. ma manual o mediante una sencilla interfaz gr fica Hemos optado por la primera opci n De acuerdo al manual de usuario el script de configuraci n para tener en cuenta todos los aspectos mencionados anteriormente ser de la forma Programa 3 59 Script de configuraci n para proceso de ofuscaci n por Jshrink classpath C j2rel 4 2 07 jre lib rt jar classStringMatch noFinalize serialInherit stringEncrypt D Temp prueba jmanex jar keep grad BasicGradientPainter keep JManEx keep grad PresetGradientPainter keep grad GradientSegment Destacar que tras varias simulaciones err neas en las que no se encontraban ciertas clases y despu s de preservarlas del proceso de ofuscaci n la posterior ejecuci n de la aplicaci n ofuscada fue un xito El resultado de la ofuscaci n es un contenedor de salida jmanexRes jar 103 KB de menor tama o que el archivo original se ha conseguido una reducci n del 31 9 Por tanto concluimos que Jshrink es capaz de ofuscar el programa l gico 107 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 3 5 CAFEBABE CafeBabe es un completo desensamblador de c digo Java Ofrece opciones de compactaci n y ofuscaci n del c digo pero no es una aplicaci n dise ada con tal finalidad En cuanto al proceso de ofuscaci n las opciones ofrecidas se limitan a ofuscaci n de Estructura renombrado pudiendo preservar identific
135. mprobar la potencia de los descompiladores mediante una prueba sencilla Supongamos el siguiente c digo fuente generadorAleatorios java Programa 1 1 C digo Fuente generadorAleatorios java import java util Random lt p gt Title lt p gt lt p gt Description lt p gt lt p gt Copyright Copyright c 2004 lt p gt lt p gt Company lt p gt author not attributable version 1 0 FF FF public class generadorAleatorios int semilla Random random public generadorAleatorios int s semilla s long l new Long s longValue random new Random 1 public int generaEnteroAleatorio return random nextInt public long generaLongAleatorio long aux random nextLong return aux public static void main String args generadorAleatorios generadorAleatoriosl new generadorAleatorios 33 Tras establecer correctamente el classpath del entorno no del sistema para indicar al descompilador la localizaci n de los class a descompilar el JODE regenera el c digo fuente original de la clase de forma totalmente autom tica como puede verse en programa 1 2 faltando nicamente los comentarios rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Programa 1 2 C digo Descompilado mediante JODE El generadorAleatorios Decompiled by JOD Visit http jode sourceforge net E import java util Random
136. n la interfaz Serializable optamos por preservar de manera gen rica cualquier m todo de cualquier clase de cualquier paquete que implemente un objeto perteneciente al paquete java io Serializable Al ofuscar teniendo en cuenta lo anterior y despues de comprobar que no ocurri ning n error durante el proceso ejecutamos la aplicaci n resultante Comprobamos que funciona perfectamente El contenedor resultante jmanexObf jar 108 KB se ha reducido a n m s como consecuencia de la ofuscaci n Concluimos por tanto que Zelix KlassMaster es capaz de oscurecer con xito el c digo Java de una aplicaci n Puntuamos con un 1 la m trica correspondiente 3 3 7 SMOKESCREEN Smokescreen es otra de las aplicaciones m s completas de las estudiadas en la secci n anterior 3 2 proporciona mecanismos para ofuscaci n de Estructura Datos y Control Sin embrago en el manual de usuario no se especifican opciones para manejar serializaci n o Reflection API calls Las nicas opciones est n destinadas a preservar identificadores de clases y miembros de clases como en la mayor a de los ofuscadores Despu s de varias simulaciones intentando preservar los identificadores de clases y miembros de clases conflicitivos no hemos conseguido la ofuscaci n de nuestro programa l gico En todas las ocasiones obtuvimos por pantalla la siguiente salida Programa 3 63 Resultado ejecuci n de aplicaci n ofuscada Unable to loa
137. n plugins para Ant y J2ME Wireless Toolkit 31 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Shrink p gt Obfuscate m Ta Optimize Entrada C digo C digo Jar Salida compactado optimizado boa modificar Figura 3 2 Proceso de compactaci n optimizado y ofuscaci n 99 113 Como entrada generalmente se le pasa un archivo jar o wars ears zips o directorios Se compacta se optimiza y se ofusca dando como resultado o salida un archivo jar o wars ears zips o directorios Adem s requiere que se especifiquen librer as externas para resolver posibles dependencias de clases y herencia Estas librer as permanecen inalteradas como puede observarse en la anterior figura Con objeto de determinar qu c digo tiene que preservarse y cu l ha de ser descartado u ofuscado tenemos que especificar uno o m s puntos de entrada en nuestro c digo Estos puntos de entrada son t picamente clases que contienen el m todo principal applets midlets etc En el paso de compactaci n Proguard empieza por estas semillas o puntos de entrada y determina recursivamente qu clases y qu miembros de clases son usados Lo dem s es descartado En el paso de optimizaci n Proguard realiza acciones como por ejemplo clases y m todos que no son puntos de entrada son convertidos a final y algunos m todos sufren inlined P
138. na led Ate Tai 87 3 2 10 JOBFUSCATE courier dani RERET 87 3210 1 INtrOdUCCI OM a E EA EE S 87 3 2 10 2 Ofuscaci n de Ejemplo lenien eree iaei eE K ER EREET 87 3 2 10 3 Ofuscaci n de Ejemplo Zurita aia 91 O A RA 92 3 2 11MARVINOBFUSCATO RR coincido ida 93 3 2 AVA MOCI N ia a sia 93 3 2 11 2 Ofuscaci n de Ejemplo dencia aii pic 93 3 2 11 3 Ofuscaci n de Ejemplo Zenion erea i e Aaaa aaisen 97 32 A14 COM a 97 3 2 12 Y GUARD cota el nad 98 3 2121 O RN 98 3 2 12 2 Ofuscaci n de Ejemplo union 98 3 2 12 3 Ofuscaci n de Ejemplo Loss ii 100 32 124 Conclusion 100 TS PROGRAMA TOC ad 102 33 1 PROGUARD at o to 104 3 3 2 RETROGUARD cocina reas 105 3 33 JA VAGUA RD cui di di e Ia ti ds 106 3 3 o ISHARINK 00 iii 107 3 3 0 CAFEBABE ir A toi ibid ias bs 108 3 3 6 ZELIX KTASS MASTER cutis naco 109 3 3 7 SMOKESCREEN cocina tania bs 111 353 8 JOG Acute 112 3 39 JOBFUSCATE ficient hue salones 112 3 3 10 MARVINOBFUSCATOR ieena REE Ae EEE r th dase ER ETEN 113 33 11 YGUARD rain A E EE E E E EEE KE E a eae 114 3 4 DESCOMPILA CION a a A E O O 116 3 4 1 DESCOMPILACI N DE EJEMPLOS cscssssssessssssesssesseessessecsesssecsssasecsusesesseeass 116 3 4 2 DESCOMPILACION DE PROGRAMA L GICO scssssssesssessssssesstesseessessessecase 117 35 EVALUACI N DE METRICA o SAS 119 3331 PROGUARD inodoros td ii ds 119 3 5 2 RETROGUARD reccssescesscsstcisdstves ss ansiebstesssesesps eddtvsssssvauseadsstesesusseneessbassachene
139. new 4 class Hola Ss dup 9 invokespecial 5 Method Hola lt init gt V 12 putfield 6 Field hello LHola 15 aload 0 16 Tdc 7 String 18 putfield 8 Field aux Ljava lang String 21 aload_0 22 bipush 10 24 newarray int 26 putfield 9 Field vector I 29 getstatic 10 Field java lang System out Ljava io PrintStream 32 aload_0 33 getfield 6 Field hello LHola 36 Ildce 11 String HOLA MUNDO 38 invokevirtual 12 Method Hola getHola Ljava lang String Ljava lang String 41 invokevirtual 13 Method java io PrintStream println Ljava lang String V 44 getstatic 10 Field java lang System out Ljava io PrintStream 20 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 47 aload_0 48 invokevirtual 14 Method pruebaOfus Ljava lang String 51 invokevirtual 13 Method java io PrintStream println Ljava lang String V 54 getstatic 10 Field java lang System out Ljava io PrintStream 57 new 15 class StringBuffer 60 dup 61 invokespecial 16 Method java lang StringBuffer lt init gt V 64 lde 17 String Ejemplo 66 invokevirtual 18 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 69 aload_0 70 invokespecial 19 Method getVector I 73 invokevirtual 20 Method java lang StringBuffer append I Ljava lang StringBuffer 76 ainvokevi
140. ntenedor de salida y posteriormente los ejecutamos D Temp prueba jar xf Testlres jar Destacar que obtenemos dos clases Test class 896 bytes y a class 187 bytes Comprobamos que el tama o de nuestros bytecodes se ha reducido La clase Testl no ha sufrido renombramiento porque Proguard requiere de un punto de entrada para ir ofuscando recursivamente desde esta semilla como ese ha explicado en la introducci n del programa D Temp prueba java Testl HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Comprobamos que seguimos teniendo la misma funcionalidad 6 A continuaci n obtenemos los bytecodes de las dos clases ofuscadas para poder compararlas con sus hom logas sin ofuscar y as poder evaluar nuestra m trica Ver programa 3 3 y 3 4 D Temp prueba javap c p l Testl Programa 3 3 Bytecode Testl class Compiled from null public class Testl extends Java lang Object public a a protected java lang String a private int a public static void main java lang String Code 0 new 1 class Test1 3 invokespecial 11 Method lt init gt V 6 return public Testl Code O aload 0 Is invokespecial 12 Method java lang Object lt init gt V 4 aload 0 5 new 2 class a 8 dup 9 invokespecial 13 Method a lt init gt V 12 putfield 7 Field a La 15 aload_0 16 Ildc 22 String 18 putfield 8 Field a Ljava lang String 34 rea de Ingen
141. ntes de ser ofuscado el c digo del ejemplo Test2 puede ser descompilado con xito e Comparando c digo fuente y bytecode ambos tienen los mismos identificadores e Al comparar c digo fuente original y el descompilado observamos que los bucles y sentencias condicionales aparecen en el mismo orden e El c digo descompilado realiza la misma funci n que el original 21 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 PRUEBAS Y RESULTADOS El trabajo que vamos a realizar en esta secci n se basar en evaluar la efectividad de los ofuscadores en base a la m trica dise ada con anterioridad Para cada ofuscador hemos llevado a cabo los siguientes pasos Instalaci n Procesado Programa L gico Descompilaci n y Evaluaci n de la M trica En la figura 3 1 describimos mediante un diagrama de flujo el dise o experimental que vamos a seguir Seleccionar Ofuscador ST lt i gt No 3 No Depuraci n Si Si lt hi gt Ne Opciones NG Si Si lt i gt as Opciones 2 Evaluaci n de M trica Figura 3 1 Diagrama de flujo del proceso de evaluaci n 28 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 1 INSTALACI N En este punto lo que se pretende es preparar las aplicaciones para su posterior test o El proceso lo vamos a dividir en tres pasos Recopilaci n de Ofuscadores Descarga e Instalaci n 3 1 1 RECOPIL
142. o que se denomina un documento de definici n de tipos DTD Las m s destacadas las rese amos a continuaci n e Elemento obfuscate para el que se pueden especificar los siguientes atributos logfile que determina el nombre del archivo de incidencias que se genera durante la ofuscaci n mainclass indica el nombre de la clase principal de la aplicaci n si se especifica ni esta clase ni el m todo main sufren ofuscaci n replaceClassNameStrings es un atributo boleano para renombrar strings con nombres de clases e Elemento inoutpair al menos un elemento de este tipo ha de especificarse para que se lleve a cabo la ofuscaci n Este elemento especifica el archivo jar que contiene los bytecodes a ofuscar y el jar de salida Tiene dos atributos in contenedor de entrada y out contenedor de salida e Elemento ExternalClasses si el archivo a ofuscar tiene dependencias con librerias externas este elemento puede ser usado para indicar el path de las entidades requeridas 143 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java e Elemento property para indicar opciones de ofuscaci n Estas opciones vienen especificadas mediante nombre y valor dos atributos As tenemos O Error checking tomando el valor de pedantic especifica que se pare el proceso de ofuscaci n si se detecta cualquier error Name Scheme para indicar que utilice dif
143. od java lang StringBuffer lt init gt V 105 getstatic 78 Field B Ljava lang String 108 iconst_0 109 aaload 110 invokevirtual 11 Method java lang StringBuffer append Ljava lang String Ljava lang StringBuffer 1137 ilo dd 1 114 invokevirtual 12 Method java lang StringBuffer append I Ljava lan g StringBuffer 117 invokevirtual 13 Method java lang StringBuffer toString Ljava la ng String 120 invokevirtual 6 Method java io PrintStream printin Ljava lang Str ing V 123 return static Code 0 iconst_3 T anewarray 62 class String 4 dup g iconst_0 6 ide 10 String LpgDYnlyq_ xSX 8 jsr 34 11 aastore 68 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java PRbrRRRR CAS SY YU UY YN NN DN y O O O U Repo JosNReo Oa sp DBA DB HR BBW CDOWMDAIADWNEHE a ag WN RE 84 86 89 Chief 94 96 ggs 101 104 106 107 108 109 TL23 113 114 115 118 121 122 123 126 129 130 131 SS dup iconst 1 ldc 5 String LpqDinlyg_ xSEU 4 TST 34 aastore dup iconst_2 ldc 3 String LpqDinlygq _ xSEW JST 34 aastore putstatic 78 Field B Ljava lang String goto 133 astore 0 invokevirtual 68 Method java lang String toCharArray C dup arraylength swap iconst_0 istore 1 goto 112 dup iload 1 dup2 caload iload_1 iconst_5 irem tableswitch 0 to 3 0 84 18 9
144. okespecial 5 Method I lt init gt V 12 putfield 6 Field append LI 15 aload_0 16 Lac 7 String 18 putfield 8 Field out Ljava lang String 21 aload_0 22 bipush 10 24 newarray int 26 putfield 9 Field printin I 29 getstatic 10 Field java lang System out Ljava io PrintStream 32 aload_0 33 getfield 6 Field append LI 36 iconst 1 37 nvokestatic 65 Method 1 1 1 1 Ljava lang String 40 invokevirtual 11 Method I I Ljava lang String Ljava lang String 43 invokevirtual 12 Method java io PrintStream println Ljava lang St ring V 46 getstatic 10 Field java lang System out Ljava io PrintStream 49 aload_0 49 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 50 invokevirtual 53 invokevirtual ring V 56 getstatic 59 new 14 62 dup 63 invokespecial 66 bipush 12 68 invokestatic 71 invokevirtual String Ljava lang St 74 aload 0 75 invokespecial 78 invokevirtual g StringBuffer 81 invokevirtual ng String 84 invokevirtual ring V 87 return 13 12 10 Method append Ljava lang String Method java io PrintStream println Ljava lang St Field java lang System out Ljava io PrintStream class StringBuffer 15 65 16 ring 17 18 19 12 Me Buffer Me Me Me ethod java l
145. onst_1 5s istore 1 6 return public java lang String a java lang String Code 0 aload_1 T areturn Comprando los bytecodes ofuscados obtenidos con los c digos originales podemos evaluar la m trica dise ada Ver tabla 3 6 EJEMPLO 1 sin EJEMPLO 1 ofuscado M TRICA PUNTUACI N Testiclass Test1 class a class E A 8 lero Campos vecor O Encriptado de Strin PRUEBA DE PRUEBA DE P 8 OFUSCACION OFUSCACION Desestructuracion de yi iff Datos Puntuacion para Ofuscacion de Layout y Datos Tabla 3 6 Evaluaci n de ofuscaci n de Layout y Datos para el ejemplo 1 41 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 2 3 Ofuscaci n de Ejemplo 2 Retroguard v2 0 1 no realiza ofuscaci n de Control de Flujo Es una opci n no disponible 3 2 2 4 Conclusiones e Retroguard puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc e No es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 6 es decir no proporciona opciones de encriptado o desestructuraci n de datos e Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n e No proporciona mecanismos para ofuscaci n de Control de Flujo e Aunque ha obtenido una puntuaci n igu
146. or ltimo en el proceso de ofuscaci n se renombran identificadores de clases y miembros de clases que no son puntos de entrada Manteni ndose los identificadores de stos ltimos 3 2 1 2 Ofuscaci n de Ejemplo 1 Los pasos que hemos seguido para comprobar la efectividad de la aplicaci n Proguard 3 2 en el proceso de ofuscaci n del ejemplo 1 han sido los siguientes 1 Compilar el ejemplo 1 mediante J25DK1 4 2 07 gener ndose los archivos Testl class 1 102 bytes y Hola class 284 bytes D Temp prueba javac Testl java 32 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 Meter estos archivos en un contenedor Test jar que ser el archivo de entrada para nuestra aplicaci n D Temp prueba jar cvf Testl jar Tes1 class Hola class 3 Ejecutar Proguard 3 2 mediante la siguiente instrucci n D Temp prueba gt java jar D Temp proguard3 2 lib proguard jar config pro verbose Notar que hemos utilizado un archivo de configuraci n donde hemos indicado las opciones con las que deb a operar Proguard config pro La configuraci n se detalla a continuaci n en programa 3 1 Programa 3 9 Listado de opciones injars Testl jar outjars Testlres jar libraryjars C Archivos de programa j2sdk1 4 2 07 jre lib rt jar printmapping result map overloadaggressively keep public class Testl public static void main java lang String
147. os y campos son los mismos que en el c digo fuente original Adem s el bytecode contiene el n mero de l nea generada por el compilador Descompilaci n Utilizando el descompilador JODE podemos comprobar como mediante ingenier a inversa es f cil obtener el c digo fuente original de nuestras aplicaciones a partir de los bytecodes Ver programa 2 4 y programa 2 5 Programa 2 4 Decompilaci n de Testl class mediante JODE Testl Decompiled by JODE Visit http jode sourceforge net public class Testl public Hola hello new Hola protected String aux private int vector new int 10 public static void main String strings new Testl public Testl System out printin hello getHola HOLA MUNDO System out println pruebaOfus System out println Ejemplo getVector protected String pruebaOfus aux PRUEBA DE OFUSCACION return aux 22 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java private int getVector vector 0 1 return vector 0 Programa 2 5 Decompilaci n de Hola class mediante JODE Hola Decompiled by JODE Visit http jode sourceforge net ay class Hola public Hola boolean bool true public String getHola String string return string Comparando con los c digos fuentes originales observamos que lo nico que no se
148. ource at lt init gt Unknown Source at A Unknown Source E Cx U T 111 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java at T lt init gt Unknown Source at JManEx main Unknown Source Exception in thread main java lang VerifyError class grad A method A sign ature D I Register 3 contains wrong type at at at B Unknown Source lt init gt Unknown Source lt init gt Unknown Source at U lt init gt Unknown Source at T A Unknown Source at T lt init gt Unknown Source at JManEx main Unknown Source Gar Ge 3 Concluimos que Smokescreen no es capaz de ofuscar programa l gico Asignaremos por tanto un 0 a la m trica individual correspondiente 3 3 8 JOGA Como hemos estudiado anteriormente JoGa m s que un ofuscador es un optimizador aunque tambi n proporciona opciones para la ofuscaci n Estas opciones no contemplan serializaci n o Reflection API calls que son las m s conflictivas Sin embargo JoGa es capaz de preservar del proceso de ofuscaci n las clases indicadas en su totalidad es decir preserva el nombre de la clase as como todos sus m todos y campos Despu s de haber ofuscado con anteriores aplicaciones hemos comprobado que los consabidos errores se producen por clases y miembros de clases de los paquetes grad y util presentes en el c digo de nu
149. ource at jJava io ObjectInputStream readSerialData Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readObject Unknown Source at H lt init gt Unknown Source at H lt init gt Unknown Source at at at at Errores asociados a la serializaci n de m todos y campos No se ha conseguido solventar estos problemas porque CafeBabe no ofrece opci n alguna para tener en cuenta aspectos relacionados con la serializaci n 3 3 6 ZELIX KLASSMASTER Zelix KlassMaster tambi n es un ofuscador bastante completo seg n lo analizado en el apartado 3 2 6 Por defecto ofrece manejo autom tico de RMI JavaBeans y EJB s Adem s se preservan por defecto campos asociados a serializaci n como por ejemplo serialVersionUID En principio no deber amos encontrar problemas para la ofuscaci n del programa l gico pues se tienen en cuenta todas las posibles fuentes de conflicto a la hora de la ofuscaci n para una aplicaci n de envergadura como la que analizamos 109 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Hemos comenzado por compactar el c digo original No debemos olvidar que Zelix KlassMaster ofrece esta opci n Trim por separado del proceso de ofuscaci n Al compactar el programa l gico original obtenemos un contenedor de salida jmanexTrim jar 118
150. partado 3 3 Programa L gico realizamos un an lisis de las aplicaciones de ofuscaci n desde el punto de vista del oscurecimiento de un programa de cierto peso Solamente 5 de las aplicaciones pudieron ofuscar con xito el programa de ah que la mayor a de las herramientas no puedan ser evaluadas en este apartado 117 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Concluimos que la nica aplicaci n capaz de oscurecer el c digo para no permitir ni la descompilaci n del bytecode ofuscado es Zelix KlassMaster Por tanto puntuaremos con un 1 la m trica correspondiente 118 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 5 EVALUACI N DE M TRICA En este ltimo apartado de la secci n se van a presentar en forma de tablas las evaluaciones de la m trica dise ada para la comprobaci n de la efectividad de cada una de las herramientas de ofuscaci n analizadas en el presente proyecto Una vez realizado todo el an lisis experimental mediante simulaciones estamos en disposici n de establecer una comparativa final de los ofuscadores Esta comparativa se basa en el trabajo desarrollado en apartados anteriores de esta secci n Para cada herramienta de trabajo se adjunta el resultado en forma de tabla 3 5 1 PROGUARD OBJETOS CONTENIDO PUNTUACI N OFUSCACI N DE LAYOUT Encriptado de String i OFUSCACION DE DATOS Desestructura
151. plicaci n en concreto por tanto no se entrar en detalle de las caracter sticas de la misma as como de su funcionalidad Para nuestro an lisis solo necesitamos comprobar si despu s de ofuscar el c digo de la aplicaci n sta sigue funcionando A la hora de ofuscar una aplicaci n m s compleja los ofuscadores han de tener en cuenta ciertos aspectos para evitar posibles conflictos Algunas de stas caracter sticas son 1 La aplicaci n puede contar con varios m todos main que habr que preservar del proceso de ofuscaci n 2 Preservar m todos nativos 102 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 Preservar m todos y campos de clases que implementan la interfaz Serializable Clases que requieran un especial manejo a la hora del proceso de serializaci n deben implementar m todos especiales con las siguientes asignaturas private void writeObject java io ObjectOutputStream out private void readObject java io ObjectInputStream in 4 Durante la ejecuci n del proceso de serializaci n se asocia a cada clase serializada un n mero de versi n el cual es usado durante la deserializaci n para verificar que el transmisor y el receptor de un objeto serializado ha cargado clases para ese objeto que son compatibles respecto a la serializaci n Este n mero de versi n ha de ser preservado 5 Manejo de RMI invocaci n de m todos remotos 6 Manejo de
152. plicaci n espec fica de ofuscaci n realiza este proceso de manera aceptable y muy similar a ofuscadores analizados en este estudio de arte e No se proporciona manual de usuario si bien es bastante f cil de manejar gracias a una interfaz gr fica sencilla e No es ejecutable desde l nea de comandos e Destacar que es una aplicaci n Opensource y por tanto freeware 86 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 9 JZIPPER Este proyecto parece haber sido abandonado La ltima versi n liberada de la aplicaci n es de 1999 Al ejecutarla nos da el siguiente mensaje Jzipper software has expired please return to its website to retrieve the latest version Hemos vuelto a bajar la ltima versi n disponible pero nos encontramos con el mismo problema Por tanto no hemos podido evaluarla 3 2 10 JOBFUSCATE 3 2 10 1 Introducci n Jobfuscate permite a desarrolladores de software proteger sus archivos class Java De otra manera sin protecci n cualquiera podr a usar un descompilador para efectuar ingenier a inversa y obtener nuestro c digo Java original Destacar que esta aplicaci n es una soluci n comercial Solo disponemos de una versi n de prueba para la que no est n disponibles todas las opciones de ofuscaci n La versi n completa cuesta 100 Con esta versi n de prueba se nos advierte que realmente no estamos realizando ofuscaci n de Estructura
153. pretarse ya que no se encontrar a el m todo principal main 2 A continuaci n comprobamos que el c digo ofuscado sigue realizando la misma funci n Para ello en primer lugar extraemos los bytecodes del archivo de salida D Temp prueba jar xf Testlres jar Obtenemos dos clases a class 199 bytes y b class 928 bytes Comprobamos que hemos reducido el tama o de los bytecodes con respecto a los originales 43 Area de Ingenier a Telem tica D Temp prueba java b HOLA MUNDO PRUEBA DE OFUSCACION Ejemplo 1 Estudio y Prueba de una M trica para los Ofuscadores Java Efectivamente el c digo ofuscado sigue realizando la misma funci n 3 El siguiente paso ser a la evaluaci n del proceso de ofuscaci n llevado a cabo por Javaguard Para esto comparamos los bytecodes obtenidos tras el proceso de ofuscaci n con los originales Ver programas 3 10 y 3 11 D Temp prueba javap c p l b D Temp prueba javap c p l a Programa 3 10 Bytecode b class public private public Code O 00 Jus ring V 44 47 48 soy Dees ring V 54 57 a if int do public class b extends java lang Object protected java lang String a static void main java lang String new 1 class b dup invokespecial 2 Method lt init gt V pop return b aload 0 invokespecial 3 Method java lang Object lt init gt V aload 0 new 4 class
154. rName Unknown Source at java io ObjectInputStream resolveClass Unknown Source at java io ObjectInputStream readNonProxyDesc Unknown Source at java io ObjectInputStream readClassDesc Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readArray Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream defaultReadFields Unknown Source at java io ObjectInputStream readSerialData Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readObject Unknown Source at m lt init gt Unknown Source at m lt init gt Unknown Source at 1 lt init gt Unknown Source at t lt init gt Unknown Source at k a Unknown Source at k lt init gt Unknown Source at JManEx main Unknown Source Unable to load native library jmanexNative Using Java computation instead of native Comprobamos que los errores est n relacionados con la b squeda de una clase que parece no estar presente grad PresetGradientPainter y con la serializaci n de ciertos m todos 110 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Despu s de varias simulaciones sin xito intentando preservar diferentes m todos y campos de clases que implementa
155. ra de ofuscar los ejemplos del apartado anterior En este caso ha sido necesaria la inclusi n en el script de configuraci n de ciertas l neas para tener en cuenta la serializaci n Solo se ha requerido el especificar como punto de entrada para el proceso de ofuscaci n el m todo main de mayor orden jer rquico el resto se resuelven de forma transparente Por otro lado Proguard tambi n soluciona de forma autom tica las denominadas Reflection API calls Programa 3 55 Script que contiene opciones de ofuscaci n para Proguard Config pro injars jmanex jar outjars jmanexRes jar libraryjars C j2sdk1 4 2 07 jre lib rt jar printmapping program map overloadaggressively keep public class JManEx public static void main java lang String keepnames class implements java io Serializable keepclassmembers class implements java io Serializable static final long serialVersionUID static transient lt fields gt private void writeObject java io ObjectOutputStream private void readObject java io ObjectInputStream java lang Object writeReplace java lang Object readResolve El resultado del proceso de ofuscaci n es un contenedor jmanexRes jar 94 KB cuyo tama o inicial se ha reducido considerablemente Destacar que el proceso de renombrado llevado a cabo se recoge en un fichero de mapeo especificado en el script como opci n program map Por pantalla hemos obtenido el r
156. res Por ejemplo puede un ofuscador oscurecer el c digo con xito pero tambi n puede el c digo ofuscado ser descompilado Generalmente se suele acudir para el an lisis de un ofuscador a m tricas de software que tienen en cuenta el incremento de la complejidad en longitud del programa n mero de operandos y operadores flujo de datos n mero de predicados anidamiento en estructuras condicionales estructura de datos variables arrays etc y orientaci n a objetos nivel de herencia emparejamiento entre objetos n mero de m todos desencadenados por otro etc rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 2 4 T CNICAS DE OFUSCACI N Un ofuscador es un programa que aplica transformaciones al c digo fuente de una aplicaci n en Java Esta transformaci n de ofuscaci n podemos clasificarla en tres t cnicas Ofuscaci n de estructura de control y de datos T cnicas Ofuscaci n Ofuscaci n Ofuscaci n Ofuscaci n Estructura Control Datos Figura 2 2 T cnicas de Ofuscaci n 2 4 1 OFUSCACI N DE ESTRUCTURA La ofuscaci n de estructura modifica la estructura del c digo mediante dos m todos b sicos renombrar identificadores y borrar informaci n redundante Esto hace que el c digo contenga menor informaci n con el objetivo de evitar la ingenier a inversa La mayor a de las ofuscaciones de estructura no pueden deshacerse porque usan una funci n de un so
157. return athrow Exception table to target type 47 54 any public A Code O Las 4 aload 0 invokespecial return 9 Method java lang Object lt init gt V Observamos que el bytecode ofuscado es mucho mas complejo que el original lo que nos da una idea de que la ofuscaci n de control de flujo ha sido efectiva El coste de esta ofuscaci n es obtener un bytecode cuya ejecuci n es m s lenta y el tama o del mismo es ligeramente mayor Test2 class 799 bytes en comparaci n con A class 1 124 bytes 3 2 7 4 Conclusi n Smokescreen puede realizar ofuscaci n de Estructura renombrando identificadores de clases y miembros de clases Public Protected y Private Adem s borra toda informaci n redundante como comentarios miembros si uso etc Es capaz de realizar ofuscaci n de Datos como puede verse en la tabla 3 11 proporciona opciones de encriptado aunque en este caso hemos comprobado que siguen sin encriptar los strings de nuestro bytecode Por tanto hemos puntuado con un cero la m trica individual No realiza desestructuraci n de datos Despu s de ser ofuscado con las opciones m s severas nuestro c digo segu a realizando la misma funci n Los dos ejemplos segu an funcionando Proporciona mecanismos para ofuscaci n de Control de Flujo Es la principal ventaja con respecto a otras aplicaciones Se proporciona un manual de usuario muy detallado en la p gina web asociada a la apli
158. riptar por tanto en el aparatado individual de la m trica referente a encriptaci n hemos puntuado con un 0 Como parte de la ofuscaci n de control se han a adido nuevos campos que si aparecen encriptados Sin embargo este no era el prop sito que persegu amos EJEMPLO 1 sin EJEMPLO 1 ofuscado M TRICA PUNTUACI N Testiclass A class B class campos mio Pee E a 9 ee ie E camps eae Je Borrado Numero Linea Somero de tnea A Encriptado de Strin PRUEBA DE PRUEBA DE P 8 OFUSCACION OFUSCACION Desestructuracion de Puntuacion para Ofuscacion de Layout y Datos Tabla 3 11 Evaluaci n de ofuscaci n de Estructura y Datos para el ejemplo 1 3 2 7 3 Ofuscaci n de Ejemplo 2 Smokescreen si proporciona ofuscaci n de Control Este proceso de ofuscaci n se basa en Shuffle Stack Operations que realiza cambios en el orden de ejecuci n de instrucciones Add Fake Exceptions introduce en el bytecode bloques de excepciones que se superponen a los bloques de control existentes y Change Switch Statements cambia el flujo de control en sentencias de tipo switch 76 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Para evaluar esta ofuscaci n de control hemos dise ado el ejemplo 2 Los pasos que hemos seguido han sido los siguientes 1 Generamos el archivo de directivas Destacar que en este caso como entrada hemos considerado un directorio qu
159. rma m s t pica de proceder la utilizaci n de un archivo de configuraci n pro java jar proguard jar config pro Tambi n podemos combinar opciones desde la l nea de comandos y opciones especificadas desde un archivo java jar proguard jar config pro verbose Las diversas opciones vienen enumeradas en la gu a de usuario proporcionada en la web asociada a la aplicaci n Las opciones m s destacables las detallamos a continuaci n e injars especifica el archivo de entrada jar o wars ears zips O directorios de la aplicaci n a ser procesada Los archivos class ser n procesados y transformados en un archivo de salida e outjars especifica el nombre del archivo de salida jar e libraryjars especifica las librer as de la aplicaci n que se va a procesar Estas librer as externas se requieren para resolver posibles dependencias y herencia No ser n incluidas en el archivo de salida e keep para especificar clases y miembros de clases que queramos preservar del proceso de compactaci n optimizaci n y ofuscaci n Generalmente se preserva la clase que contiene el m todo principal punto de entrada Esto har que se conserve su nombre original e printmapping especifica que se imprima en un archivo map el proceso de renombrado de identificadores es decir clases y miembros que han sido renombrados y las transformaciones llevadas a cabo e overloadaggres
160. ro c digo necesita de otras librer as externas para resolver posibles dependencias o herencias es necesario que estas librer as est n disponibles en el classpath antes de ejecutar Retroguard En nuestro caso no hemos tenido que realizar nada extraordinario porque tenemos J2SDK1 4 2_07 integrado en el classpath JAVAGUARD Ofusca archivos de entrada jar La salida tambi n se da en el mismo formato Para ello emplea un scritpfile en el que se proporcionan opciones de ofuscaci n diferentes de las opciones por defecto Las opciones por defecto son las siguientes Borrado de atributos excepto c digo valores de constantes excepciones e Innerclasses Ofusca todos los paquetes interfaces clases m todos y miembros del archivo de entrada exceptuando aquellos en los que se pueda romper el polimorfismo de clases e interfaces fuera del jar 133 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Para ejecutarlo desde l nea de comandos tecleamos java JavaGuard i lt Input jar gt o lt Output jar gt options donde las opciones se resumen en el programa 1 Programa 1 Listado de opciones de JavaGuard 2 0 6 jar JavaGuard Usage java JavaGuard i lt input file gt o lt output file gt options i lt input file gt The name of an input JAR file to be obfuscated input d lt dir gt lt regex gt Obfuscate all files below the directory tha
161. rtual 21 Method java lang StringBuffer toString Ljava lang String 79 ainvokevirtual 13 Method java io PrintStream println Ljava lang String V 82 return LineNumberTable line 14 0 line 8 4 line 9 15 line 10 21 line 15 29 line 16 44 line 17 54 line 18 82 protected java lang String pruebaOfus Code O aload 0 des ldc 22 String PRUEBA DE OFUSCACION 3 putfield 8 Field aux Ljava lang String 6 aload 0 des getfield 8 Field aux Ljava lang String 10 areturn LineNumberTable line 20 0 line 21 6 private int getVector Code O aload 0 Te getfield 9 Field vector I 4 iconst_0 5 iconst_1 6 lastore qe aload 0 8 getfield 9 Field vector I 11 iconst_0 12 iaload 13 return LineNumberTable line 24 0 line 25 7 Programa 2 3 Bytecode Hola class D Temp prueba gt javap c p 1 Hola Compiled from Testl java class Hola extends java lang Object 21 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java public Hola Code O aload 0 El invokespecial 1 Method java lang Object lt init gt V 4 iconst_1 Sis istore_1 6 return LineNumberTable line 30 0 line 31 4 line 32 6 public java lang String getHola java lang String Code 0 aload_1 areturn LineNumberTable line 34 0 De los bytecodes generados podemos concluir que los nombres de las clases m tod
162. s que contiene la modificaci n de identificadores public protected y private y Borrado de N mero de L neas La segunda parte ofuscaci n de Datos tiene en cuenta Encriptado de String y Desestructuraci n de Datos como el redimensionado de un array En la tercera parte ofuscaci n de Control tenemos en cuenta transformaciones en el flujo de control de el c digo tales como transformaciones en la estructura de sentencias condicionales if else y bucles while for El cuarto apartado Ofuscaci n de Programa mide si un ofuscador puede oscurecer con xito un programa complicado 16 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java La quinta parte Descompilaci n de C digo Ofuscado muestra si el bytecode ofuscado puede ser descompilado nuevamente Por ltimo en el apartado sexto Descompilaci n de Programa Ofuscado comprobamos si el bytecode de programas ofuscados puede ser descompilado Hemos escogido este dise o porque nos permitir puntuar por separado los distintos tipos de ofuscaci n de manera sencilla La puntuaci n m xima de la m trica es de 10 un punto por cada apartado individual La puntuaci n se otorga de la siguiente manera 0 si para un apartado individual no se observa comportamiento de ofuscaci n en la salida Por ejemplo en el apartado de Renombrar Identificadores si tuvi ramos un m todo priv
163. s como posibles incidencias en la ofuscaci n 105 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Tras comprobar que no ha ocurrido error alguno ejecutamos la aplicaci n ofuscada para comprobar su correcto funcionamiento Despu s de algunas simulaciones conseguimos sin problemas que funcione bien Por lo tanto puntuamos con un 1 la m trica correspondiente 3 3 3 JAVAGUARD Como estudiamos en el apartado 3 2 3 Javaguard era una de las aplicaciones analizadas con menos opciones a la hora de configurar el proceso de ofuscaci n Solo ofrece como opci n el preservar los nombres de clases y miembros de las mismas Tanto en la p gina web asociada como en el breve manual de usuario proporcionado por la aplicaci n no se especifican opciones para tener en cuenta serializaci n Tampoco como tener en cuenta las Reflection API calls La aplicaci n en cuesti n parece no ser compatible con estos aspectos Para la ofuscaci n de nuestro programa l gico comenzamos preservando del proceso de ofuscaci n todos los m todos main presentes en la aplicaci n De esta forma conseguimos que la aplicaci n ofuscada se ejecutara pero no del todo bien pues no se cargaban ciertas partes del programa presets Por pantalla se mostraba el siguiente resultado de ejecuci n Programa 3 58 Resultado de ejecuci n jmanexRes jar Unable to load gradient presets data Exception java lang Class
164. s _ _____________ jull 21 02 28 02 07 03 14 03 21 03 28 03 04 04 18 04 25 04 02 05 09 05 16 05 23 05 30 05 06 06 13 06 20 06 27 06 Documentaci n del oS de ofuscaci n y aplicaciones Estudio y An lisis de Informaci n Recopilaci n de Ofuscadores An lisis y Testeo Entrega y correcci n m Seguimiento del proyecto Diagrama 5 1 Temporizaci n del proyecto mediante diagrama de Grant 127 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 5 COSTES En la realizaci n del presupuesto se han tenido en cuenta los siguientes aspectos e El proyecto fin de carrera ha sido desarrollado por una sola persona cuyo nivel profesional podr a corresponder al de un ingeniero junior e La ejecuci n del proyecto fin de carrera ha comprendido el periodo de tiempo entre Marzo y Mayo ambos incluidos del a o 2005 A continuaci n se realiza un desglose del presupuesto y un resumen de dicho desglose 5 1 DESGLOSE DE PRESUPUESTO El presupuesto del proyecto se puede desglosar en coste de recursos humanos y coste de los recursos materiales empleados 5 1 1 COSTE DE RECURSOS HUMANOS El coste presupuestario de personal se ha calculado de la siguiente forma Si se supone que se ha desempe ado una jornada de trabajo b sica de 40 horas semanales y que se puede establecer un sueldo base de unos 1 800 mensuales para un ingeniero junior el coste de recurso
165. s humanos es Periodo de Marzo a Mayo 1 800 x 3 meseS cecc eee ec ec ene ence cece ease eee eeeeneeneeaene ene eaeees 5 400 Subtotal 5 400 5 1 2 COSTE DE RECURSOS MATERIALES Este apartado incluye los costes del hardware y consumibles utilizados Destacar que no hay costes referentes a software debido a que las herramientas bajo estudio son aplicaciones freeware o versiones de evaluaci n 5 1 2 1 Coste Hardware El hardware empleado para desarrollar todo el proyecto ha sido un ordenador personal y una impresora Por lo tanto el coste de hardware es el siguiente Subtotal 960 128 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 5 1 2 2 Coste de Consumibles Los costes asociados a los consumibles son los siguientes Electricidad Cos A GAs E GIT AAG Oe Ng wae lea Sa DR oR SS 20 Conexi n a Internet ADSL merses ccc cece cece ee ene eee a eee DE OnE EEE EEE E EEE SEES SHEE EERE EEE EE EES 135 Material de oficina papel CD Siac ya eie saa ad dd 20 Subtotal 175 5 2 RESUMEN PRESUPUESTO Todo el coste anteriormente desglosado puede resumirse en la siguiente tabla Coste de recursos humanos Periodo de Marzo a Mayo 1 800 x 3 Meses oooococcoccconconccocnconcnnoncnncononcnncnnonnoncnncnnanaos 5 400 Subtotal 5 400 Coste de recursos materiales Coste Hardware PE A AEA RS 900 Impre
166. sdas 120 3 5 3 JAVAGUARD ccccocococonononccnnonanonanonoccnncanonononccnononnnnnnnnconononnnnenonccnocnonannnnnncnrononannnnnes 120 325 4 JSARINK a a e A a te 121 3 5 5 CAFEBABE E ETE EEEE EEEE TEE 121 3307 ZELIX KLASS MASTER a r 122 INTE SMOKESCREEN de 122 NS SOGA EN EAE E a D E Bld Se tl e ti ta oe do 123 3 99 JOBBU SCAB 4223 e e ates eh bo e RS 123 3 5 10 MARVINOBFUSCATOR cccccccccccccsessscesececessssssessesscsessessssssesseessessssseseessesees 124 S22 Y GUARD fucose ii eee Bee abet tae She woes Oe ta Se She a Ne Ae 124 3252127 CONCLUSIONES Er EESE EEA degen EESE lo 125 4 TEMPORIZACION 0d in 126 5 COSTES PEE EE E E EA E OE osdovasesustustues sbbasvessedesss 128 5 1 DESGLOSE DE PRESUPUESTO oooooococonnnonononononononononononononononononononononononononenacocacecanonos 128 5 1 1 COSTE DE RECURSOS HUMANOS ooccccococonononcconanananonenoconannnnnncnncnnnnananonenicncnnanes 128 5 1 2 COSTE DE RECURSOS MATERIALES c oooococcccnononononononicnnncnnanonononcnnananonociconananes 128 5 121 EA HardW ren nhn a a eg obec cg ceases a ea tag a 128 51 22 Coste de O a eee 129 5 2 RESUMEN PRESUPUESTO oococcccnnnccnncnononononcnononononononononononononononononononononononenononininininens 129 ANNAN SIA O 130 6 1 REFERENCIAS DOCUMENTACION esesesssssessscsesesesesessssesesvsssesesssesesccescsvscsvstscsereneaeaes 130 6 2 REFERENCIAS MANUALES OFUSCADORES cocococccononcncnononononononononononononononononininininas 131 AINEX O A TN 132 UT
167. siones de evaluaci n comerciales en la Internet 3 Procesado En esta tercera etapa se ha llevado a cabo un an lisis experimental seg n los objetivos marcados en el proyecto La tarea de procesado ha constado de dos pasos e Procesado de ejemplos e Procesado de programa l gico e Evaluaci n 4 Redacci n del proyecto fin de carrera Esta tarea se ha llevado a cabo simult neamente a la realizaci n de las etapas anteriores 5 Seguimiento del proyecto fin de carrera Se ha informado regularmente al profesor tutor Don Antonio Jes s Sierra Collado del estado de ejecuci n en cada momento As ha podido seguir la evoluci n del proyecto y establecer las medidas correctivas que ha estimado oportunas La informaci n necesaria para el seguimiento del proyecto se ha hecho llegar mediante correos electr nicos y reuniones en su despacho 6 Correcci n y entrega de versi n definitiva del proyecto fin de carrera En el siguiente diagrama se muestra la evoluci n temporal de las diferentes tareas 126 Area de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Nombre de tarea Documentaci n Estudio y An lisis de la Informaci n Recopilaci n de Ofuscadores An lisis y Testeo Redacci n Entrega y Correcci n Seguimiento del proyecto Comienzo mar 01 03 05 mi 16 03 0 jue 31 03 05 mi 06 04 0 mar 15 03 05 vie 27 05 05 mar 01 03 05 maros las may Io
168. sively especifica que se lleve a cabo un agresivo proceso de overload durante la ofuscaci n De esta forma puede ocurrir que m todos y miembros sean renombrados con los mismos identificadores que se cambien los tipos de los par metros de los m todos etc 132 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java RETROGUARD Retroguard est dise ado para ser integrado en el proceso de construcci n de aplicaciones Java de manera que se convierta en un paso m s del proceso de dise o de una aplicaci n Para ejecutar Retroguard desde l nea de comandos tecleamos jar retroguard jar input jar output jar script rgs logfile donde e input jar es el archivo original sin ofuscar e output jar fichero resultante tras el proceso de ofuscaci n e script rgs fichero que contiene las opciones seg n las cuales se realiza la ofuscaci n e logfile archivo donde se reflejan los posibles errores o avisos en el proceso de ofuscaci n Para la generaci n del script de configuraci n Retroguard proporciona una interfaz gr fica que nos permite crearlo de manera sencilla Tambi n pueden escribirse estos scripts directamente en el manual de usuario se especifica como hacerlo Este manual de usuario se proporciona en la p gina de Internet asociada ver tabla 3 2 En nuestro caso concreto hemos acudido a la ejecuci n de la interfaz Debemos tener en cuenta adem s que si nuest
169. sora tek age is eae A AA vide Gh en oA a ee ete 60 Coste de Consumibles Electricidad Constimida state 20 Conexi n a Internet ADSL sc cense a E a Dee ee tas 135 Material de oficina papel CDS diia is dd tna 20 Subtotal 1135 Total 6535 Tabla 5 1 Resumen costes proyecto 129 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 6 REFERENCIAS 6 1 REFERENCIAS DOCUMENTACI N 1 Christian Collberg Clark Thomborson Douglas Low A Taxonomy of ObfuscatingTransformations http www cs arizona edu collberg Research Publications CollbergThomborsonLow9 Talindex html 2 C S Collberg y C Thomborson Watermarking Tamper Proofing and Obfuscation Tools for Software Protection IEEE Transactions on Software Engineering Vol 28 no 6 June 2002 http www cs auckland ac nz cthombor Pubs 112393 2a pdf 3 C S Collberg Security Through Obscurity http www cs arizona edu collberg Teaching 620 2002 Handouts Handout 13 pdf 4 D Low Protecting Java Code Via Code Obfuscation http www cs arizona edu collberg Research Students DouglasLow obfuscation html 5 G lvarez Ofuscaci n del c digo http www cs arizona edu collberg Teaching 620 2002 Handouts Handout 13 pdf 6 Hongying Lai A comparative survey of Java obfuscator http www cs auckland ac nz cthombor Students hlai hongying pdf 7 J Knudsen
170. string e Permite eliminar informaci n opcional contenida en el c digo e Permite la ofuscaci n del bytecode 3 2 5 2 Ofuscaci n de Ejemplo 1 Una vez estudiadas las breves notas sobre la utilizaci n de nuestra aplicaci n en la p gina web asociada hemos seguido los siguientes pasos para la evaluaci n de la misma 1 Abrir CafeBabe mediante la instrucci n desde l nea de comandos 55 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java D Temp CafeBabe CafeBabe gt java jar CafeBabe jar Obtenemos una interfaz gr fica GUI de f cil manejo y muy intuitiva para la cual solo tenemos que cargar el archivo a tratar Este archivo debe ser un class No debemos olvidar que CafeBabe es ante todo un desensamblador Adem s mediante la opci n Class Hound Service podemos cargar el contenedor Test jar que contiene los bytecodes de nuestro ejemplo 1 2 El siguiente paso ha sido la optimizaci n de nuestro c digo fuente Para ello en la pesta a de tareas hemos seleccionado strip Aparece una especie de navegador que nos permite explorar el archivo o conjunto de archivos a optimizar Seleccionamos entrada salida y opciones de optimizaci n borrar informaci n redundante en el cuerpo de los m todos atributos de clases desconocidos y atributos de c digo fuente El resultado es un archivo de salida Test res jar aun sin ofuscar pero para el cual hemos reducido el
171. t Ljava io PrintStream 32 aload_0 33 getfield 6 Field ajb LA 36 ldc 11 String HOLA MUNDO 38 invokevirtual 12 Method A aja Ljava lang String Ljava lang String 41 invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 44 getstatic 10 Field java lang System out Ljava io PrintStream 47 aload 0 48 invokevirtual 14 Method aje Ljava lang String 51 lt invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 54 getstatic 10 Field java lang System out Ljava io PrintStream 57 new 15 class StringBuffer 60 dup 61 invokespecial 16 Method java lang StringBuffer lt init gt V 64 lde 17 String Ejemplo 66 invokevirtual 18 Method java lang StringBuffer append Ljava lang 57 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java String Ljava lang StringBuffer 69 aload_0 70 invokespecial 19 Method ajf I 73 invokevirtual 20 Method java lang StringBuffer append I Ljava lan g StringBuffer 76 invokevirtual 21 Method java lang StringBuffer toString Ljava la ng String 79 invokevirtual 13 Method java io PrintStream println Ljava lang St ring V 82 return protected java lang String aje Code 0 aload 0 Ls ldc 22 String PRUEBA DE OFUSCACION 3 putfield 8 Field ajc Ljava lang String 6 aload_0 us getfield 8
172. t java lang Class forName Unknown Source at java io ObjectInputStream resolveClass Unknown Source at java io ObjectInputStream readNonProxyDesc Unknown Source at java io ObjectInputStream readOrdinaryObject Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readArray Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream defaultReadFields Unknown Source at java io ObjectInputStream readSerialData Unknown Source at java io ObjectInputStream readObject0 Unknown Source at java io ObjectInputStream readObject Unknown Source at G lt init gt Unknown Source at G lt init gt Unknown Source at C lt init gt Unknown Source at Y lt init gt Unknown Source at W init Unknown Source at W lt init gt Unknown Source at JManEx main Unknown Source Exception in thread main java lang NoSuchMethodError As apk Ljava util Observ er V at Ak apk Unknown Source at C lt init gt Unknown Source at Y lt init gt Unknown Source at W init Unknown Source at W lt init gt Unknown Source at JManEx main Unknown Source 108 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Se produce un error porque no se encuentra la clase erad PresetGradientPainter Tras preservar esta clase obtuvimos lo siguiente como resultado de la ejecuci n del programa l
173. t match the regular dir expression o lt output file gt The name of the output file that will contain the obfuscated output contents of all input files s lt script gt The name of a valid JavaGuard script file script 1 lt log file gt The name for the log file log dump Dump the parsed class tree before obfuscation y Increment the logging level To be more verbose specify the verbose parameter several times h Show this info page help version Show the program version El scriptfile puede contener comentarios y directivas que especifican las opciones para el ofuscador No se especifica muy bien como crear este scriptfile En l las opciones son referentes a preservar clases y miembros de clases En nuestro caso estaremos interesados en preservar nicamente el m todo principal Las directivas que pueden aparecer en este archivo de exclusi n podr an ser las siguientes e attribute lt atributo gt el atributo podria ser un determinado c digo fuente dentro de una aplicaci n la tabla de variables locales etc e class lt option gt donde el campo opci n puede tomar los valores public protected method field en orden a preservar las clases publicas las clases definidas como protected o los miembros de una determinada clase respectivamente e method lt m todo gt para excluir un m todo Esta es la opci n que hemos empleado para la ofuscaci n de nuestro ejemplo
174. tama o de los bytecodes Hola class 224 bytes y Testl class 986 bytes Para esta comprobaci n previamente hemos tenido que extraer el contenido del archivo de salida mediante la instrucci n D Temp prueba Testlres jar gt jar xf Testlres jar 3 A continuaci n hemos procedido a ofuscar nuestro c digo optimizado Para esto al igual que antes nos hemos ido a la pesta a de tareas y hemos seleccionado la opci n Obfuscate Al igual que para la tarea de optimizaci n obtenemos un navegador que nos permite seleccionar la entrada la salida y las opciones para el proceso de ofuscaci n Como entrada hemos tomado el contenedor optimizado en el paso anterior Testlres jar Las opciones de configuraci n para el proceso de ofuscaci n que hemos decidido aplicar son las siguientes modo an nimo de paquetes ofuscaci n de paquetes clases y miembros de clases Por otro lado pueden especificarse clases y miembros de clases que no queremos que sean ofuscados No permite m s opciones Es necesario escribir un punto de entrada desde el cual CafeBabe aplicar ofuscaci n recursivamente este punto de entrada debe ser necesariamente la clase principal Testl en nuestro caso A la salida obtenemos otro contenedor Test 2res jar esta vez con el c digo ofuscado 4 Comprobamos que el c digo ofuscado sigue realizando la misma funci n Para ello primeramente extraemos los bytecodes del contenedor de salida y posteriormente
175. tar el proceso de ofuscaci n Obtenemos como salida un contenedor Testlres jar que hemos seleccionado previamente en File gt Save All Debemos destacar que se ha generado un archivo log donde se especifican todas las incidencias del proceso de ofuscaci n Ver programa 3 19 61 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Programa 3 19 Archivo ChangeLog donde se reflejan las incidencias de la ofuscaci n D Temp prueba log txt version 4 3 6d 2005 03 29 16 18 21 DO NOT EDIT THIS FILE You need it to interpret exception stack traces Class Hola gt a Source Testl java FieldsOf Hola public static int z gt a MethodsOf Hola public java lang String getHola java lang String gt a Class public Testl NameNotChanged Source Testl java FieldsoOf Testl protected java lang String aux gt b public Hola hello gt a private int vector gt c public static boolean z gt d private static java lang String z NameNotChanged MethodsOf Testl private int getVector gt b public static void main jJava lang String NameNotChanged protected java lang String pruebaOfus gt a TraceBackClass Testl Data 1637 ForwardClass Hola Data 2269 MemberClass Hola Data 98 MemberClass Testl Data 466 Los bytecodes ofuscados los obtenemos extray ndolos del contenedor de salida mediante la instrucci n D Temp prueba jar xf Testlres jar O
176. todos los objetos del c digo que la implementan Se consigue que la aplicaci n funcione pero no se cargan ciertos presets como ocurr a al ofuscar con otras herramientas Por tanto concluimos que yGuard no es capaz de ofuscar el programa l gico Puntuaremos con un 0 la m trica correspondiente 115 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 4 DESCOMPILACI N En este apartado comprobaremos si el c digo ofuscado puede ser descompilado nuevamente Para este prop sito nos apoyaremos en la aplicaci n JODE Entorno de Descompilaci n y Optimizaci n Java Nos limitaremos a analizar si JODE es capaz de descompilar tantos los ejemplos dise ados para analizar la m trica como el programa l gico en los casos para los que el proceso de ofuscaci n haya resultado exitoso 3 4 1 DESCOMPILACI N DE EJEMPLOS En el aparatado 3 2 Procesado se ha conseguido ofuscar con xito los ejemplos mediante 11 de las 12 herramientas de ofuscaci n de las que part amos inicialmente Para cada una de estas aplicaciones vamos a analizar si el resultado del proceso de ofuscaci n es decir los ejemplos ofuscados pueden descompilarse nuevamente Al descompilar probablemente no podamos descifrar el c digo oscurecido pero en esta secci n tratamos de ir m s all Asignaremos un punto en la m trica definitiva si el descompilador no es capaz de regenerar el c digo oscurecido Esto ser se al de que
177. trictions here DO NOT EDIT BELOW THIS LINE DO NOT EDIT BELOW THIS LINE JavaGuard Bytecode Obfuscator version 1 0beta4 Logfile created on Wed Apr 06 16 19 11 CEST 2005 Input taken for obfuscation Testl jar Output Jar file Testlres jar JavaGuard script file used script Memory in use after class data structure built 213280 bytes Total memory available 2031616 bytes Obfuscated name overloading frequency tas used 4 times 50 Last used 2 times 25 bt used 1 times 12 do used 1 times 12 Other names each used in lt 1 of mappings used a total of 0 times 1 The following fields and methods are used in serializable classes and are checked whether they should be marked for retention or not Full list of names reserved from obfuscation method Testl main Ljava lang String V Obfuscated name mappings some of these may be unchanged due to polymorphism constraints class_ map Hola a method_ map Hola getHola Ljava lang String Ljava lang String a class_ map Testl b field map Testl aux a field map Test1 hello if field map Testl vector do method map Testl getVector I a method map Testl pruebaOfus Ljava lang String if Destacar que hemos empleado un script para especificar la exclusi n del m todo principal del proceso de ofuscaci n En caso contrario obtendr amos un bytecode que dar a error al inter
178. uracion de vectoiti cf Datos Puntuacion para Ofuscacion de Layout y Datos Tabla 3 10 Evaluaci n de ofuscaci n de Layout y Datos para el ejemplo 1 3 2 6 3 Ofuscaci n de Ejemplo 2 Zelix KlassMaster si proporciona ofuscaci n de Control a diferencia de la mayor a de las aplicaciones estudiadas hasta ahora Por tanto lo convierte en uno de los ofuscadores m s completos estudiados Para evaluar este proceso de ofuscaci n de control hab amos dise ado el ejemplo 2 ver apartado 2 6 2 Dise o de Ejemplos Los pasos que hemos realizado para esta evaluaci n son los siguientes 1 Hemos abierto la aplicaci n Zelix KlassMaster como se ha explicado anteriormente D Temp ZKM java jar ZKM jar 2 Hemos cargado el bytecode de nuestro ejemplo 2 Test2 class En este caso no ha sido necesario crear un contenedor porque solo tenemos una clase 3 A continuaci n hemos utilizado la herramienta de ofuscaci n Para ello seleccionamos Tools y Obfuscate Seleccionando las opciones de ofuscaci n que deseemos En nuestro caso hemos seleccionado las m s agresivas Ver el apartado de utilizaci n de la aplicaci n 4 Ejecutamos el proceso de ofuscaci n Obtenemos como salida un archivo a class que hemos seleccionado previamente en File gt Save All Debemos destacar que se ha generado un archivo log donde se especifican todas las incidencias del proceso de ofuscaci n Ver programa 3 22 66 rea de Ingenier a Telem tic
179. uscadores Java line 16 18 line 17 23 line 19 34 line 22 42 line 23 47 line 25 54 line 26 60 line 27 85 Del bytecode generado podemos concluir que los nombres de las clases m todos y campos son los mismos que en el c digo fuente original Adem s el bytecode contiene el n mero de l nea generada por el compilador Descompilaci n Utilizando la herramienta de descompilaci n JODE obtenemos el siguiente c digo descompilado Programa 2 8 Decompilaci n de Test2 class mediante JODE Test2 Decompiled by JODE Visit http jode sourceforge net a public class Test2 public static void main String strings int i 0 for int iO 0 iO lt 2 iO itt cas if i gt 1 System out print Numero de bucle gt 1 else System out println Numero de bucle lt 1 EOL MIE E OL SA empty System out println System out println Numero de bucle 1 A excepci n de los comentarios todo el c digo recuperado es igual al del c digo fuente original Renombrando los archivos descompilados notar que el archivo java ha de tener el mismo nombre que la clase principal del c digo fuente y volviendo a compilarlos comprobamos que siguen realizando la misma funci n D Temp prueba gt java Test2 Numero de bucle gt 1 Numero de bucle 1 26 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Conclusiones e A
180. uye el m todo indicado del proceso de renombrado e xf lt class field gt excluye el campo indicado del proceso de renombrado e xc lt class gt an logo para la clase especificada e sys lt class gt identifica que clases son del sistema y por tanto no ser n ofuscadas Mediante esta opci n especificamos la ruta de superclases para que puedan resolverse posibles dependencias e lt file gt mediante esta opci n indicamos a la aplicaci n que el archivo es un sriptfile donde se recogen las opciones de configuraci n Existen m s opciones disponibles que pueden consultarse en l nea de comandos si ejecutamos la aplicaci n sin ning n tipo de argumento Hemos recogido las m s interesantes y las que emplearemos en la ofuscaci n de nuestro ejemplo MARVINOBFUSCATOR Destacar que es la aplicaci n para la cual hemos tenido mayores problemas a la hora de ejecutarla No se proporciona un manual de usuario detallado solamente un script de configuraci n necesario su ejecuci n ver el siguiente programa Programa 2 Script de configuraci n MarvinObfuscator config txt Template for a Marvin Obfuscator config file AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA Directories and jar zip archives where your application s classes reside relative to project directory classpath C j2sdk1 4 2 07 jre lib rt jar C MarvinObfuscator prueba AAA AAA AAA AAA AAA AAA AAA TTT T
181. v lt init gt Unknown Source at u a Unknown Source at u lt init gt Unknown Source at k main Unknown Source Unable to load native library jmanexNative Using Java computation instead of native 106 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java Comprobamos que se produce un error al no encontrar una clase denominada erad PresetGradientPainter Al intentar preservar esta clase as como sus miembros del proceso de ofuscaci n la aplicaci n dejaba de funcionar Adem s aparecen tambi n errores debido a la no exclusi n del proceso de ofuscado de m todos y miembros de clases que implementen la interfaz Serializable Javaguard como se ha comentado anteriormente no proporciona opciones para solventar este problema Por tanto concluimos que Javaguard no es capaz de ofuscar el programa l gico y que ste siga funcionando como originalmente lo hac a la aplicaci n sin ofuscar Se asignar un 0 en la m trica correspondiente 3 3 4 JSHRINK Jshrink es una de las aplicaciones m s completas en cuanto a opciones que pueden tenerse en cuenta para el proceso de ofuscaci n Consultando su completo manual de usuario comprobamos que es compatible con serializaci n Reflection API calls m todos nativos etc Por tanto a priori no debemos tener problemas a la hora de ofuscar el programa l gico Jshrink proporciona la posibilidad de crear el script de configuraci n de for
182. zip 341 bytes Phttp www leesw com Yguard yguard 1 3 2 zip 146 bytes a a Zelix KlassMaster ZKMEval zip 1 032 bytes fhttp www zelix com klassmaster i http www geocities com CapeCanaveral Hall 2334 Pr CafeBabe CafeBabe sources zip 294 bytes Ograms cafebabe html es ptp ruwraaas Tabla 3 2 Detalles de descarga de aplicaciones Destacar que no hemos tenido problemas con la descarga de ninguna de las aplicaciones Para la descarga de algunas de las aplicaciones las comerciales tuvimos que registrarnos para poder recibir una versi n de evaluaci n 3 1 3 INSTALACI N Entorno Windows XP Ordenador Personal Pentium IV 2Ghz 512Mb RAM J2SDK1 4 2_07 Destacar que no tuvimos problemas a la hora de instalar todas las aplicaciones recopiladas Para la instalaci n de cada aplicaci n se siguieron los manuales de usuario facilitados en las p ginas web asociadas 30 rea de Ingenier a Telem tica Estudio y Prueba de una M trica para los Ofuscadores Java 3 2 PROCESADO El proceso de evaluaci n del comportamiento de los ofuscadores lo hemos denominado Procesado Esta evaluaci n se realizar en base a peque as aplicaciones que hemos dise ado de acuerdo a la m trica especificada en la secci n 2 6 1 Dise o de M trica de Ofuscaci n ejemplo 1 y 2 Recordemos que el ejemplo 1 trata de testear la efectividad de un ofuscador en lo referente a ofuscaci n de Estructura y Datos El ejemplo 2 hace lo propio
Download Pdf Manuals
Related Search
Related Contents
LCD COLOR TELEVISION ASSMANN Electronic AK-126007 SATA cable Zotac GeForce 8600 GTS 256Mb DVI GeForce 8600 GTS 操 作 方 法 les conditions de travail des ASEM "取扱説明書" Honeywell L4017 User's Manual Manuale Utente User Manual ARCLED338PIX JBL® ONBEAT XTREME™ Copyright © All rights reserved.
Failed to retrieve file