자바 바이트코드 선택적 네이티브 변환으로 난독화 강화
초록
**
본 논문은 개발자가 지정한 자바 메서드들을 자동으로 C 코드로 변환하고 JNI를 통해 연결함으로써, 고수준 바이트코드가 가지고 있는 메타데이터를 제거하고 기계어 수준의 난독화를 적용할 수 있는 방법을 제시한다.
**
상세 분석
**
이 연구는 자바 프로그램의 보안성을 높이기 위해 “부분 네이티브 변환”이라는 새로운 패러다임을 도입한다. 기존의 전체 프로그램을 C로 포팅하는 방식은 호환성 문제와 유지보수 비용을 초래했지만, 저자는 애노테이션(@Obfuscate) 기반으로 변환 대상 메서드만 선택적으로 추출한다. 변환 파이프라인은 다음과 같다. 1) 자바 소스 컴파일 → 바이트코드 생성, 2) 바이트코드 분석 단계에서 애노테이션을 탐지, 3) 해당 메서드 바디를 제거하고 native 선언 및 System.loadLibrary 호출을 삽입, 4) 바이트코드 명령어를 순차적으로 C 코드로 매핑한다. 핵심은 JVM의 스택 기반 연산 모델을 C에서 동일하게 구현하는 점이다. operand stack과 로컬 변수 배열을 64비트 정수형(jvalue) 배열로 고정하고, 각 opcode를 push/pop 혹은 연산 함수로 변환한다. 예를 들어 IADD는 두 값을 pop 후 합산하여 push하는 C 코드로 치환된다. 제어 흐름은 라벨과 goto를 그대로 매핑하고, TABLESWITCH/LOOKUPSWITCH는 C의 switch 문으로 변환한다. 메서드 호출과 필드 접근은 JNI의 반사 API를 이용해 이름 기반으로 수행한다. 이 과정에서 타입 변환, 64비트 정수와 32비트 정수 간의 캐스팅, 부호·비부호 시프트 차이 등을 세심하게 처리한다. 변환된 C 코드는 플랫폼 독립적인 소스 형태이므로, 다양한 아키텍처용 공유 라이브러리(.so, .dll)로 컴파일할 수 있다. 결과적으로 원본 자바 바이트코드에 남아 있던 클래스·메서드·필드 이름, 타입 서명 등 고수준 메타데이터가 사라지고, 기계어 수준에서 난독화 도구를 적용할 수 있게 된다. 또한, 변환이 바이트코드 단계에서 이루어지므로 자바 컴파일러의 정적 검증은 그대로 유지된다. 실험에서는 변환 전후의 코드 크기, 실행 오버헤드, 난독화 저항성을 평가했으며, 변환된 부분에 대해 기존 C 난독화 툴을 적용했을 때 역공학 난이도가 현저히 상승함을 확인했다.
**
댓글 및 학술 토론
Loading comments...
의견 남기기