2016-11-22 2 views
2

Ich versuche ProGuard zu verwenden, um meinen Code zu verschleiern, und benutze dann den ausgegebenen Code, um die benötigten Abhängigkeiten in das JAR einzufügen.ProGuard Obfscation und Shadow Abhängigkeiten

Derzeit bekomme ich einfach eine -obf JAR und eine -all JAR. Was ich brauche, ist ein -all JAR mit verschleiertem Code.

import proguard.gradle.ProGuardTask 

apply plugin: 'com.github.johnrengelman.shadow' 
apply plugin: 'java' 

buildscript { 
    repositories { 
    mavenCentral() 
    jcenter() 
    } 

    dependencies { 
    classpath group: 'net.sf.proguard', name: 'proguard-gradle', version: '5.3.1' 
    classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: '1.2.4' 
    } 
} 

repositories { 
    mavenCentral() 
    jcenter() 
} 

jar { 
    manifest { attributes("Main-Class": "com.skcraft.launcher.Launcher") } 
} 

dependencies { 
    compile 'org.projectlombok:lombok:1.12.2' 
    compile 'com.fasterxml.jackson.core:jackson-databind:2.3.0' 
    compile 'commons-lang:commons-lang:2.6' 
    compile 'commons-io:commons-io:1.2' 
    compile 'com.google.guava:guava:15.0' 
    compile 'com.beust:jcommander:1.32' 
    compile 'com.miglayout:miglayout:3.7.4' 
    compile 'com.google.code.findbugs:jsr305:3.0.0' 
    compile files ('libs/javax-crypto.jar') 
} 

processResources { 
    filesMatching('**/*.properties') { 
    filter { 
     it.replace('${project.version}', project.version) 
    } 
    } 
} 

task obfuscate(type: proguard.gradle.ProGuardTask) { 
    configuration '../proguard.txt' 

    injars jar 
    outjars "${buildDir}/libs/launcher-${version}-obf.jar" 

    libraryjars files(configurations.compile.collect()) 
} 

shadowJar { 
    dependencies { 
    exclude(dependency('org.projectlombok:lombok')) 
    } 
} 

build.dependsOn(obfuscate) 
build.dependsOn(shadowJar) 

task wrapper(type: Wrapper) { gradleVersion = "3.1" } 

Irgendwelche Ideen? Eine Idee, die ich mit der shadowJar kam und dann verschleiern, aber ich muss meine proguard.txt konfigurieren, nur um meinen Code zu verschleiern. Ich habe versucht, dies unten zu tun, aber es immer noch versucht, alle Pakete zu verschleiern, werfen Fehler:

# Include java runtime classes 
-libraryjars <java.home>/lib/rt.jar 

# Output a source map file 
-printmapping proguard.map 

# Keep filenames and line numbers 
-keepattributes SourceFile, LineNumberTable 

# Disable certain proguard optimizations which remove stackframes (same as Android defaults) 
-optimizations !method/inlining/* 

-keep public class * { 
    public protected *; 
} 

-keepclassmembernames class * { 
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class !com.skcraft.** { *; } 

Vielen Dank im Voraus

Antwort

1

Ich fand es heraus, dachte ich würde die Lösung hier posten.

die Schatten Aufgabe verwenden, konnte ich die Datei ich es aus lesen wollte angeben:

shadowJar { 
from file("${buildDir}/libs/launcher-${version}-obf.jar") 
dependencies { 
    exclude(dependency('org.projectlombok:lombok')) 
} 
} 

Dank!

+0

ID arbeitete nicht für mich. Ich machte zunächst ein verschleiertes dünnes Glas und übertrug es als Parameter im Schattenglas. Aber das erzeugte Glas hatte keinen verschleierten Code. haben Sie überprüft, ob es für Sie funktionierte, indem Sie das Fettglas dekompilieren? – wizneel

1

Sie müssen die folgende Regel entfernen:

-keep public class * { 
    public protected *; 
} 

Diese Regel behält implizit alles außer Ihrem eigenen Code bei:

Es verwendet a n Ausschlussmuster (!), das die Regel beendet, was bedeutet, dass alles andere, das nicht mit dem Muster übereinstimmt, beibehalten wird.

+0

Hat nicht funktioniert, es hat immer noch versucht, alle Dateien zu ändern, Fehler zu werfen. –

+0

Entschuldigung, ich habe Ihr Problem missverstanden. Sie haben in Ihrer Verschleierungstask Folgendes: 'libraryjars files (configurations.compile.collect())', während es in inars geändert werden sollte, wenn Sie alle Abhängigkeiten in einem einzigen Uber-Jar mit ProGuard sammeln wollen. Darüber hinaus muss dieses injars oberhalb der Outjars sein, um richtig zu arbeiten. –

+0

Sie sind immer noch falsch verstanden. Ich bin bereits in der Lage, ein JAR mit allen Abhängigkeiten darin zu übergeben, ich muss meine proguard Konfiguration so ändern, dass es alles außer meinem Code vollständig ignoriert - im Paket 'com.skcraft' –