form - spring tld example
Ofuscador de botas de primavera (2)
Esto se puede hacer volviendo a empaquetar la biblioteca sin comprimir. Esto se puede hacer usando la herramienta jar con la siguiente secuencia de comandos bash. El script simplemente tiene que ser ejecutado en el directorio principal de proyectos.
# some constant settings we use
work_dir=work
uncompress_dir=uncompress
library_dir=lib
# parameters for input and output files
# the name of the library that should be uncompressed
library_name="spring-boot-starter-web-1.2.0.RELEASE.jar"
# the obfuscated artifact
original_jar=''webservice-obs-1.0.jar''
# the new obfuscated artifact (can be the same)
repacked_jar=''webservice-obs-repack-1.0.jar''
# build the obfuscated library
mvn clean package -Dobfuscation
# create working directory and copy obfuscated artifact
mkdir target/$work_dir
cp target/$original_jar target/$work_dir
cd target/$work_dir
# extract contents of obfuscated artifact
jar xvf $original_jar
rm $original_jar
# uncompress the target library and jar again without compression (c0)
mkdir $uncompress_dir
mv $library_dir/$library_name $uncompress_dir
cd $uncompress_dir
jar xvf $library_name
rm $library_name
jar c0mf ./META-INF/MANIFEST.MF $library_name *
mv $library_name ../$library_dir
cd ..
rm -r $uncompress_dir
# jar the complete obfuscated artifact again
# it is important here to copy the manifest as otherwise the library would not be executeable any more by spring-boot
jar c0mf ./META-INF/MANIFEST.MF ../$repacked_jar *
# cleanup work dir
cd ..
rm -r $work_dir
Probablemente tengas que hacer esto de nuevo si más archivos necesitan este manejo especial. Una de las bibliotecas que hacen esto es, por ejemplo, el cuarzo.
Estoy usando Spring Boot con bootRepackage gradle para compilar el archivo jar de lanzamiento. Mi proyecto necesita un código ofuscador antes de entregarlo al cliente. Intenté proguard y alguna otra herramienta pero ocurren muchos problemas. ¿Puedo tener consejos sobre cómo configurar estas herramientas para el arranque de primavera.
Probé ProGuard con estas configuraciones.
-injars ./build/libs/webservice-1.0.jar
-outjars ./build/libs/webservice-obs-1.0.jar
-libraryjars <java.home>/lib/rt.jar
-keep class !myapplicationpackage.** { *; }
-keep class myapplicationpackage.Application { *; }
-ignorewarnings
-keepdirectories **
-dontshrink
-keepattributes *Annotation*
-keepclassmembers class com.yumyumlabs.** { java.lang.Long id; }
-keepnames class com.yumyumlabs.** implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Qualifier *;
@org.springframework.beans.factory.annotation.Value *;
@org.springframework.beans.factory.annotation.Required *;
@org.springframework.context.annotation.Bean *;
@javax.annotation.PostConstruct *;
@javax.annotation.PreDestroy *;
@org.aspectj.lang.annotation.AfterReturning *;
@org.aspectj.lang.annotation.Pointcut *;
@org.aspectj.lang.annotation.AfterThrowing *;
@org.aspectj.lang.annotation.Around *;
}
-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Controller class *
-keep @org.springframework.stereotype.Component class *
-keep @org.springframework.stereotype.Repository class *
-keep @org.springframework.cache.annotation.EnableCaching class *
-keep @org.springframework.context.annotation.Configuration class *
-keepattributes Signature
-dontwarn com.yumyumlabs.web.controllers.auth.AuthController
-dontwarn com.google.apphosting.api.ReflectionUtils
-dontwarn sun.misc.Unsafe
-dontwarn org.tartarus.snowball.**
-dontnote
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
Pero el tarro generado no puede correr
java.lang.IllegalStateException: Unable to open nested entry ''lib/spring-boot-starter-web-1.2.0.RELEASE.jar''. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(Unknown Source)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(Unknown Source)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(Unknown Source)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(Unknown Source)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(Unknown Source)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(Unknown Source)
at org.springframework.boot.loader.Launcher.launch(Unknown Source)
at org.springframework.boot.loader.JarLauncher.main(Unknown Source)
Te está diciendo el problema. Está comprimiendo los archivos JAR incrustados que no está permitido. Necesitas conseguir que se omita la compresión de elementos secundarios. Probablemente sea mejor saltarse la compresión por completo.
En realidad, podría omitirlo todo, ya que esto dificulta un poco la ingeniería inversa, pero no lo detiene. Si realmente necesita mantenerlo en secreto, entonces su única opción real es vender su aplicación como servicio en lugar de proporcionar un JAR, WAR, EAR, etc.
IllegalStateException: no se puede abrir la entrada anidada ''lib / spring-boot-starter-web-1.2.0.RELEASE.jar''. Se ha comprimido y los archivos jar anidados deben almacenarse sin compresión. Por favor, compruebe el mecanismo utilizado para crear su archivo jar ejecutable