几个处理 Java 的 class 文件的工具(转载)

本文介绍几种Java字节码处理工具,包括反编译器、查看器和编辑器,适用于混淆代码的反编译、代码定位和修改。重点推荐JDJavaDecompiler和JADJavaDecompiler,它们在处理复杂混淆代码方面表现优秀。同时,通过对比这些工具的特点和优势,提供了一种有效的代码修改和维护策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载自:http://qixinglu.com/post/some_handle_java_class_file_tools.html

 

一般来说手动修改二进制文件是件苦差事,有源码在手不如直接修改重新编译。但有些软件是不开源的,又想修改它的功能以便更好使用,就想反编译,但很 多代码都是混淆过的,反编译后几乎不能阅读,如果要改的的地方不是很多,比如最常做的是反转条件和替换字符串,这还能直接从字节码下手。

反编译器

JD Java Decompiler

试了几个,觉得这个最好用,反编译首选。可惜是闭源的,但非商用免费,版本也比较新。用 C++ 写成的,有 GUI,用的是 wxWidgets,所以跨平台,独立程序,就一个文件,速度还很快。支持直接打开 jar 文件,批量保存,代码高亮,多标签,字符串查找。还有 eclipse 的插件版本。

下载地址

JAD Java Decompiler

下载地址

这个比较老牌编译器了,命令行的,这个也是闭源的,非商用免费,很多编译器都是都是它的一个前端而已,会命令的话直接用它好了,选项也很丰富,尤其是输出格式。但对新版的 Java 特性不如 JD,所以候选。它也有开源的 eclipse 插件 JadClipse

jode

下载地址

开源也有 jode,但是太古老了,不推荐了,反正我是上面两个配合用,都反编译一份,以 JD 为首选,对于个别错误的地方参考 JAD 的结果,然后手工收复,试过把 microemulator 的 demo 反编译然后重新编译,运行通过。

字节码处理

javap

下载地址

这个命令是,jdk 自带的,作用就是输出字节码,偶然配合 grep 来看看也好。

jclasslib bytecode viewer

下载地址

jclasslib 是修改 class 文件的 java 库,可是我还不会用,但它自带了一个字节码查看器,可以说是 javap 的 GUI。分门别类显示 class 里面的元素,还带点击跳转链接。不带编辑功能,还得用十六进制编译器参照 JVM 的指令代码来修改。

Java Bytecode Editor

下载地址

简称 JBE,这个就是上面的修改版,就是多加一个编辑功能,免去查指令代码的痛苦。非常使用,不需要用到 jclasslib 库的下载这个好了。

Java Class File Editor

下载地址

虽然版本有点古老,但是还是个功能非常强大的修改器,能修改 class 的方方面面,最常用的是修改常量,比如字符串,用法比较简单,相信程序员也会用。也可以改字段、方法的属性,很强悍。

也有字节码查看功能,虽然可编辑的,但不知道为什么保存不了。

总结

上面几个各有优缺点,配合来用互补,对于混淆过的代码反编译后难以阅读,更不用说编译回去,但起码能参考一下,方便定位要改的地方,改好后在反编译一次,diff结果,看看影响到那些代码。

最后顺便纪念一下逝去的 Sun,这个伟大的公司。

package com.hexiang.utils; import java.io.*; /** * FileUtil. Simple file operation class. * * @author BeanSoft * */ public class FileUtil { /** * The buffer. */ protected static byte buf[] = new byte[1024]; /** * Read content from local file. FIXME How to judge UTF-8 and GBK, the * correct code should be: FileReader fr = new FileReader(new * InputStreamReader(fileName, "ENCODING")); Might let the user select the * encoding would be a better idea. While reading UTF-8 files, the content * is bad when saved out. * * @param fileName - * local file name to read * @return * @throws Exception */ public static String readFileAsString(String fileName) throws Exception { String content = new String(readFileBinary(fileName)); return content; } /** * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(String fileName, String encoding) throws Exception { String content = new String(readFileBinary(fileName), encoding); return content; } /** * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(InputStream in) throws Exception { String content = new String(readFileBinary(in)); return content; } /** * Read content from local file to binary byte array. * * @param fileName - * local file name to read * @return * @throws Exception */ public static byte[] readFileBinary(String fileName) throws Exception { FileInputStream fin = new FileInputStream(fileName); return readFileBinary(fin); } /** * 从输入流读取数据为二进制字节数组. * @param streamIn * @return * @throws IOException */ public static byte[] readFileBinary(InputStream streamIn) throws IOException { BufferedInputStream in = new BufferedInputStream(streamIn); ByteArrayOutputStream out = new ByteArrayOutputStream(10240); int len; while ((len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值