Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
threadtear — 多功能 Java 反混淆工具套件 | Kitploit
工具/GitHubGitHub/loerting/threadtear
静态分析代码分析逆向工程调试器恶意软件分析二进制分析
GitHubloerting/threadtear

threadtear

多功能 Java 反混淆工具套件

查看仓库
97713255年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Threadtear Build Status Release Downloads

Threadtear 是一个用于 Java 的多功能反混淆工具。即将支持 Android 应用程序(目前正在开发 Dalvik 到 Java 转换器)。
适合在不需过多担心混淆的情况下进行更简单的代码分析。
即使是像 ZKM 或 Stringer 这样最昂贵的混淆器也包含在内。为了更容易调试,还包含了其他工具。
插入调试行号以更好地了解异常来源,或者在 try-catch 块中添加 .printStackTrace(),而无需重新编译代码。
如果没有使用版本特定的方法,反向兼容性不再是问题。在图中分析代码流程,以更好地理解算法。 Screenshot 5 Screenshot 1 Screenshot 2 Screenshot 3 Screenshot 4

执行

一个“执行”是一个任务,它会执行并修改所有加载的类文件。
有多种类型的执行,从字节码清理到字符串反混淆。
确保它们按正确的顺序排列。例如,清理执行应该在最后执行,但如果先执行,也能帮助其他执行。
当你准备好后,点击“运行”按钮,它们将按顺序执行。

警告

使用此工具风险自负。某些执行使用实现的 ClassLoader 来运行 jar 文件中的代码。攻击者可能会篡改字节码,从而执行恶意代码。
受影响的执行使用类 me.nov.threadtear.asm.vm.VM。
这些主要用于解密字符串或资源/访问混淆,因为远程执行解密方法要容易得多。

安全性

Threadtear 尽力通过自己的 SecurityManager 保护你免受恶意调用(任意代码执行)的影响,但无法保证。
特别是对于 ZKM 或 Stringer 等反混淆器,你必须非常小心,因为必须允许反射,否则它们将无法正常工作。
如果你发现 ACE,请提交一个 issue。我会尽快修复。

如何编译

首先,运行 gradle build,然后运行 gradle fatJar。在 builds/libs 中应该会生成一个可运行的 jar 文件。如果你不想下载仓库,可以使用最新的发布版本。

制作你自己的执行

你可以轻松创建自己的执行任务。只需扩展 me.nov.threadtear.execution.Execution:

root@kitploit:~
public class MyExecution extends Execution {
	public MyExecution() {
		super(ExecutionCategory.CLEANING /* 类别 */, "My execution" /* 名称 */,
				"Executes something" /* 描述,可以使用 html */);
	}
	/**
	* 当用户点击运行按钮时调用此方法
	* @return 成功返回 true,失败返回 false
	*/
	@Override
	public boolean execute(Map<String, Clazz> classes, boolean verbose) {
		classes.values().stream().map(c -> c.node).forEach(c -> {
			// 在这里使用 ASM 的 tree-API 转换类
		});
		return false;
	}
}

要在运行时加载 ClassNode,请使用 me.nov.threadtear.asm.vm.VM 类并实现 me.nov.threadtear.asm.vm.IVMReferenceHandler:

root@kitploit:~
public class MyExecution extends Execution implements IVMReferenceHandler {
	public MyExecution() {
		super(ExecutionCategory.GENERIC, "My execution", "Loads ClassNodes at runtime");
	}
	@Override
	public boolean execute(Map<String, Clazz> classes, boolean verbose) {
		classes.values().stream().map(c -> c.node).forEach(c -> {
			VM vm = VM.constructVM(this);
			// 将字节码转换为 java.lang.Class
			Class<?> loadedClass = vm.loadClass(c.name.replace('/', '.'), true);
			// 在这里对你的类进行操作
			loadedClass.getMethods()[0].invoke(...);
			return true;
		});
	}
	/**
	* 当 VM.loadClass 被调用时,VM 会调用此方法
	*/
	@Override
	public ClassNode tryClassLoad(String name) {
		// 尝试在打开的 jar 存档中找到要加载的类
		return classes.containsKey(name) ? classes.get(name).node : null;
	}
}

使用 ConstantTracker (me.nov.threadtear.analysis.stack.ConstantTracker) 你可以分析方法并跟踪非常量栈值。
例如,如果 iconst_0 被推入栈,该值本身不会像在基本的 ASM 分析器中那样丢失,你可以利用它来预测代码后续的行为。

