Java 클래스 파일 암호화 관련 문제

난독화 외에도 클래스 파일 암호화는 쉽게 떠올릴 수 있는 코드 보호 방법입니다. 많은 방식에서 에이전트를 사용하여 클래스 파일을 암호화하고 클래스 로딩 중에 복호화합니다. 그러나 이러한 방식들은 JVM에 내장된 첨부 메커니즘이라는 중요한 점을 간과하고 있습니다.

JVM 연결 메커니즘

프로그램 동작 분석 및 모니터링을 용이하게 하기 위해 일반적인 JVM에는 첨부 파일이 함께 제공됩니다. 사용자는 jhsdb와 같은 도구를 사용하여 JVM 프로세스에 연결하고 메모리 데이터를 보고 분석할 수 있습니다. 더욱이 이러한 메모리 데이터는 소스 파일의 데이터 구조에 따라 체계적으로 정리되어 있는데, 이는 JVM에 내장된 백도어 메커니즘으로도 해석될 수 있습니다.

다음 글에서는 JVM 연결 메커니즘을 사용하여 클래스 파일 정보를 메모리에서 읽고 저장하는 방법을 소개합니다.

https://protector4j.com/articles/cracking-encrypted-java-applications-jhsdb/

JDK에서 제공하는 jhsdb 도구 외에도 Alibaba의 Arthas를 사용하여 실행 중인 Java 프로세스를 분석할 수 있습니다.

일부 보호 방법은 리플렉션을 통해 클래스 정보를 동적으로 로드하며, 이러한 접근 방식을 통해 DLL 주입을 통해 실시간으로 로드된 클래스 정보를 얻을 수도 있습니다. 자세한 내용은 다음 두 프로젝트를 참조하십시오.

https://github.com/ViRb3/jvm-dump-proxy

https://github.com/zorftw/JVM-Native-Classdumping

결론

JVM 어태치먼트 메커니즘이나 바이너리 HOOK 메커니즘의 존재로 인해, 일반적인 JVM 동작에서 분리되지 않은 모든 소위 암호화된 코드는 어태치먼트 도구를 사용하거나 DLL 인젝션을 통해 쉽게 읽을 수 있습니다. 따라서 이는 가장 비효과적인 보호 방법입니다.