[功能] 支持 --std-output 参数输出到包名对应的完整路径
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
## 1.4.0
|
## 1.3.2
|
||||||
|
|
||||||
更新日志:
|
更新日志:
|
||||||
|
|
||||||
- todo
|
- [功能] 支持 `--std-output` 参数输出到包名对应的完整路径
|
||||||
|
|
||||||
感谢以下用户的贡献:
|
感谢以下用户的贡献:
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,6 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger.info("start class obfuscate");
|
logger.info("start class obfuscate");
|
||||||
Runner.run(path, config);
|
Runner.run(path, config, false, baseCmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class ClassObf {
|
|||||||
try {
|
try {
|
||||||
clean();
|
clean();
|
||||||
Manager.initConfig(this.config);
|
Manager.initConfig(this.config);
|
||||||
Runner.run(path, this.config);
|
Runner.run(path, this.config, true, null);
|
||||||
String fileName = FileUtil.getFileNameWithoutExt(path);
|
String fileName = FileUtil.getFileNameWithoutExt(path);
|
||||||
String newFile = fileName + "_obf.class";
|
String newFile = fileName + "_obf.class";
|
||||||
Path newFilePath = Paths.get(newFile);
|
Path newFilePath = Paths.get(newFile);
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ public class BaseCmd {
|
|||||||
private boolean generate;
|
private boolean generate;
|
||||||
@Parameter(names = {"-v", "--version"}, description = "version")
|
@Parameter(names = {"-v", "--version"}, description = "version")
|
||||||
private boolean version;
|
private boolean version;
|
||||||
|
@Parameter(names = {"--std-output"}, description = "standard output (export file to package dir)")
|
||||||
|
private boolean stdOutput;
|
||||||
|
|
||||||
public boolean isVersion() {
|
public boolean isVersion() {
|
||||||
return version;
|
return version;
|
||||||
@@ -44,4 +46,12 @@ public class BaseCmd {
|
|||||||
public void setConfig(String config) {
|
public void setConfig(String config) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isStdOutput() {
|
||||||
|
return stdOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStdOutput(boolean stdOutput) {
|
||||||
|
this.stdOutput = stdOutput;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,13 +5,16 @@ import me.n1ar4.clazz.obfuscator.base.ClassField;
|
|||||||
import me.n1ar4.clazz.obfuscator.base.ClassFileEntity;
|
import me.n1ar4.clazz.obfuscator.base.ClassFileEntity;
|
||||||
import me.n1ar4.clazz.obfuscator.base.ClassReference;
|
import me.n1ar4.clazz.obfuscator.base.ClassReference;
|
||||||
import me.n1ar4.clazz.obfuscator.base.MethodReference;
|
import me.n1ar4.clazz.obfuscator.base.MethodReference;
|
||||||
|
import me.n1ar4.clazz.obfuscator.config.BaseCmd;
|
||||||
import me.n1ar4.clazz.obfuscator.config.BaseConfig;
|
import me.n1ar4.clazz.obfuscator.config.BaseConfig;
|
||||||
import me.n1ar4.clazz.obfuscator.transform.*;
|
import me.n1ar4.clazz.obfuscator.transform.*;
|
||||||
|
import me.n1ar4.clazz.obfuscator.utils.ASMUtil;
|
||||||
import me.n1ar4.clazz.obfuscator.utils.ColorUtil;
|
import me.n1ar4.clazz.obfuscator.utils.ColorUtil;
|
||||||
import me.n1ar4.clazz.obfuscator.utils.FileUtil;
|
import me.n1ar4.clazz.obfuscator.utils.FileUtil;
|
||||||
import me.n1ar4.clazz.obfuscator.utils.NameUtil;
|
import me.n1ar4.clazz.obfuscator.utils.NameUtil;
|
||||||
import me.n1ar4.log.LogManager;
|
import me.n1ar4.log.LogManager;
|
||||||
import me.n1ar4.log.Logger;
|
import me.n1ar4.log.Logger;
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@@ -32,7 +35,7 @@ public class Runner {
|
|||||||
AnalyzeEnv.classFileList.add(cf);
|
AnalyzeEnv.classFileList.add(cf);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void run(Path path, BaseConfig config) {
|
public static void run(Path path, BaseConfig config, boolean isApi, BaseCmd cmd) {
|
||||||
ObfEnv.config = config;
|
ObfEnv.config = config;
|
||||||
if (!config.isQuiet()) {
|
if (!config.isQuiet()) {
|
||||||
// 输出配置信息
|
// 输出配置信息
|
||||||
@@ -243,16 +246,47 @@ public class Runner {
|
|||||||
System.out.println(
|
System.out.println(
|
||||||
ColorUtil.blue("###################### ALL OBFUSCATE FINISH ######################"));
|
ColorUtil.blue("###################### ALL OBFUSCATE FINISH ######################"));
|
||||||
}
|
}
|
||||||
|
boolean simpleOutput = cmd == null || !cmd.isStdOutput();
|
||||||
|
if (isApi || simpleOutput) {
|
||||||
|
try {
|
||||||
|
Files.write(Paths.get(newFile), Files.readAllBytes(Const.TEMP_PATH));
|
||||||
|
logger.info("class obfuscate finish and write new class file");
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Files.delete(Const.TEMP_PATH);
|
||||||
|
logger.info("class obfuscate finish and delete temp file");
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 标准输出
|
||||||
|
try {
|
||||||
|
byte[] result = Files.readAllBytes(Const.TEMP_PATH);
|
||||||
|
ClassReader classReader = new ClassReader(result);
|
||||||
|
String packageName = ASMUtil.getPackageName(classReader);
|
||||||
|
String className = ASMUtil.getClassName(classReader);
|
||||||
|
|
||||||
try {
|
Path baseDir = Files.createDirectory(Paths.get("class-obf-output"));
|
||||||
Files.write(Paths.get(newFile), Files.readAllBytes(Const.TEMP_PATH));
|
|
||||||
logger.info("class obfuscate finish and write new class file");
|
if (!packageName.contains(".")) {
|
||||||
} catch (Exception ignored) {
|
Path packDir = Files.createDirectory(baseDir.resolve(packageName));
|
||||||
}
|
Path classFile = packDir.resolve(String.format("%s.class", className));
|
||||||
try {
|
Files.write(classFile, result);
|
||||||
Files.delete(Const.TEMP_PATH);
|
}
|
||||||
logger.info("class obfuscate finish and delete temp file");
|
|
||||||
} catch (Exception ignored) {
|
String[] dirs = packageName.split("\\.");
|
||||||
|
Path packDir = baseDir;
|
||||||
|
for (String dir : dirs) {
|
||||||
|
packDir = Files.createDirectory(packDir.resolve(dir));
|
||||||
|
}
|
||||||
|
Path classFile = packDir.resolve(String.format("%s.class", className));
|
||||||
|
Files.write(classFile, result);
|
||||||
|
logger.info("create dir {} and class {} finish", packageName, className);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("create class output error: {}", ex.getMessage());
|
||||||
|
logger.info("please delete the class-obf-output dir");
|
||||||
|
logger.info("可能是目标文件或目录已存在:请删除 class-obf-output 目录");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
src/main/java/me/n1ar4/clazz/obfuscator/utils/ASMUtil.java
Normal file
24
src/main/java/me/n1ar4/clazz/obfuscator/utils/ASMUtil.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package me.n1ar4.clazz.obfuscator.utils;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
|
||||||
|
public class ASMUtil {
|
||||||
|
public static String getClassName(ClassReader classReader) {
|
||||||
|
String className = classReader.getClassName();
|
||||||
|
int lastSlashIndex = className.lastIndexOf('/');
|
||||||
|
if (lastSlashIndex != -1) {
|
||||||
|
return className.substring(lastSlashIndex+1)
|
||||||
|
.replace('/', '.');
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getPackageName(ClassReader classReader) {
|
||||||
|
String className = classReader.getClassName();
|
||||||
|
int lastSlashIndex = className.lastIndexOf('/');
|
||||||
|
if (lastSlashIndex != -1) {
|
||||||
|
return className.substring(0, lastSlashIndex).replace('/', '.');
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user