JAR文件批量反编译处理

前言:

有需要批量反编译文件夹中大量的jar文件,并在反编译的源代码中找到特定的调用,找了一圈试了很多工具,发现比较好的处理方法,这里进行记录,方便后续使用查询

工具:

工具我使用了很多,比较好用的这里推荐procyon-decompiler,地址如下:

https://github.com/mstrobel/procyon

使用方法很简单:

java -jar procyon-decompiler-0.6.0.jar -o /tmp/ test.jar

 使用上述命令即可对单独jar包进行反编译,可以编写python3或者批处理执行,反编译文件夹中所有jar文件

import os
import subprocess
from pathlib import Path

def decompile_jar(jar_path, output_dir):
    try:
        subprocess.run(["java", "-jar", "procyon-decompiler-0.6.0.jar", '-o',output_dir, jar_path], check=True)
        print(f"Decompiled {jar_path} to {output_dir}")
    except subprocess.CalledProcessError as e:
        print(f"Error decompiling {jar_path}: {e}")

def batch_decompile_jars(directory):
    for file in os.listdir(directory):
        if file.endswith(".jar"):
            jar_path = os.path.join(directory, file)
            output_dir = os.path.splitext(jar_path)[0] + "_decompiled"
            Path(output_dir).mkdir(parents=True, exist_ok=True)
            decompile_jar(jar_path, output_dir)

if __name__ == "__main__":
    jarpath = "D:\\lib"
    batch_decompile_jars(jarpath)

上述代码可以批量处理文件夹中文件

然后可以使用如下代码对文件夹内容进行扫描并输出xlsx文件

import os
import zipfile
import re
import openpyxl


def find_class_usages(project_dir, class_names):
    results = {}
    for root, dirs, files in os.walk(project_dir):
        for file in files:
            if file.endswith('.java'):
                try:
                    file_path = os.path.join(root, file)
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.read()
                    for class_name in class_names:
                        pattern = r'\b' + re.escape(class_name) + r'\b'
                        if re.search(pattern, content):
                            print(file_path)
                            if class_name not in results:
                                results[class_name] = []
                            results[class_name].append(file_path)
                except Exception as e:
                    print(file_path + "-->" + str(e))

    return results


def save_to_xlsx(results, output_file):
    workbook = openpyxl.Workbook()
    worksheet = workbook.active
    worksheet['A1'] = 'Class Name'
    worksheet['B1'] = 'Usage Locations'
    row = 2
    for class_name, locations in results.items():
        for location in locations:
            worksheet.cell(row=row, column=1, value=class_name)
            worksheet.cell(row=row, column=2, value=location)
            row += 1
    workbook.save(output_file)

jar_file_path = 'D:\\jar'
project_dir  = "D:\\lib"
jar_path = "D:\\unziplib"

if __name__ == '__main__':
    class_names = ["org.bouncycastle","org.apache.james.mime4j"]
    usage_results = find_class_usages(project_dir, class_names)
    save_to_xlsx(usage_results, "OUT.xlsx")

 很简单,没什么好说的。

 

 

### 回答1: jar文件是Java语言中常见的一种打包文件格式,它将多个Java类文件、资源文件和其他文件打包成一个文件。一般情况下,jar文件是已经编译成机器码的二进制文件,无法直接查看其中的源代码。但是,通过使用反编译工具,我们可以将jar文件中的字节码还原成Java源代码。 在进行jar文件反编译时,我们通常会使用一些专门的反编译工具,如Java Decompiler、JD-GUI等。这些工具能够将jar文件中的字节码重新转换成Java源代码,并呈现给我们查看和分析。 使用这些反编译工具,我们可以对jar文件中的代码进行查看、修改和学习。例如,我们可以查看第三方库的源码,了解其实现原理;或者对某个jar文件进行定制修改,以适应特定需求。 需要注意的是,虽然反编译可以还原代码的结构和逻辑,但无法还原原始的变量名和注释。这是因为在编译过程中,Java源代码的变量名和注释会被编译器丢弃,只保留了与机器码执行有关的信息。因此,在反编译后的代码中,我们可能会看到一些类似"var1"、"var2"这样的临时变量名,而注释则可能被省略或被替换成了一些默认的注释。 总之,通过反编译jar文件,我们可以获取到其中的Java源代码,从而进行代码的分析和修改。这对于学习和项目调试等方面都起到了重要的作用。 ### 回答2: jar文件是一种Java语言的归档文件格式,可以将多个Java类文件打包成一个文件。反编译指的是将已经编译过的二进制文件(如jar文件)转换回可读的源代码。 要反编译一个jar文件中的Java源码,我们可以使用各种反编译工具,例如JD-GUI、Java Decompiler、FernFlower等。 首先,我们需要将jar文件导入到反编译工具中。这些工具通常提供一个用户界面,让我们可以轻松地导入并查看jar文件的内容。在工具的界面上,我们可以看到jar文件中包含的类文件和资源文件的列表。 接下来,我们可以选择一个或多个类文件,并使用反编译工具将其转换成可读的Java源码。这些工具通常会将反编译后的源代码显示在一个编辑器或浏览器窗口中,使我们能够查看和编辑源代码。 需要注意的是,由于编译后的二进制文件丢失了一些原始代码的信息(如变量和方法名),所以反编译后的源码可能不会与原始源代码完全相同。此外,反编译后的源码可能也会缺少一些编译器优化后的改进。 总结起来,jar文件反编译Java源码是一种将已编译的二进制文件转换回可读的源代码的过程。通过使用反编译工具,我们可以将jar文件中的类文件转换成可读的Java源码,以便于我们查看和编辑源代码。但需要注意的是,反编译后的源码可能与原始源代码存在一些差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值