-
Java 디컴파일 처리Java 2024. 2. 20. 10:12반응형
.class 파일로만 된 파일들을 .java로 치환해야할 일이 생겼다.
JD-GUI , Fernflow 등 여러 디컴파일러가 있지만
CFR 라이브러리를 사용해 봤다.
https://www.benf.org/other/cfr/
사용법은
java -jar cfr.jar 디컴파일할.class
1개씩 디컴파일되기때문에 여러개를 하기엔 불편했다.
여러개를 한번에 디컴파일하기 위해 파이썬 코드를 이용해봤다.
# 자바 디컴파일 처리 import os import subprocess # CFR 디컴파일러의 경로 cfr_jar_path = r'C:\cfr라이브러리있는경로\cfr-0.151.jar' # 디컴파일할 파일이 있는 최상위 디렉토리 top_directory = r'C:\디컴파일할 class 파일 경로\prm' # 최상위 디렉토리와 하위 디렉토리를 순회 for dirpath, dirnames, filenames in os.walk(top_directory): for filename in filenames: if filename.endswith('.class'): # 입력 파일 경로 class_file_path = os.path.join(dirpath, filename) # 출력 Java 파일 경로 java_file_name = os.path.splitext(filename)[0] + '.java' java_file_path = os.path.join(dirpath, java_file_name) # CFR 디컴파일러 호출 및 출력 파일로 리디렉션 with open(java_file_path, 'w') as java_file: subprocess.run(['java', '-jar', cfr_jar_path, class_file_path], stdout=java_file) print('디컴파일 완료')
디컴파일이 한번에 완료가 되며,
이후 디컴파일의 잔해 파일인 "$"가 붙은 파일을 삭제하기 위한 코드도 만들어봤다.
# 디컴파일 된 파일 삭제 처리 import os # 최상위 디렉토리 top_directory = r'C:\$가붙은파일삭제경로\java' # 최상위 디렉토리 및 하위 디렉토리 순회 for dirpath, dirnames, filenames in os.walk(top_directory): for filename in filenames: # 파일명에 '$'이 포함되어 있고, .class 또는 .java 확장자를 가지는 경우 if '$' in filename and (filename.endswith('.class') or filename.endswith('.java')): # 파일 경로 file_path = os.path.join(dirpath, filename) # 파일 삭제 os.remove(file_path) print(f'Deleted: {file_path}') print('삭제 작업 완료')
깔끔하게 디컴파일 처리를 했다.
반응형'Java' 카테고리의 다른 글
JDK13, OpenJDK13 Download (0) 2019.10.15 자바 Java - 야구게임, 자판기 만들기 (0) 2019.03.13 JDK 1.8 다운 링크 (0) 2018.10.18 Error - Index downloads are disabled, search results may be incomplete (0) 2018.08.28 project faced java version 1.x is not supported (0) 2018.08.14 댓글