前言:
有需要批量反编译文件夹中大量的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")
很简单,没什么好说的。