코드 난독화의 문제점

코드 난독화는 자바 코드 보호에 적용된 가장 초기의 해결책이며, 가장 직접적인 해결책이기도 합니다.

코드 난독화는 일반적으로 다음과 같은 네 가지 방법을 포함합니다.

  1. 패키지 이름, 클래스 이름, 변수 이름 변환
  2. 제어 흐름 평면화, 불변 조건자 추가 등과 같은 제어 구조의 변경이 있습니다.
  3. 문자열 난독화 또는 암호화
  4. 쓸모없는 코드를 추가하세요

코드 난독화는 역컴파일된 코드의 가독성을 크게 떨어뜨리고 정적 분석의 난이도를 높일 수 있지만, 코드 난독화 방법의 종류와 관계없이 프로그램의 실행 논리는 변경되지 않습니다.

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 바이트코드는 의미론적 깊이가 높아 분석 및 해독이 매우 용이합니다. 동적 디버깅을 통해 실행 로직을 쉽게 분석할 수 있으며, 동적 디버깅 도구를 작성하는 것 자체가 그리 복잡한 작업이 아니므로 난독화는 신뢰할 수 있는 보호책이 아닙니다.