root@kitploit:~
public class MyExecution extends Execution implements IConstantReferenceHandler {
	public MyExecution() {
		super(ExecutionCategory.GENERIC, "My execution", "Performs stack analysis and replaces code.");
	}
	@Override
	public boolean execute(Map<String, Clazz> classes, boolean verbose) {
		classes.values().stream().map(c -> c.node).forEach(this::analyzeAndRewrite);
		return true;
	}
	public void analyzeAndRewrite(ClassNode cn) {
		cn.methods.forEach(m -> {
			// 此分析器保留已知的栈值,例如可用于跳转预测
			Analyzer<ConstantValue> a = new Analyzer<ConstantValue>(new ConstantTracker(this, Access.isStatic(m.access), m.maxLocals, m.desc, new Object[0]));
			try {
				a.analyze(cn.name, m);
			} catch (AnalyzerException e) {
				logger.severe("在 " + cn.name + "." + m.name + " 中栈分析失败:" + e.getMessage());
				return;
			}
			Frame<ConstantValue>[] frames = a.getFrames();
			InsnList rewrittenCode = new InsnList();
			Map<LabelNode, LabelNode> labels = Instructions.cloneLabels(m.instructions);

			// 重写方法指令
			for (int i = 0; i < m.instructions.size(); i++) {
				AbstractInsnNode ain = m.instructions.get(i);
				Frame<ConstantValue> frame = frames[i];
				// 替换/修改指令等...
				if (frame.getStackSize() > 0) {
					ConstantValue top = frame.getStack(frame.getStackSize() - 1);
					if (top.isKnown() && top.isInteger()) {
						int knownTopStackValue = top.getInteger();
						// 使用已知栈值移除跳转,简化代码等...
						// if(...) { rewrittenCode.add(...); }
						continue;
					}
				}
				rewrittenCode.add(ain.clone(labels));
			}
			// 更新指令并修复 try-catch 块、局部变量等...
			Instructions.updateInstructions(m, labels, rewrittenCode);
		});
	}
	/**
	 * 使用此方法在加载字段时预测栈值
	 */
	@Override
	public Object getFieldValueOrNull(BasicValue v, String owner, String name, String desc) {
		return null;
	}
	/**
	 * 使用此方法在已知对象上调用方法时预测栈值
	 */
	@Override
	public Object getMethodReturnOrNull(BasicValue v, String owner, String name, String desc, List<? extends ConstantValue> values) {
		if (name.equals("toCharArray") && owner.equals("java/lang/String")) {
			if (!values.get(0).isKnown()) {
				// 调用目标未知,无法计算返回值
				return null;
			}
			return ((String) values.get(0).getValue()).toCharArray();
		}
		return null;
	}
}

不要忘记在 me.nov.threadtear.execution.ExecutionLink 中将你的执行添加到树中!

提示与技巧

有一些技巧可以帮助你成功识别和反混淆 jar 文件。在运行执行之前,先对代码进行反编译,以找出需要使用的工具。
你可以使用内置的反编译器进行此操作。

反混淆顺序

最佳的反混淆顺序是:通用执行 > 访问反混淆 > 字符串反混淆 > 清理执行。

识别方法

混淆器会表现出一些模式,你可以利用这些模式来识别混淆器。识别混淆器的最简单方法是浏览 META-INF/MANIFEST.MF 文件。
其中可能包含 Obfuscated-By: XXX 或 Protected-By: XXX 属性。

ZKM

高度(流程)混淆的代码,通常表现为静态初始化器中包含 switch 的字符串解密方法,或者带有非常长的 switch 块(约250种情况)的字符串解密方法。
ZKM 是 Java 最好(也是最古老)的混淆器之一,且价格昂贵。其网站也像混淆器本身一样古老。 ZKM

Stringer

如果你的 jar 文件包含一些特殊的类,这些类带有用于字符串混淆和访问混淆的巨大解密算法,那么很可能是 Stringer。
该保护不差,并且 Stringer 是最昂贵的混淆器之一。与普通混淆器不同,它不附带名称混淆。
它通常用作“第二层”。可能90%的使用此混淆器的人都使用了破解版,因为它比一辆车还贵。
如果你的文件被多个混淆器混淆,并且其中一个是 Stringer,你应该先从 Stringer 开始反混淆,因为 Stringer 混淆无法被覆盖。
(由于自定义 JAR 签名以及在字符串解密期间使用方法名称) Stringer Stringer 2

Allatori

像 IiIlIlIiIl 或 aUx、cOn、PrX 这样的类名表示 Allatori 混淆。
Allatori 在混淆的 jar 文件中非常常见,因为它提供免费演示,只需点击几下即可访问。这种混淆不难逆向。 Allatori

Paramorphism

Paramorphism 就像是 Stringer 的小兄弟,外观相似,但不如它好。它也有一些旨在使逆向工程工具崩溃的有趣特性,这些特性很容易被移除。
其混淆强度与 Allatori 相当。 Paramorphism

其他混淆器

对于其他混淆器,你可以尝试通用执行或提交一个 issue,我会看看能做些什么。

描述与标签

在选择执行之前,请查看悬停时的工具提示文本。
它们包含关于执行功能的简短描述,以及帮助你了解 JAR 文件行为将如何变化的标签。

许可证

Threadtear 采用 GNU General Public License 3.0 许可

捐赠

这个工具花费了大量的工作。
如果我节省了你的时间,并且你想请我喝杯咖啡,可以在这里捐款:Donate with Bitcoin

注意

请仅将 Threadtear 用于合法目的。Threadtear 的目标不是成为破解工具,而是成为恶意软件分析工具包。
如果某个转换器无法正常工作,请提交 issue 或发送电子邮件给我,并附上日志。
请注意,输出文件很可能无法运行。如果你仍想尝试运行它们,请使用 -noverify 作为 JVM 参数!
该工具意图与 Java 8 一起使用,但也可能能在更高版本上运行。

下载工具