From e4f6aa6d07deaa8b74c76a4a3676379dc8634244 Mon Sep 17 00:00:00 2001 From: 4ra1n <2023503307@qq.com> Date: Mon, 22 Apr 2024 16:06:59 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=AE=80=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- .idea/.gitignore | 8 - .idea/encodings.xml | 7 - .idea/inspectionProfiles/Project_Default.xml | 5 - .idea/misc.xml | 13 -- .idea/uiDesigner.xml | 124 ------------- .idea/vcs.xml | 6 - README.md | 6 +- check-version.bat | 2 + dependency-reduced-pom.xml | 36 ---- .../001.png | Bin .../002.png | Bin .../003.png | Bin pom.xml | 134 ++++++++++++-- src/main/java/me/n1ar4/log/Log.java | 49 ++++++ src/main/java/me/n1ar4/log/LogLevel.java | 8 + src/main/java/me/n1ar4/log/LogManager.java | 13 ++ src/main/java/me/n1ar4/log/LogUtil.java | 26 +++ src/main/java/me/n1ar4/log/Logger.java | 57 ++++++ src/main/java/me/n1ar4/log/LoggingStream.java | 46 +++++ src/main/java/org/vidar/Main.java | 166 ++++++++++++++++++ src/main/java/org/vidar/Obfer.java | 164 ----------------- 22 files changed, 487 insertions(+), 386 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml create mode 100644 check-version.bat delete mode 100644 dependency-reduced-pom.xml rename "images/\346\210\252\345\261\2172023-09-14 14.37.03.png" => images/001.png (100%) rename "images/\346\210\252\345\261\2172023-09-14 14.40.54.png" => images/002.png (100%) rename "images/\346\210\252\345\261\2172023-09-14 14.41.46.png" => images/003.png (100%) create mode 100644 src/main/java/me/n1ar4/log/Log.java create mode 100644 src/main/java/me/n1ar4/log/LogLevel.java create mode 100644 src/main/java/me/n1ar4/log/LogManager.java create mode 100644 src/main/java/me/n1ar4/log/LogUtil.java create mode 100644 src/main/java/me/n1ar4/log/Logger.java create mode 100644 src/main/java/me/n1ar4/log/LoggingStream.java create mode 100644 src/main/java/org/vidar/Main.java delete mode 100644 src/main/java/org/vidar/Obfer.java diff --git a/.gitignore b/.gitignore index d2d60bc..d05c64c 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ build/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store +idea/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffa..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 8d66637..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 77b8337..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 54149f4..2042a72 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ java -jar JSource-Obfuscator-1.0-SNAPSHOT.jar --path /Users/1ue/Downloads/obf-te 使用JSource-Obfuscator加密如下示例代码 -![截屏2023-09-14 14.37.03](images/%E6%88%AA%E5%B1%8F2023-09-14%2014.37.03.png) +![](images/001.png) ``` % java -jar JSource-Obfuscator-1.0-SNAPSHOT.jar --path /Users/zhchen/Downloads/obf-test/src/main/java @@ -43,10 +43,10 @@ finished!!! 混淆后的代码大致如下 -![截屏2023-09-14 14.40.54](images/%E6%88%AA%E5%B1%8F2023-09-14%2014.40.54.png) +![](images/002.png) 并且正常运行 -![截屏2023-09-14 14.41.46](images/%E6%88%AA%E5%B1%8F2023-09-14%2014.41.46.png) +![](images/003.png) diff --git a/check-version.bat b/check-version.bat new file mode 100644 index 0000000..7e234ee --- /dev/null +++ b/check-version.bat @@ -0,0 +1,2 @@ +@echo off +mvn versions:display-dependency-updates \ No newline at end of file diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml deleted file mode 100644 index 4fcdc2b..0000000 --- a/dependency-reduced-pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - org.vidar - JSource-Obfuscator - 1.0-SNAPSHOT - - - - maven-shade-plugin - 3.2.4 - - - package - - shade - - - - - org.vidar.Obfer - - - - - - - - - - - UTF-8 - 8 - 8 - - diff --git "a/images/\346\210\252\345\261\2172023-09-14 14.37.03.png" b/images/001.png similarity index 100% rename from "images/\346\210\252\345\261\2172023-09-14 14.37.03.png" rename to images/001.png diff --git "a/images/\346\210\252\345\261\2172023-09-14 14.40.54.png" b/images/002.png similarity index 100% rename from "images/\346\210\252\345\261\2172023-09-14 14.40.54.png" rename to images/002.png diff --git "a/images/\346\210\252\345\261\2172023-09-14 14.41.46.png" b/images/003.png similarity index 100% rename from "images/\346\210\252\345\261\2172023-09-14 14.41.46.png" rename to images/003.png diff --git a/pom.xml b/pom.xml index f4031f5..10f5b8e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,65 +5,161 @@ 4.0.0 org.vidar - JSource-Obfuscator + JSO 1.0-SNAPSHOT + jar + Java Source Obfuscate Project + + + + 1ue + https://github.com/luelueking + + + 4ra1n + https://github.com/4ra1n + + + + + 3.25.5 + 5.0.4 + 3.12.0 + + + 3.3.1 + + 3.7.1 + + 3.13.0 + + 2.16.2 + 8 8 + UTF-8 + + org.vidar.Main com.github.javaparser javaparser-core - 3.25.5 + ${java.parser.version} - com.github.javaparser javaparser-symbol-solver-core - 3.25.5 + ${java.parser.version} - org.apache.commons commons-lang3 - 3.12.0 + ${commons.lang.version} - net.sf.jopt-simple jopt-simple - 5.0.4 + ${jopt.version} + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven.resources.version} + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.version} + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.version} + + + org.codehaus.mojo + versions-maven-plugin + ${maven.versions.version} + + + - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 + org.codehaus.mojo + versions-maven-plugin + + + + regex + (.+-SNAPSHOT|.+-M\d) + + + regex + .+-(alpha|beta).* + + + regex + .*\.android.* + + + regex + .*\-RC.* + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + org.apache.maven.plugins + maven-assembly-plugin + build + + false + true + + jar-with-dependencies + + + + ${main.name} + + + true + + + package - shade + single - - - - org.vidar.Obfer - - - + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + \ No newline at end of file diff --git a/src/main/java/me/n1ar4/log/Log.java b/src/main/java/me/n1ar4/log/Log.java new file mode 100644 index 0000000..c7b66f2 --- /dev/null +++ b/src/main/java/me/n1ar4/log/Log.java @@ -0,0 +1,49 @@ +package me.n1ar4.log; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +class Log { + static final String ANSI_RESET = "\u001B[0m"; + static final String ANSI_GREEN = "\u001B[32m"; + static final String ANSI_YELLOW = "\u001B[33m"; + static final String ANSI_RED = "\u001B[31m"; + static final String ANSI_BLUE = "\u001B[34m"; + + static void info(String message) { + log(LogLevel.INFO, message, ANSI_GREEN); + } + + static void error(String message) { + log(LogLevel.ERROR, message, ANSI_RED); + } + + static void debug(String message) { + log(LogLevel.DEBUG, message, ANSI_BLUE); + } + + static void warn(String message) { + log(LogLevel.WARN, message, ANSI_YELLOW); + } + + static void log(LogLevel level, String message, String color) { + if (level.compareTo(LogManager.logLevel) >= 0) { + String timestamp = LocalDateTime.now().format( + DateTimeFormatter.ofPattern("HH:mm:ss")); + String className = LogUtil.getClassName(); + String methodName = LogUtil.getMethodName(); + String lineNumber = LogUtil.getLineNumber(); + String logMessage; + if (!lineNumber.equals("-1")) { + logMessage = String.format("[%s] [%s%s%s] [%s:%s:%s] %s", + timestamp, color, level.name(), ANSI_RESET, className, + methodName, lineNumber, message); + } else { + logMessage = String.format("[%s] [%s%s%s] [%s:%s] %s", + timestamp, color, level.name(), ANSI_RESET, className, + methodName, message); + } + System.out.println(logMessage); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/n1ar4/log/LogLevel.java b/src/main/java/me/n1ar4/log/LogLevel.java new file mode 100644 index 0000000..f70505c --- /dev/null +++ b/src/main/java/me/n1ar4/log/LogLevel.java @@ -0,0 +1,8 @@ +package me.n1ar4.log; + +public enum LogLevel { + DEBUG, + INFO, + WARN, + ERROR, +} \ No newline at end of file diff --git a/src/main/java/me/n1ar4/log/LogManager.java b/src/main/java/me/n1ar4/log/LogManager.java new file mode 100644 index 0000000..a4d78bf --- /dev/null +++ b/src/main/java/me/n1ar4/log/LogManager.java @@ -0,0 +1,13 @@ +package me.n1ar4.log; + +public class LogManager { + static LogLevel logLevel = LogLevel.INFO; + + public static void setLevel(LogLevel level) { + logLevel = level; + } + + public static Logger getLogger() { + return new Logger(); + } +} diff --git a/src/main/java/me/n1ar4/log/LogUtil.java b/src/main/java/me/n1ar4/log/LogUtil.java new file mode 100644 index 0000000..d5c3106 --- /dev/null +++ b/src/main/java/me/n1ar4/log/LogUtil.java @@ -0,0 +1,26 @@ +package me.n1ar4.log; + +public class LogUtil { + private static final int STACK_TRACE_INDEX = 5; + + public static String getClassName() { + String fullClassName = Thread.currentThread() + .getStackTrace()[STACK_TRACE_INDEX].getClassName(); + int lastDotIndex = fullClassName.lastIndexOf('.'); + if (lastDotIndex != -1) { + return fullClassName.substring(lastDotIndex + 1); + } else { + return fullClassName; + } + } + + public static String getMethodName() { + return Thread.currentThread() + .getStackTrace()[STACK_TRACE_INDEX].getMethodName(); + } + + public static String getLineNumber() { + return String.valueOf(Thread.currentThread() + .getStackTrace()[STACK_TRACE_INDEX].getLineNumber()); + } +} diff --git a/src/main/java/me/n1ar4/log/Logger.java b/src/main/java/me/n1ar4/log/Logger.java new file mode 100644 index 0000000..d834101 --- /dev/null +++ b/src/main/java/me/n1ar4/log/Logger.java @@ -0,0 +1,57 @@ +package me.n1ar4.log; + +@SuppressWarnings("all") +public class Logger { + private String formatMessage(String message, Object[] args) { + int start = 0; + StringBuilder sb = new StringBuilder(); + int argIndex = 0; + while (start < message.length()) { + int open = message.indexOf("{}", start); + if (open == -1) { + sb.append(message.substring(start)); + break; + } + sb.append(message.substring(start, open)); + if (argIndex < args.length) { + sb.append(args[argIndex++]); + } else { + sb.append("{}"); + } + start = open + 2; + } + return sb.toString(); + } + + public void info(String message) { + Log.info(message); + } + + public void info(String message, Object... args) { + Log.info(formatMessage(message, args)); + } + + public void error(String message) { + Log.error(message); + } + + public void error(String message, Object... args) { + Log.error(formatMessage(message, args)); + } + + public void debug(String message) { + Log.debug(message); + } + + public void debug(String message, Object... args) { + Log.debug(formatMessage(message, args)); + } + + public void warn(String message) { + Log.warn(message); + } + + public void warn(String message, Object... args) { + Log.warn(formatMessage(message, args)); + } +} diff --git a/src/main/java/me/n1ar4/log/LoggingStream.java b/src/main/java/me/n1ar4/log/LoggingStream.java new file mode 100644 index 0000000..d766737 --- /dev/null +++ b/src/main/java/me/n1ar4/log/LoggingStream.java @@ -0,0 +1,46 @@ +package me.n1ar4.log; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +public class LoggingStream extends PrintStream { + private final Logger logger; + private final OutputStream originalOut; + + public LoggingStream(OutputStream out, Logger logger) { + super(out); + this.logger = logger; + this.originalOut = out; + } + + @Override + public void println(String x) { + if (!isLoggerCall()) { + logger.info(x); + } else { + directPrintln(x); + } + } + + private boolean isLoggerCall() { + for (StackTraceElement element : Thread.currentThread().getStackTrace()) { + if (element.getClassName().equals("me.n1ar4.log.Logger")) { + return true; + } + } + return false; + } + + private void directPrintln(String x) { + synchronized (this) { + byte[] bytes = (x + System.lineSeparator()).getBytes(); + try { + originalOut.write(bytes); + originalOut.flush(); + } catch (IOException e) { + setError(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/org/vidar/Main.java b/src/main/java/org/vidar/Main.java new file mode 100644 index 0000000..5efd15e --- /dev/null +++ b/src/main/java/org/vidar/Main.java @@ -0,0 +1,166 @@ +package org.vidar; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.PackageDeclaration; +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import me.n1ar4.log.LogLevel; +import me.n1ar4.log.LogManager; +import me.n1ar4.log.Logger; +import org.vidar.transform.Transformer; +import org.vidar.transform.impl.*; +import org.vidar.utils.FileUtil; +import org.vidar.utils.NameUtil; +import org.vidar.utils.TransformUtil; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; +import java.util.stream.Stream; + +public class Main { + private static final Logger logger = LogManager.getLogger(); + private static final Transformer clzRenamer; + private static final Transformer clzRefRenamer; + private static final MethodRenamer methodRenamer; + private static final Transformer> methodRefRenamer; + private static final Transformer fieldRenamer; + private static final Transformer stringEncryptor; + + static { + clzRenamer = new ClzRenamer(); + clzRefRenamer = new ClzRefRenamer(); + methodRenamer = new MethodRenamer(); + methodRefRenamer = new MethodRefRenamer(); + fieldRenamer = new FieldRenamer(); + stringEncryptor = new StringEncrypter(); + } + + public static void main(String[] args) { + LogManager.setLevel(LogLevel.INFO); + printLogoAndUsage(); + OptionParser parser = new OptionParser(); + parser.accepts("path").withRequiredArg().required(); + parser.accepts("obfMethod").withOptionalArg(); + OptionSet options = parser.parse(args); + String sourcePath = (String) options.valueOf("path"); + Path sPath = Paths.get(sourcePath); + + Stream files; + try { + files = Files.walk(sPath); + } catch (Exception ex) { + logger.error("file walk error: {}", ex.toString()); + return; + } + + logger.info("start obfuscate class name"); + + files.filter(p -> p.toString().endsWith(".java")).forEach(p -> { + FileInputStream fis = FileUtil.getFileInputStream(p); + CompilationUnit cu = TransformUtil.getCompilationUnit(fis); + String oldClzName = TransformUtil.getClzNameByPath(p); + String oldPkgName = cu.getPackageDeclaration().orElse(new PackageDeclaration()).getNameAsString(); + String newClzName = NameUtil.generateClassName("1ue"); + clzRenamer.transform(cu, newClzName); + fieldRenamer.transform(cu, newClzName); + String path = p.toFile().getParent(); + FileUtil.saveModifiedFile(cu, new File(path + "/" + newClzName + ".java")); + FileUtil.deleteFile(p.toFile()); + changeClzUsage(sPath, oldPkgName, oldPkgName, oldClzName, newClzName); + }); + files.close(); + + boolean obfMethod = !options.has("obfMethod") || + (boolean) options.valueOf("obfMethod"); + if (obfMethod) { + changeMethodName(sPath); + changeMethodUsage(sPath, methodRenamer.getMethodNameMap()); + } + + logger.info("start obfuscate strings"); + + try { + files = Files.walk(sPath); + } catch (Exception ex) { + logger.error("file walk error: {}", ex.toString()); + return; + } + + files.filter(p -> p.toString().endsWith(".java")).forEach(p -> { + FileInputStream fis = FileUtil.getFileInputStream(p); + CompilationUnit cu = TransformUtil.getCompilationUnit(fis); + stringEncryptor.transform(cu, null); + FileUtil.saveModifiedFile(cu, p.toFile()); + }); + files.close(); + + logger.info("finished"); + } + + private static void changeMethodName(Path sourcePath) { + System.out.println("start obfuscate method name"); + Stream files; + try { + files = Files.walk(sourcePath); + } catch (Exception ex) { + logger.error("file walk error: {}", ex.toString()); + return; + } + files.filter(p -> p.toString().endsWith(".java")).forEach(p -> { + FileInputStream fis = FileUtil.getFileInputStream(p); + CompilationUnit cu = TransformUtil.getCompilationUnit(fis); + methodRenamer.transform(cu, null); + FileUtil.saveModifiedFile(cu, p.toFile()); + }); + files.close(); + } + + private static void changeClzUsage(Path sourcePath, String oldPkgName, String newPkgName, String oldClzName, String newClzName) { + Stream files; + try { + files = Files.walk(sourcePath); + } catch (Exception ex) { + logger.error("file walk error: {}", ex.toString()); + return; + } + files.filter(p -> p.toString().endsWith(".java")).forEach(p -> { + FileInputStream fis = FileUtil.getFileInputStream(p); + CompilationUnit cu = TransformUtil.getCompilationUnit(fis); + clzRefRenamer.transform(cu, new String[]{oldClzName, newClzName}); + TransformUtil.changeImport(cu, oldPkgName + "." + oldClzName, newPkgName + "." + newClzName); + FileUtil.saveModifiedFile(cu, p.toFile()); + }); + files.close(); + } + + private static void changeMethodUsage(Path sourcePath, Map needChange) { + Stream files; + try { + files = Files.walk(sourcePath); + } catch (Exception ex) { + logger.error("file walk error: {}", ex.toString()); + return; + } + files.filter(p -> p.toString().endsWith(".java")).forEach(p -> { + FileInputStream fis = FileUtil.getFileInputStream(p); + CompilationUnit cu = TransformUtil.getCompilationUnit(fis); + methodRefRenamer.transform(cu, needChange); + FileUtil.saveModifiedFile(cu, p.toFile()); + }); + files.close(); + } + + private static void printLogoAndUsage() { + System.out.println( + " ╦╔═╗┌─┐┬ ┬┬─┐┌─┐┌─┐ ╔═╗┌┐ ┌─┐\n" + + " ║╚═╗│ ││ │├┬┘│ ├┤───║ ║├┴┐├┤ \n" + + "╚╝╚═╝└─┘└─┘┴└─└─┘└─┘ ╚═╝└─┘└ "); + System.out.println(); + System.out.println("usage: --path [java-source-dir] --obfMethod=true [method-name-obfuscate]"); + System.out.println(); + } +} diff --git a/src/main/java/org/vidar/Obfer.java b/src/main/java/org/vidar/Obfer.java deleted file mode 100644 index 5651cc5..0000000 --- a/src/main/java/org/vidar/Obfer.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.vidar; - -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.PackageDeclaration; -import joptsimple.OptionParser; -import joptsimple.OptionSet; -import org.vidar.transform.Transformer; -import org.vidar.transform.impl.*; -import org.vidar.utils.FileUtil; -import org.vidar.utils.NameUtil; -import org.vidar.utils.TransformUtil; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Map; - -/** - * 启动器 - */ -public class Obfer { - private static Transformer clzRenamer = null; - private static Transformer clzRefRenamer = null; - private static MethodRenamer methodRenamer = null; - private static Transformer methodRefRenamer = null; - private static Transformer fieldRenamer = null; - - private static Transformer stringEncrypter = null; - - static { - clzRenamer = new ClzRenamer(); - clzRefRenamer = new ClzRefRenamer(); - methodRenamer = new MethodRenamer(); - methodRefRenamer = new MethodRefRenamer(); - fieldRenamer = new FieldRenamer(); - stringEncrypter = new StringEncrypter(); - } - - public static void main(String[] args) throws IOException { - printLogoAndUsage(); - // 解析启动参数 - OptionParser parser = new OptionParser(); - parser.accepts("path").withRequiredArg().required(); - parser.accepts("obfMethod").withOptionalArg(); -// parser.accepts("path").withOptionalArg(); - OptionSet options = parser.parse(args); - - String sourcePath = options.has("path") ? (String) options.valueOf("path") : "/Users/zhchen/Downloads/chatin/XpocGUI/src/main/java"; - - System.out.println("begin obfucate class name..."); - // 预处理,遍历目录中的所有Java文件 - Files.walk(Paths.get(sourcePath)).filter(p -> p.toString().endsWith(".java")).forEach(p -> { - FileInputStream fis = FileUtil.getFileInputStream(p); - CompilationUnit cu = TransformUtil.getCompilationUnit(fis); - - // 1.1 混淆类名 - String oldClzName = TransformUtil.getClzNameByPath(p); - String oldPkgName = cu.getPackageDeclaration().orElse(new PackageDeclaration()).getNameAsString(); - // 指定唯一包名,生成全局唯一className,TODO 改善,暂时不修改包名 - String newClzName = NameUtil.generateClassName("1ue"); - clzRenamer.transform(cu, newClzName); - - // 3 混淆字段名 - fieldRenamer.transform(cu,newClzName); - - // 保存文件 - String path = p.toFile().getParent(); - FileUtil.saveModifiedFile(cu, new File(path + "/" + newClzName + ".java")); - FileUtil.deleteFile(p.toFile()); - - // 1.2 混淆类名后,需修改引用类的地方 - changeClzUsage(sourcePath, oldPkgName, oldPkgName, oldClzName, newClzName); - - }); - boolean obfMethod = options.has("obfMethod") ? (boolean) options.valueOf("obfMethod") : true; - if (obfMethod) { - // 2.1 混淆方法名 - changeMethodName(sourcePath); - // 2.2 混淆方法后,需修改用到方法的地方 - changeMethodUsage(sourcePath,methodRenamer.getMethodNameMap()); - } - - System.out.println("begin obfucate strings..."); - - // 混淆字符串 - // TODO 注解中字符混淆 - Files.walk(Paths.get(sourcePath)).filter(p -> p.toString().endsWith(".java")).forEach(p -> { - FileInputStream fis = FileUtil.getFileInputStream(p); - CompilationUnit cu = TransformUtil.getCompilationUnit(fis); - stringEncrypter.transform(cu,null); - FileUtil.saveModifiedFile(cu,p.toFile()); - }); - - System.out.println("finished!!!"); - - } - - private static void changeMethodName(String sourcePath) { - System.out.println("begin obfucate method name..."); - try { - // 遍历目录中的所有Java文件 - Files.walk(Paths.get(sourcePath)).filter(p -> p.toString().endsWith(".java")).forEach(p -> { - - FileInputStream fis = FileUtil.getFileInputStream(p); - CompilationUnit cu = TransformUtil.getCompilationUnit(fis); - // 修改引用的方法 - methodRenamer.transform(cu,null); - // 保存修改后的源代码 - FileUtil.saveModifiedFile(cu, p.toFile()); - }); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static void changeClzUsage(String sourcePath, String oldPkgName, String newPkgName, String oldClzName, String newClzName) { - try { - Files.walk(Paths.get(sourcePath)).filter(p -> p.toString().endsWith(".java")).forEach(p -> { - FileInputStream fis = FileUtil.getFileInputStream(p); - CompilationUnit cu = TransformUtil.getCompilationUnit(fis); - clzRefRenamer.transform(cu, new String[]{oldClzName, newClzName}); - - // 修改旧的import为新的import - TransformUtil.changeImport(cu, oldPkgName + "." + oldClzName, newPkgName + "." + newClzName); - // 保存修改后的源代码 - FileUtil.saveModifiedFile(cu, p.toFile()); - }); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void changeMethodUsage(String sourcePath, Map needChange) { -// System.out.println("the method need to Change:"); -// needChange.keySet().forEach(System.out::println); -// System.out.println("========================="); - try { - // 遍历目录中的所有Java文件 - Files.walk(Paths.get(sourcePath)).filter(p -> p.toString().endsWith(".java")).forEach(p -> { - - FileInputStream fis = FileUtil.getFileInputStream(p); - CompilationUnit cu = TransformUtil.getCompilationUnit(fis); - // 修改引用的方法 - methodRefRenamer.transform(cu,needChange); - - // 保存修改后的源代码 - FileUtil.saveModifiedFile(cu, p.toFile()); - }); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static void printLogoAndUsage() { - System.out.println(" ╦╔═╗┌─┐┬ ┬┬─┐┌─┐┌─┐ ╔═╗┌┐ ┌─┐\n" + - " ║╚═╗│ ││ │├┬┘│ ├┤───║ ║├┴┐├┤ \n" + - "╚╝╚═╝└─┘└─┘┴└─└─┘└─┘ ╚═╝└─┘└ "); - System.out.println(); - System.out.println("usage: --path 指定混淆的java目录 --obfMethod=true 开启方法名混淆"); - System.out.println(); - } -} From a449cb3811a3eeb68a1fc7f700155163c592a753 Mon Sep 17 00:00:00 2001 From: 4ra1n <2023503307@qq.com> Date: Mon, 22 Apr 2024 16:07:42 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=AE=80=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 10f5b8e..55075e7 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ - 3.25.5 + 3.25.10 5.0.4 - 3.12.0 + 3.14.0 3.3.1 From 43cbc36323b5c905d8e4219e721a9a3cb1bbd85e Mon Sep 17 00:00:00 2001 From: 4ra1n <2023503307@qq.com> Date: Tue, 23 Apr 2024 11:08:21 +0800 Subject: [PATCH 3/5] ObjectCreationExpr BUG FIX --- src/main/java/org/vidar/Main.java | 7 +- .../vidar/transform/impl/ClzRefRenamer.java | 9 +-- .../org/vidar/transform/impl/ClzRenamer.java | 5 +- .../vidar/transform/impl/FieldRenamer.java | 14 +--- .../transform/impl/MethodRefRenamer.java | 61 +++++------------ src/main/java/org/vidar/utils/FileUtil.java | 23 +++---- src/main/java/org/vidar/utils/NameUtil.java | 66 ++++++------------- .../java/org/vidar/utils/TransformUtil.java | 2 +- 8 files changed, 59 insertions(+), 128 deletions(-) diff --git a/src/main/java/org/vidar/Main.java b/src/main/java/org/vidar/Main.java index 5efd15e..5110d4c 100644 --- a/src/main/java/org/vidar/Main.java +++ b/src/main/java/org/vidar/Main.java @@ -64,9 +64,9 @@ public static void main(String[] args) { CompilationUnit cu = TransformUtil.getCompilationUnit(fis); String oldClzName = TransformUtil.getClzNameByPath(p); String oldPkgName = cu.getPackageDeclaration().orElse(new PackageDeclaration()).getNameAsString(); - String newClzName = NameUtil.generateClassName("1ue"); + String newClzName = NameUtil.generateClassName(); clzRenamer.transform(cu, newClzName); - fieldRenamer.transform(cu, newClzName); +// fieldRenamer.transform(cu, newClzName); String path = p.toFile().getParent(); FileUtil.saveModifiedFile(cu, new File(path + "/" + newClzName + ".java")); FileUtil.deleteFile(p.toFile()); @@ -131,7 +131,8 @@ private static void changeClzUsage(Path sourcePath, String oldPkgName, String ne FileInputStream fis = FileUtil.getFileInputStream(p); CompilationUnit cu = TransformUtil.getCompilationUnit(fis); clzRefRenamer.transform(cu, new String[]{oldClzName, newClzName}); - TransformUtil.changeImport(cu, oldPkgName + "." + oldClzName, newPkgName + "." + newClzName); + TransformUtil.changeImport(cu, oldPkgName + "." + oldClzName, + newPkgName + "." + newClzName); FileUtil.saveModifiedFile(cu, p.toFile()); }); files.close(); diff --git a/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java b/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java index a367e09..01372c9 100644 --- a/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java +++ b/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java @@ -1,9 +1,9 @@ package org.vidar.transform.impl; import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.expr.MethodCallExpr; import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.expr.ObjectCreationExpr; import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import org.vidar.transform.Transformer; @@ -14,8 +14,6 @@ public void transform(CompilationUnit cu, String[] arg) { cu.accept(new VoidVisitorAdapter() { @Override public void visit(ClassOrInterfaceType parent, String[] arg) { - // 修改类 -// System.out.println(parent.getNameAsString()); if (parent.getNameAsString().equals(arg[0])) { parent.setName(arg[1]); } @@ -26,16 +24,13 @@ public void visit(ClassOrInterfaceType parent, String[] arg) { } } -// 静态方法调用处理 class ClassNameRenamingVisitor extends VoidVisitorAdapter { @Override public void visit(MethodCallExpr methodCallExpr, String[] arg) { + System.out.println(methodCallExpr.getName().toString()); if (methodCallExpr.getScope().isPresent() && methodCallExpr.getScope().get() instanceof NameExpr) { NameExpr scopeExpr = (NameExpr) methodCallExpr.getScope().get(); String className = scopeExpr.getNameAsString(); - String methodName = methodCallExpr.getNameAsString(); -// System.out.println("类名:" + className); -// System.out.println("方法名:" + methodName); if (className.equals(arg[0])) { scopeExpr.setName(arg[1]); } diff --git a/src/main/java/org/vidar/transform/impl/ClzRenamer.java b/src/main/java/org/vidar/transform/impl/ClzRenamer.java index d849f19..3ade644 100644 --- a/src/main/java/org/vidar/transform/impl/ClzRenamer.java +++ b/src/main/java/org/vidar/transform/impl/ClzRenamer.java @@ -11,11 +11,8 @@ public void transform(CompilationUnit cu, String newClzName) { cu.accept(new VoidVisitorAdapter() { @Override public void visit(ClassOrInterfaceDeclaration cd, String newClzName) { - // 修改类名 cd.setName(newClzName); - cd.getConstructors().forEach(constructor -> { - constructor.setName(newClzName); - }); + cd.getConstructors().forEach(constructor -> constructor.setName(newClzName)); super.visit(cd, newClzName); } },newClzName); diff --git a/src/main/java/org/vidar/transform/impl/FieldRenamer.java b/src/main/java/org/vidar/transform/impl/FieldRenamer.java index 3e52089..21d28db 100644 --- a/src/main/java/org/vidar/transform/impl/FieldRenamer.java +++ b/src/main/java/org/vidar/transform/impl/FieldRenamer.java @@ -12,8 +12,6 @@ import java.util.List; public class FieldRenamer implements Transformer { - - @Override public void transform(CompilationUnit cu, String newClzName) { FieldCollectorVisitor fieldCollectorVisitor = new FieldCollectorVisitor(); @@ -25,25 +23,19 @@ public void transform(CompilationUnit cu, String newClzName) { cu.accept(new FieldNameChangeVisitor(), new String[]{oldVarName, newVarName}); } } - private static class FieldCollectorVisitor extends VoidVisitorAdapter { - - - private List vars; + private final List vars; public FieldCollectorVisitor() { vars = new ArrayList<>(); } - @Override public void visit(VariableDeclarator vd, Void arg) { vars.add(vd); super.visit(vd, arg); } - public List getVars() { return vars; } - } private static class FieldNameChangeVisitor extends VoidVisitorAdapter { @@ -54,19 +46,15 @@ public void visit(VariableDeclarator vd, String[] arg) { } super.visit(vd, arg); } - @Override public void visit(FieldAccessExpr fe, String[] arg) { -// System.out.println(fe.getName().getIdentifier()); if (fe.getName().getIdentifier().equals(arg[0])) { fe.setName(arg[1]); } super.visit(fe,arg); } - @Override public void visit(NameExpr nameExpr, String[] arg) { -// System.out.println(nameExpr.getName().getIdentifier()); if (nameExpr.getNameAsString().equals(arg[0])) { nameExpr.setName(arg[1]); } diff --git a/src/main/java/org/vidar/transform/impl/MethodRefRenamer.java b/src/main/java/org/vidar/transform/impl/MethodRefRenamer.java index 227effc..60e1119 100644 --- a/src/main/java/org/vidar/transform/impl/MethodRefRenamer.java +++ b/src/main/java/org/vidar/transform/impl/MethodRefRenamer.java @@ -1,88 +1,63 @@ package org.vidar.transform.impl; -import com.github.javaparser.Range; import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.body.TypeDeclaration; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.expr.MethodCallExpr; -import com.github.javaparser.ast.expr.MethodReferenceExpr; import com.github.javaparser.ast.expr.NameExpr; -import com.github.javaparser.ast.expr.SimpleName; -import com.github.javaparser.ast.visitor.VoidVisitor; +import com.github.javaparser.ast.expr.ObjectCreationExpr; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import org.vidar.transform.Transformer; import java.util.HashMap; import java.util.Map; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicBoolean; -// TODO 如果是不同类相同函数名,但是其中一个是接口不会被修改,导致错误被改,即现在不允许出现重复函数名 public class MethodRefRenamer implements Transformer> { - - private Map vartoClz = new HashMap<>(); - + private final Map varToClz = new HashMap<>(); @Override + @SuppressWarnings("unchecked") public void transform(CompilationUnit cu, Map arg) { - cu.accept(new VarClzCollectVisitor(),vartoClz); -// System.out.println("var mapping ClzName"); -// vartoClz.forEach((key, value) -> System.out.println(key + " : " + value)); - cu.accept(new MethodRefChangeVisitor(),new Map[]{arg,vartoClz}); + cu.accept(new VarClzCollectVisitor(), varToClz); + cu.accept(new MethodRefChangeVisitor(),new Map[]{arg, varToClz}); } - - // 获取var对应的ClassName - private static class VarClzCollectVisitor extends VoidVisitorAdapter { + private static class VarClzCollectVisitor extends VoidVisitorAdapter> { @Override - public void visit(VariableDeclarator declarator, Map vartoClz) { - super.visit(declarator, vartoClz); - vartoClz.put(declarator.getNameAsString(),declarator.getType().asString()); + public void visit(VariableDeclarator declarator, Map varToClz) { + super.visit(declarator, varToClz); + varToClz.put(declarator.getNameAsString(),declarator.getType().asString()); } } - - private static class MethodRefChangeVisitor extends VoidVisitorAdapter { - + private static class MethodRefChangeVisitor extends VoidVisitorAdapter[]> { @Override - public void visit(MethodCallExpr mc, Map[] map) { + public void visit(MethodCallExpr mc, Map[] map) { Map needChange = map[0]; - Map vartoClz = map[1]; + Map varToClz = map[1]; String className = null; - - - AtomicBoolean isInterface = new AtomicBoolean(false); try { ResolvedMethodDeclaration resolve = mc.resolve(); className = resolve.getClassName(); - } catch (Exception e) { -// e.printStackTrace(); - // ignore 这里必须忽略异常,你细品 + } catch (Exception ignored) { } - - String methodName = mc.getNameAsString(); if ( className == null || className.isEmpty() || "null".equals(className) ) { - if (mc.getScope().isPresent() && mc.getScope().get() instanceof NameExpr) { NameExpr scopeExpr = mc.getScope().get().asNameExpr(); String varName = scopeExpr.getName().getIdentifier(); - className = vartoClz.get(varName); + className = varToClz.get(varName); + } + if(mc.getScope().isPresent() && mc.getScope().get() instanceof ObjectCreationExpr) { + ObjectCreationExpr objectCreationExpr = mc.getScope().get().asObjectCreationExpr(); + className = objectCreationExpr.getTypeAsString(); } } String sign = className + "#" + methodName; - if (needChange.containsKey(sign)) { String s = needChange.get(sign); -// System.out.println(sign+"------->"+s); mc.setName(s); } super.visit(mc, map); } - - } - } diff --git a/src/main/java/org/vidar/utils/FileUtil.java b/src/main/java/org/vidar/utils/FileUtil.java index 2ebeb7b..140ff70 100644 --- a/src/main/java/org/vidar/utils/FileUtil.java +++ b/src/main/java/org/vidar/utils/FileUtil.java @@ -5,33 +5,31 @@ import com.github.javaparser.printer.Printer; import com.github.javaparser.printer.configuration.DefaultConfigurationOption; import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration; +import me.n1ar4.log.LogManager; +import me.n1ar4.log.Logger; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Path; public class FileUtil { - - private static Printer printer = new DefaultPrettyPrinter(); - + private static final Logger logger = LogManager.getLogger(); + private static final Printer printer = new DefaultPrettyPrinter(); static { - printer.getConfiguration().removeOption(new DefaultConfigurationOption(DefaultPrinterConfiguration.ConfigOption.PRINT_COMMENTS)); + printer.getConfiguration().removeOption( + new DefaultConfigurationOption(DefaultPrinterConfiguration.ConfigOption.PRINT_COMMENTS)); } - public static void saveModifiedFile(CompilationUnit cu, File file) { try (FileOutputStream fos = new FileOutputStream(file)) { String print = printer.print(cu); -// System.out.println("===================================================="); -// System.out.println(print); fos.write(print.getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { - e.printStackTrace(); + logger.error("save modified file error: {}", e.toString()); } } - public static FileInputStream getFileInputStream(Path path) { File file = path.toFile(); - FileInputStream fis = null; + FileInputStream fis; try { fis = new FileInputStream(file); } catch (FileNotFoundException e) { @@ -41,6 +39,9 @@ public static FileInputStream getFileInputStream(Path path) { } public static void deleteFile(File file) { - file.delete(); + boolean a = file.delete(); + if (!a){ + logger.warn("delete old files error"); + } } } diff --git a/src/main/java/org/vidar/utils/NameUtil.java b/src/main/java/org/vidar/utils/NameUtil.java index 5fc4eca..f6d6cbb 100644 --- a/src/main/java/org/vidar/utils/NameUtil.java +++ b/src/main/java/org/vidar/utils/NameUtil.java @@ -6,18 +6,17 @@ import java.util.Random; public class NameUtil { - /** - * By ItzSomebody - */ private final static char[] DICT_SPACES = new char[]{ - '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', '\u200A', '\u200B', '\u200C', '\u200D', '\u200E', '\u200F' + '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', + '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', + '\u200A', '\u200B', '\u200C', '\u200D', '\u200E', + '\u200F' }; - private static HashMap packageMap = new HashMap<>(); - private static Map> USED_METHODNAMES = new HashMap<>(); - private static Map USED_FIELDNAMES = new HashMap<>(); - // private static boolean iL = true; + private static final HashMap packageMap = new HashMap<>(); + private static final Map> USED_METHOD_NAMES = new HashMap<>(); + private static final Map USED_FIELD_NAMES = new HashMap<>(); private static int localVars = Short.MAX_VALUE; - private static Random random = new Random(); + private static final Random random = new Random(); private static int METHODS = 0; private static int FIELDS = 0; @@ -26,9 +25,12 @@ private static int randInt(int min, int max) { return random.nextInt(max - min) + min; } - public static void setup(final String classCharacters, final String methodCharacters, final String fieldCharacters, boolean iL) { - USED_METHODNAMES.clear(); - USED_FIELDNAMES.clear(); + public static void setup(final String classCharacters, + final String methodCharacters, + final String fieldCharacters, + boolean iL) { + USED_METHOD_NAMES.clear(); + USED_FIELD_NAMES.clear(); } @@ -41,28 +43,15 @@ public static String generateSpaceString(int length) { } public static String generateClassName() { - return generateClassName(""); - } - - - public static String generateClassName(String packageName) { + String packageName = ""; if (!packageMap.containsKey(packageName)) { packageMap.put(packageName, 0); } - int id = packageMap.get(packageName); packageMap.put(packageName, id + 1); - - return "L"+toIl(id); + return "L" + toIl(id); } - /** - * @param len Length of the string to generate. - * @return a built {@link String} consisting of DICT_SPACES. - * @author ItzSomebody - * Generates a {@link String} consisting only of DICT_SPACES. - * Stole this idea from NeonObf and Smoke. - */ public static String crazyString(int len) { char[] buildString = new char[len]; for (int i = 0; i < len; i++) { @@ -71,7 +60,6 @@ public static String crazyString(int len) { return new String(buildString); } - public static String generateMethodName(final String className, String desc) { return toIl(METHODS++); } @@ -88,10 +76,6 @@ public static String generateLocalVariableName() { return toIl(localVars--); } - private static int getLenght() { - return new Random().nextInt(20) + 6; - } - public static String unicodeString(int length) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { @@ -101,22 +85,12 @@ public static String unicodeString(int length) { } public static void mapClass(String old, String newName) { - if (USED_METHODNAMES.containsKey(old)) { - USED_METHODNAMES.put(newName, USED_METHODNAMES.get(old)); - } - if (USED_FIELDNAMES.containsKey(old)) { - USED_FIELDNAMES.put(newName, USED_FIELDNAMES.get(old)); + if (USED_METHOD_NAMES.containsKey(old)) { + USED_METHOD_NAMES.put(newName, USED_METHOD_NAMES.get(old)); } - } - - public static String getPackage(String in) { - int lin = in.lastIndexOf('/'); - - if (lin == 0) { - throw new IllegalArgumentException("Illegal class name"); + if (USED_FIELD_NAMES.containsKey(old)) { + USED_FIELD_NAMES.put(newName, USED_FIELD_NAMES.get(old)); } - - return lin == -1 ? "" : in.substring(0, lin); } public static String toIl(int i) { diff --git a/src/main/java/org/vidar/utils/TransformUtil.java b/src/main/java/org/vidar/utils/TransformUtil.java index b0ca409..962a08b 100644 --- a/src/main/java/org/vidar/utils/TransformUtil.java +++ b/src/main/java/org/vidar/utils/TransformUtil.java @@ -64,7 +64,7 @@ public static String getMethodSignature(MethodDeclaration m) { } public static CompilationUnit getCompilationUnit(FileInputStream fis) { - CompilationUnit cu = javaParser.parse(fis).getResult().get(); + CompilationUnit cu = javaParser.parse(fis).getResult().orElse(null); try { fis.close(); } catch (IOException e) { From d5dba220fa284b24dac0c3f3eaef2873c0bfd8aa Mon Sep 17 00:00:00 2001 From: 4ra1n <2023503307@qq.com> Date: Tue, 23 Apr 2024 11:58:20 +0800 Subject: [PATCH 4/5] PARAMETER BUG FIX --- src/main/java/org/vidar/Main.java | 15 +++--- .../vidar/transform/impl/ClzRefRenamer.java | 1 - .../vidar/transform/impl/FieldRenamer.java | 51 +++++++++++++++++-- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/vidar/Main.java b/src/main/java/org/vidar/Main.java index 5110d4c..2058f0d 100644 --- a/src/main/java/org/vidar/Main.java +++ b/src/main/java/org/vidar/Main.java @@ -2,6 +2,7 @@ import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.PackageDeclaration; +import com.github.javaparser.ast.body.Parameter; import joptsimple.OptionParser; import joptsimple.OptionSet; import me.n1ar4.log.LogLevel; @@ -66,7 +67,7 @@ public static void main(String[] args) { String oldPkgName = cu.getPackageDeclaration().orElse(new PackageDeclaration()).getNameAsString(); String newClzName = NameUtil.generateClassName(); clzRenamer.transform(cu, newClzName); -// fieldRenamer.transform(cu, newClzName); + fieldRenamer.transform(cu, newClzName); String path = p.toFile().getParent(); FileUtil.saveModifiedFile(cu, new File(path + "/" + newClzName + ".java")); FileUtil.deleteFile(p.toFile()); @@ -74,12 +75,12 @@ public static void main(String[] args) { }); files.close(); - boolean obfMethod = !options.has("obfMethod") || - (boolean) options.valueOf("obfMethod"); - if (obfMethod) { - changeMethodName(sPath); - changeMethodUsage(sPath, methodRenamer.getMethodNameMap()); - } +// boolean obfMethod = !options.has("obfMethod") || +// (boolean) options.valueOf("obfMethod"); +// if (obfMethod) { +// changeMethodName(sPath); +// changeMethodUsage(sPath, methodRenamer.getMethodNameMap()); +// } logger.info("start obfuscate strings"); diff --git a/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java b/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java index 01372c9..0a3ac0f 100644 --- a/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java +++ b/src/main/java/org/vidar/transform/impl/ClzRefRenamer.java @@ -27,7 +27,6 @@ public void visit(ClassOrInterfaceType parent, String[] arg) { class ClassNameRenamingVisitor extends VoidVisitorAdapter { @Override public void visit(MethodCallExpr methodCallExpr, String[] arg) { - System.out.println(methodCallExpr.getName().toString()); if (methodCallExpr.getScope().isPresent() && methodCallExpr.getScope().get() instanceof NameExpr) { NameExpr scopeExpr = (NameExpr) methodCallExpr.getScope().get(); String className = scopeExpr.getNameAsString(); diff --git a/src/main/java/org/vidar/transform/impl/FieldRenamer.java b/src/main/java/org/vidar/transform/impl/FieldRenamer.java index 21d28db..ce527ec 100644 --- a/src/main/java/org/vidar/transform/impl/FieldRenamer.java +++ b/src/main/java/org/vidar/transform/impl/FieldRenamer.java @@ -1,6 +1,7 @@ package org.vidar.transform.impl; import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.expr.FieldAccessExpr; import com.github.javaparser.ast.expr.NameExpr; @@ -15,30 +16,72 @@ public class FieldRenamer implements Transformer { @Override public void transform(CompilationUnit cu, String newClzName) { FieldCollectorVisitor fieldCollectorVisitor = new FieldCollectorVisitor(); - cu.accept(fieldCollectorVisitor,null); + ParameterVisitor parameterVisitor = new ParameterVisitor(); + + cu.accept(parameterVisitor, null); + cu.accept(fieldCollectorVisitor, null); + List vars = fieldCollectorVisitor.getVars(); + List parameters = parameterVisitor.getParameters(); + for (VariableDeclarator var : vars) { + boolean flag = false; + for (Parameter p : parameters) { + if (var.getNameAsString().equals(p.getNameAsString())) { + flag = true; + } + } + if (flag) { + continue; + } String oldVarName = var.getNameAsString(); String newVarName = NameUtil.generateFieldName(newClzName); cu.accept(new FieldNameChangeVisitor(), new String[]{oldVarName, newVarName}); } } + + private static class ParameterVisitor extends VoidVisitorAdapter { + private final List parameters; + + public ParameterVisitor() { + parameters = new ArrayList<>(); + } + + @Override + public void visit(Parameter n, Void arg) { + parameters.add(n); + super.visit(n, arg); + } + + public List getParameters() { + return this.parameters; + } + } + private static class FieldCollectorVisitor extends VoidVisitorAdapter { private final List vars; + public FieldCollectorVisitor() { vars = new ArrayList<>(); } + @Override public void visit(VariableDeclarator vd, Void arg) { vars.add(vd); super.visit(vd, arg); } + public List getVars() { return vars; } } private static class FieldNameChangeVisitor extends VoidVisitorAdapter { + @Override + public void visit(Parameter n, String[] arg) { + super.visit(n, arg); + } + @Override public void visit(VariableDeclarator vd, String[] arg) { if (vd.getNameAsString().equals(arg[0])) { @@ -46,19 +89,21 @@ public void visit(VariableDeclarator vd, String[] arg) { } super.visit(vd, arg); } + @Override public void visit(FieldAccessExpr fe, String[] arg) { if (fe.getName().getIdentifier().equals(arg[0])) { fe.setName(arg[1]); } - super.visit(fe,arg); + super.visit(fe, arg); } + @Override public void visit(NameExpr nameExpr, String[] arg) { if (nameExpr.getNameAsString().equals(arg[0])) { nameExpr.setName(arg[1]); } - super.visit(nameExpr,arg); + super.visit(nameExpr, arg); } } } From 538c87c033c07a190fa9ccde83825eb731e8af59 Mon Sep 17 00:00:00 2001 From: 4ra1n <2023503307@qq.com> Date: Tue, 23 Apr 2024 12:06:49 +0800 Subject: [PATCH 5/5] FIX --- src/main/java/org/vidar/Main.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/vidar/Main.java b/src/main/java/org/vidar/Main.java index 2058f0d..e12e9d7 100644 --- a/src/main/java/org/vidar/Main.java +++ b/src/main/java/org/vidar/Main.java @@ -75,12 +75,12 @@ public static void main(String[] args) { }); files.close(); -// boolean obfMethod = !options.has("obfMethod") || -// (boolean) options.valueOf("obfMethod"); -// if (obfMethod) { -// changeMethodName(sPath); -// changeMethodUsage(sPath, methodRenamer.getMethodNameMap()); -// } + boolean obfMethod = !options.has("obfMethod") || + (boolean) options.valueOf("obfMethod"); + if (obfMethod) { + changeMethodName(sPath); + changeMethodUsage(sPath, methodRenamer.getMethodNameMap()); + } logger.info("start obfuscate strings");