Spring Загрузочный обфускатор
Я использую Spring Boot with bootRepackage gradle для создания файла jar release. Мой проект нуждается в коде обфускатора перед доставкой клиенту. Я пробовал proguard и некоторые другие инструменты, но многие проблемы возникают. Могу ли я получить совет по настройке таких инструментов для загрузки Spring.
Я попробовал ProGuard с этими config
-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
Но сгенерированный jar can not run
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)
Ответы
Ответ 1
Это говорит вам о проблеме. Он сжимает встроенные JAR файлы, которые не разрешены. Вам нужно заставить его пропустить сжатие дочерних элементов. Вероятно, лучше всего вообще пропустить компрессию.
Действительно, вы могли бы просто пропустить все это, так как это немного усложняет процесс реверсирования, но не останавливает его. Если вам действительно нужно хранить это в секрете, то ваш единственный реальный выбор - продать свое приложение как услугу, а не предоставлять JAR, WAR, EAR и т.д.
IllegalStateException: не удается открыть вложенную запись 'lib/spring -boot-starter-web-1.2.0.RELEASE.jar'. Он сжат, и вложенные файлы jar должны быть сохранены без сжатия. Пожалуйста, проверьте механизм, используемый для создания исполняемого файла jar
Ответ 2
Это можно сделать, переупаковка несжатой библиотеки. Это можно сделать с помощью инструмента jar со следующим bash script. script просто должен быть выполнен в основной директории проектов.
# 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
Вероятно, вам нужно сделать это снова, если больше файлов нуждается в этой специальной обработке. Одна из библиотек, которые делают это, например, кварц.