AOT 컴파일의 문제점
AOT 컴파일은 Java 코드를 네이티브 코드로 변환하여 Java 프로그램의 실행 속도를 크게 향상시킵니다. 머신 코드로 변환함으로써 간접적으로 Java 코드를 보호하는 목적을 달성합니다.
Java 프로그램, 특히 다양한 프레임워크를 기반으로 하는 프로그램의 경우, 많은 동적 기능이 포함되어 있어 AOT 컴파일은 큰 도전입니다. 동시에 동적성과의 타협을 위해 컴파일된 바이너리 파일에는 여전히 많은 클래스 파일 정보가 포함될 수 있습니다. 다음 문서에서는 컴파일된 바이너리 파일을 스캔하여 클래스 정보를 얻는 프로젝트를 소개합니다. https://protector4j.com/ko/articles/extract-java-classes-information-from-aot/
바이너리 프로그램에 클래스 파일 정보가 포함되어 있지 않더라도, 실행 로직은 동일한 방식으로 여전히 존재합니다. 유일한 차이점은 표현이 바이트코드에서 머신 코드로 변경되었을 뿐, 특별한 보호가 없다는 것입니다. 컴파일 및 실행 메커니즘을 이해할 수 있다면 읽을 수 있는 코드를 역공학하는 것이 여전히 가능합니다. 다음 문서에서 그러한 프로젝트를 소개합니다. https://protector4j.com/ko/articles/graalvm-nativeimage-reverse-engineering/
결론
AOT 컴파일 구성은 어렵고, 컴파일 난이도가 높으며, 컴파일 실패 확률이 높습니다. 컴파일이 성공하더라도 코드 로직은 바이트코드 표현에서 머신 코드 표현으로만 변경됩니다. 고유한 운영 로직은 특별한 보호 없이 여전히 존재합니다. 자체적인 컴파일 및 실행 메커니즘을 이해할 수 있다면, 읽을 수 있는 코드를 역공학하는 것이 여전히 가능합니다.