코드 난독화의 문제점
코드 난독화는 자바 코드 보호에 적용된 가장 초기의 해결책이며, 가장 직접적인 해결책이기도 합니다.
코드 난독화는 일반적으로 다음과 같은 네 가지 방법을 포함합니다.
- 패키지 이름, 클래스 이름, 변수 이름 변환
- 제어 흐름 평면화, 불변 조건자 추가 등과 같은 제어 구조의 변경이 있습니다.
- 문자열 난독화 또는 암호화
- 쓸모없는 코드를 추가하세요
코드 난독화는 역컴파일된 코드의 가독성을 크게 떨어뜨리고 정적 분석의 난이도를 높일 수 있지만, 코드 난독화 방법의 종류와 관계없이 프로그램의 실행 논리는 변경되지 않습니다.
JVM 바이트코드는 의미가 명확하고 명시적인 중간 코드로, 가독성이 매우 뛰어납니다. 난독화된 클래스 파일의 경우, 가독성 있는 Java 소스 코드로 복원할 수 없더라도 바이트코드 수준에서는 분석이 가능합니다. Java 바이트코드의 높은 의미론적 특성 덕분에 이 분석 과정은 실제로 비교적 쉽습니다.
저희는 Java와 Kotlin 언어를 사용하여 JVM 바이트코드 실행 엔진을 개발했습니다. 사용자는 이 프로젝트를 통해 IntelliJ IDEA에서 Java 프로그램을 바이트코드 수준에서 동적으로 디버깅할 수 있습니다. 자세한 내용은 아래 문서를 참조하십시오.
https://protector4j.com/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
저희는 이 엔진을 사용하여 잘 알려진 난독화 코드를 해독하려고 시도했으며, 구체적인 과정은 다음 기사에서 확인할 수 있습니다.
http://protector4j.com/articles/deobfuscate-with-vlx-vmengine/
결론
위 분석에서 알 수 있듯이, JVM 바이트코드는 의미론적 깊이가 높아 분석 및 해독이 매우 용이합니다. 동적 디버깅을 통해 실행 로직을 쉽게 분석할 수 있으며, 동적 디버깅 도구를 작성하는 것 자체가 그리 복잡한 작업이 아니므로 난독화는 신뢰할 수 있는 보호책이 아닙니다.