Java 클래스 파일 암호화의 문제점
난독화 외에도 클래스 파일 암호화는 쉽게 생각할 수 있는 코드 보호 방법입니다. 많은 방식이 에이전트를 사용하여 클래스 파일을 암호화하고 클래스 로딩 시 복호화합니다. 그러나 이러한 방식은 중요한 점을 간과하고 있습니다. 바로 JVM의 내장 어태치 메커니즘입니다.
JVM 어태치 메커니즘
프로그램 운영의 분석과 모니터링을 용이하게 하기 위해, 일반 JVM에는 어태치 기능이 내장되어 있습니다. 사용자는 jhsdb와 같은 도구를 사용하여 JVM 프로세스에 연결하고, 메모리 데이터를 보고 분석할 수 있습니다. 또한, 이러한 메모리 데이터는 소스 파일의 데이터 구조에 따라 적절히 정리되어 있어, JVM의 내장 백도어 메커니즘으로 이해할 수도 있습니다.
다음 문서에서는 JVM 어태치 메커니즘을 사용하여 메모리에 있는 클래스 파일 정보를 읽고 저장하는 방법을 소개합니다.
https://protector4j.com/ko/articles/cracking-encrypted-java-applications-jhsdb/
JDK에서 제공하는 jhsdb 도구를 사용하는 것 외에도, Alibaba의 Arthas를 사용하여 실행 중인 Java 프로세스를 분석할 수 있습니다.
HOOK 관련 함수로 동적 로드된 클래스 정보 획득
일부 보호 방법은 리플렉션을 통해 클래스 정보를 동적으로 로드하며, DLL 인젝션을 통해 실시간으로 로드되는 클래스 정보를 얻을 수도 있습니다. 자세한 내용은 다음 두 프로젝트를 참조하세요.
https://github.com/ViRb3/jvm-dump-proxy
https://github.com/zorftw/JVM-Native-Classdumping
결론
JVM 어태치 메커니즘 또는 바이너리 HOOK 메커니즘의 존재로 인해, 일반 JVM 운영에서 분리되지 않은 모든 소위 암호화된 코드는 어태치 도구를 사용하여 쉽게 읽거나 DLL 인젝션을 통해 후킹할 수 있습니다. 따라서 이것은 가장 비효과적인 보호 솔루션입니다.