Q : .class 파일을 암호화하고 사용자 지정 클래스 로더를 사용하여 즉시로드 및 해독하면 디 컴파일이 방지됩니까?
A : Java 바이트 코드 디 컴파일을 방지하는 문제는 언어 자체만큼이나 오래되었습니다. 시장에서 사용 가능한 다양한 난독 화 도구에도 불구하고 초보 Java 프로그래머는 지적 재산을 보호하기위한 새롭고 영리한 방법을 계속 생각합니다. 이 Java Q & A 기사에서는 토론 포럼에서 자주 재조명되는 아이디어에 대한 몇 가지 신화를 제거합니다.
Java .class 파일을 원본과 매우 유사한 Java 소스로 재구성 할 수있는 매우 용이성은 Java 바이트 코드 설계 목표 및 절충점과 많은 관련이 있습니다. 무엇보다도 Java 바이트 코드는 바이트 코드 인터프리터 및 JIT (just-in-time) / HotSpot 동적 컴파일러에 의한 간결함, 플랫폼 독립성, 네트워크 이동성 및 분석 용이성을 위해 설계되었습니다. 아마도 컴파일 된 .class 파일은 프로그래머의 의도를 명확하게 나타내므로 원본 소스 코드보다 분석하기가 더 쉬울 수 있습니다.
디 컴파일을 완전히 방지하지는 못하더라도 적어도 더 어렵게 만들려면 몇 가지 작업을 수행 할 수 있습니다. 예를 들어 컴파일 후 단계로 .class 데이터를 마사지하여 디 컴파일 될 때 바이트 코드를 읽기 어렵게하거나 유효한 Java 코드로 디 컴파일하기 어렵게 만들 수 있습니다 (또는 둘 다). 극단적 인 메서드 이름 오버로딩을 수행하는 것과 같은 기술은 전자의 경우 잘 작동하고 제어 흐름을 조작하여 Java 구문을 통해 표현할 수없는 제어 구조를 생성하는 것과 같은 기술은 후자의 경우 잘 작동합니다. 더 성공적인 상업용 난독 화기는 이러한 기술과 다른 기술을 혼합하여 사용합니다.
안타깝게도 두 가지 접근 방식 모두 실제로 JVM이 실행할 코드를 변경해야하며 많은 사용자가이 변환이 애플리케이션에 새로운 버그를 추가 할 수 있다는 것을 두려워합니다. 또한 메서드 및 필드 이름 변경으로 인해 리플렉션 호출의 작동이 중지 될 수 있습니다. 실제 클래스 및 패키지 이름을 변경하면 다른 여러 Java API (JNDI (Java Naming and Directory Interface), URL 공급자 등)가 손상 될 수 있습니다. 변경된 이름 외에도 클래스 바이트 코드 오프셋과 소스 행 번호 간의 연관이 변경되면 원래 예외 스택 추적을 복구하기가 어려울 수 있습니다.
그런 다음 원래 Java 소스 코드를 난독 화하는 옵션이 있습니다. 그러나 근본적으로 이것은 유사한 문제를 일으 킵니다. 난독 화가 아닌 암호화?
아마도 위의 내용은 "바이트 코드를 조작하는 대신 컴파일 후 모든 클래스를 암호화하고 JVM 내부에서 즉석에서 해독하면 어떨까요? (사용자 정의 클래스 로더로 수행 할 수 있음)"그런 다음 JVM이 내 원래 바이트 코드인데도 디 컴파일이나 리버스 엔지니어링이 필요하지 않습니다. "
불행히도, 당신이이 아이디어를 가장 먼저 떠 올렸다고 생각하고 그것이 실제로 효과가 있다고 생각한다면 당신은 틀렸을 것입니다. 그리고 그 이유는 암호화 체계의 강도와 관련이 없습니다.