[功能] 方法字段参数名支持 useEvilCharInstead 特殊字符 @4ra1n

This commit is contained in:
4ra1n
2025-09-10 20:49:28 +08:00
parent d5531e2562
commit 865bc50a1e
8 changed files with 8723 additions and 42 deletions

View File

@@ -1,11 +1,14 @@
# CHANGELOG
## 1.7.1
## 1.8.0
更新日志:
- [功能] 方法字段参数名支持 `useEvilCharInstead` 特殊字符 @4ra1n
- [功能] 花指令添加字符串支持 `enableEvilString` 特殊字符 @4ra1n
- [BUG] 加密解密字符串编码问题导致中文乱码 @4ra1n
- [BUG] 某些情况当前目录会生成多余的临时文件 @4ra1n
- [优化] 优化丢失的命令行配置提示 @4ra1n
感谢以下用户的贡献:

View File

@@ -17,6 +17,8 @@
![](img/009.png)
![](img/010.png)
本项目已深度集成到 `web-chains` 项目中 (https://github.com/vulhub/java-chains)
![](img/006.png)
@@ -165,6 +167,9 @@ advanceStringName: ME_N1AR4_CLAZZ_OBF_PROJECT
enableJunk: true
# 花指令混淆级别 1-5
junkLevel: 3
# 花指令可以使用常见的随机字符
# 也可以使用恶意的字符生成更具有迷惑的代码
enableEvilString: true
# 一个类中花指令最多数量
maxJunkOneClass: 1000
@@ -186,6 +191,11 @@ expandParamNum: 3
# expand 操作只会对白名单方法名进行混淆
expandMethodList:
- "test"
# 使用恶意的字符替换方法名 字段名 参数名等
# 注意:如果开启了该项 obfuscateChars 将无效
# 注意:该功能不确定在所有版本 JAVA 上可以稳定运行
useEvilCharInstead: true
```
## 如何测试

BIN
img/010.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -2,6 +2,7 @@ package me.n1ar4.clazz.obfuscator.asm;
import me.n1ar4.clazz.obfuscator.Const;
import me.n1ar4.clazz.obfuscator.config.BaseConfig;
import me.n1ar4.clazz.obfuscator.utils.EvilObfUtil;
import me.n1ar4.clazz.obfuscator.utils.JunkUtil;
import me.n1ar4.clazz.obfuscator.utils.RandomUtil;
import me.n1ar4.jrandom.core.JRandom;
@@ -141,7 +142,11 @@ public class JunkCodeClassVisitor extends ClassVisitor {
mv.visitTypeInsn(Opcodes.NEW, "java/lang/String");
mv.visitInsn(Opcodes.DUP);
mv.visitLdcInsn(JRandom.getInstance().randomString(16));
if (config.isEnableEvilString()) {
mv.visitLdcInsn(EvilObfUtil.randomString(16));
} else {
mv.visitLdcInsn(JRandom.getInstance().randomString(16));
}
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/String", "<init>",
"(Ljava/lang/String;)V", false);
mv.visitInsn(Opcodes.POP);
@@ -155,7 +160,11 @@ public class JunkCodeClassVisitor extends ClassVisitor {
mv.visitLabel(ifLabel);
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System",
"out", "Ljava/io/PrintStream;");
mv.visitLdcInsn(JRandom.getInstance().randomString(16));
if (config.isEnableEvilString()) {
mv.visitLdcInsn(EvilObfUtil.randomString(16));
} else {
mv.visitLdcInsn(JRandom.getInstance().randomString(16));
}
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream",
"println", "(Ljava/lang/String;)V", false);
mv.visitJumpInsn(Opcodes.GOTO, endLabel);

View File

@@ -22,10 +22,11 @@ public class BaseConfig {
private boolean enableXOR;
private boolean enableAES;
private boolean enableJunk;
private boolean enableDeleteCompileInfo;
private boolean enableJunk;
private int junkLevel;
private boolean enableEvilString;
private int maxJunkOneClass;
private boolean ignorePublic;
@@ -41,6 +42,8 @@ public class BaseConfig {
private int expandParamNum;
private String[] expandMethodList;
private boolean useEvilCharInstead;
/**
* 如果配置没问题可以启动就返回 true
*
@@ -110,6 +113,10 @@ public class BaseConfig {
config.setObfuscateChars(new String[]{"i", "l", "L", "1", "I"});
config.setAdvanceStringName("iii");
config.setMethodBlackList(new String[]{"main"});
// 默认不开启多余功能
config.setEnableExpandMethod(false);
config.setUseEvilCharInstead(false);
config.setEnableEvilString(false);
return config;
}
@@ -157,6 +164,16 @@ public class BaseConfig {
ColorUtil.green(String.valueOf(junkLevel)));
System.out.println(ColorUtil.cyan("[Junk Obfuscate] Max Number in One Class -> ") +
ColorUtil.green(String.valueOf(maxJunkOneClass)));
System.out.println(ColorUtil.cyan("[Junk Obfuscate] Enable Evil String -> ") +
ColorUtil.green(String.valueOf(enableEvilString)));
System.out.println(ColorUtil.yellow("Enable Expand Method -> ") +
ColorUtil.green(String.valueOf(enableExpandMethod)));
System.out.println(ColorUtil.cyan("[Expand Method] Expand Param Num -> ") +
ColorUtil.green(String.valueOf(expandParamNum)));
System.out.println(ColorUtil.cyan("[Expand Method] Expand Method List -> ") +
ColorUtil.green(Arrays.toString(expandMethodList)));
System.out.println(ColorUtil.yellow("Use Evil Char Instead -> ") +
ColorUtil.green(String.valueOf(useEvilCharInstead)));
}
public boolean isQuiet() {
@@ -359,4 +376,20 @@ public class BaseConfig {
public void setExpandMethodList(String[] expandMethodList) {
this.expandMethodList = expandMethodList;
}
public boolean isEnableEvilString() {
return enableEvilString;
}
public void setEnableEvilString(boolean enableEvilString) {
this.enableEvilString = enableEvilString;
}
public boolean isUseEvilCharInstead() {
return useEvilCharInstead;
}
public void setUseEvilCharInstead(boolean useEvilCharInstead) {
this.useEvilCharInstead = useEvilCharInstead;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,6 @@
package me.n1ar4.clazz.obfuscator.utils;
import me.n1ar4.clazz.obfuscator.core.ObfEnv;
import me.n1ar4.jrandom.core.JRandom;
import java.util.HashSet;
@@ -30,53 +31,87 @@ public class NameUtil {
}
public static String genWithSet(HashSet<String> exists) {
JRandom random = JRandom.getInstance();
while (true) {
int length = 10 + random.getInt(0, 3);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(CHAR_POOL[random.getInt(0, CHAR_POOL.length)]);
if (ObfEnv.config.isUseEvilCharInstead()) {
while (true) {
String result = EvilObfUtil.randomString(16);
if (!exists.contains(result)) {
exists.add(result);
return result;
}
}
if (sb.charAt(0) == '~' || sb.charAt(0) == '1') {
continue;
}
String result = sb.toString();
if (!exists.contains(result)) {
exists.add(result);
return result;
} else {
JRandom random = JRandom.getInstance();
while (true) {
int length = 10 + random.getInt(0, 3);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(CHAR_POOL[random.getInt(0, CHAR_POOL.length)]);
}
if (sb.charAt(0) == '~' || sb.charAt(0) == '1') {
continue;
}
String result = sb.toString();
if (!exists.contains(result)) {
exists.add(result);
return result;
}
}
}
}
private static String genBase(int op) {
JRandom random = JRandom.getInstance();
while (true) {
int length = 10 + random.getInt(0, 3);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(CHAR_POOL[random.getInt(0, CHAR_POOL.length)]);
if (ObfEnv.config.isUseEvilCharInstead()) {
while (true) {
String result = EvilObfUtil.randomString(16);
if (op == 2) {
if (!generatedMethods.contains(result)) {
generatedMethods.add(result);
return result;
}
} else if (op == 1) {
if (!generatedStrings.contains(result)) {
generatedStrings.add(result);
return result;
}
} else if (op == 3) {
if (!generatedFields.contains(result)) {
generatedFields.add(result);
return result;
}
} else {
return null;
}
}
if (sb.charAt(0) == '~' || sb.charAt(0) == '1') {
continue;
}
String result = sb.toString();
if (op == 2) {
if (!generatedMethods.contains(result)) {
generatedMethods.add(result);
return result;
} else {
JRandom random = JRandom.getInstance();
while (true) {
int length = 10 + random.getInt(0, 3);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(CHAR_POOL[random.getInt(0, CHAR_POOL.length)]);
}
} else if (op == 1) {
if (!generatedStrings.contains(result)) {
generatedStrings.add(result);
return result;
if (sb.charAt(0) == '~' || sb.charAt(0) == '1') {
continue;
}
} else if (op == 3) {
if (!generatedFields.contains(result)) {
generatedFields.add(result);
return result;
String result = sb.toString();
if (op == 2) {
if (!generatedMethods.contains(result)) {
generatedMethods.add(result);
return result;
}
} else if (op == 1) {
if (!generatedStrings.contains(result)) {
generatedStrings.add(result);
return result;
}
} else if (op == 3) {
if (!generatedFields.contains(result)) {
generatedFields.add(result);
return result;
}
} else {
return null;
}
} else {
return null;
}
}
}

View File

@@ -56,6 +56,9 @@ advanceStringName: ME_N1AR4_CLAZZ_OBF_PROJECT
enableJunk: true
# 花指令混淆级别 1-5
junkLevel: 3
# 花指令可以使用常见的随机字符
# 也可以使用恶意的字符生成更具有迷惑的代码
enableEvilString: true
# 一个类中花指令最多数量
maxJunkOneClass: 1000
@@ -76,4 +79,9 @@ enableExpandMethod: true
expandParamNum: 3
# expand 操作只会对白名单方法名进行混淆
expandMethodList:
- "test"
- "test"
# 使用恶意的字符替换方法名 字段名 参数名等
# 注意:如果开启了该项 obfuscateChars 将无效
# 注意:该功能不确定在所有版本 JAVA 上可以稳定运行
useEvilCharInstead: true