1.프로젝트 개요

손지웅·2025년 3월 9일

Java 프로그램을 IR로 변환하여 난독화하는 도구 개발

1. 프로젝트 개요

이 프로젝트는 컴파일러의 코드 변환 기술을 활용하여 Java 프로그램을 IR (Intermediate Representation, 중간 표현)로 변환하고, IR을 조작하는 방식으로 코드를 난독화하는 도구를 개발하는 것을 목표로 한다.


2. 코드 난독화(Code Obfuscation)의 필요성

코드 난독화는 주로 역공학 방지, 보안 강화, 기술 보호를 위해 사용된다. 코드가 난독화되면 분석 및 변경이 어려워지며, 보안성이 향상된다. 그러나 성능 저하 및 복잡성 증가 등의 문제도 발생할 수 있다.

🔹 역공학(Reverse Engineering) 이란?

  • 이미 만들어진 소프트웨어를 분석하여 내부 동작, 원본 코드, 설계 기법 등을 추출하는 과정이다.

3. IR (Intermediate Representation, 중간 표현) 이란?

IR은 컴파일러가 프로그램을 변환하고 최적화할 때 사용하는 중간 단계의 코드 표현 방식이다.

🔹 IR 변환 과정

  • 고수준 언어 (C, Java 등) → IR → 저수준 기계어 (어셈블리어, 바이트 코드 등)

4. LLVM (Low Level Virtual Machine)

LLVM은 IR을 기반으로 최적화하고, 다양한 플랫폼으로 변환할 수 있는 컴파일러 프레임워크이다.

🔹 LLVM의 동작 과정

  1. 소스코드 → LLVM IR 변환
  2. IR 최적화
  3. 기계어 변환

🔹 MacOS에서 LLVM 설치 방법

  1. Homebrew를 이용하여 설치
    brew install llvm
  2. 환경 변수 추가
    export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
  3. 버전 확인
    llvm-config --version

🔹 LLVM 코드 실행 방법

설치가 정상적으로 완료되었다면, 간단한 코드를 실행하여 테스트해보자.

  1. LLVM IR 코드 작성
  2. LLVM을 이용해 실행
  3. 예상한 결과가 정상적으로 출력되는지 확인

5. Java로 Pretty Printer 구현하기

🔹 Pretty Printer란?

Pretty Printer는 코드를 예쁘게 출력하여 가독성을 높여주는 도구이다.

🔹 컴파일 관련 기본 개념 복습

1️⃣ Parsing (파싱)

  • 문장을 해석하는 과정으로, 코드를 분석하여 최소 의미 단위(Token)로 변환하여 해석한다.

2️⃣ Lexical Analysis (어휘 분석, 토큰화)

  • 소스 코드를 토큰 단위로 나누는 과정.
  • 예시: int a = 10;[int], [a], [=], [10], ;

3️⃣ Syntax Analysis (구문 분석)

  • 토큰을 이용하여 문장의 구조를 분석하고 AST (Abstract Syntax Tree, 추상 구문 트리)를 생성하는 과정.

🔹 AST (Abstract Syntax Tree)란?

AST는 소스 코드를 트리 구조로 변환한 데이터로, 각 노드는 코드의 구성 요소를 나타낸다.

✅ AST의 특징

  • 일반적인 문법 요소(괄호, 띄어쓰기, 세미콜론 등)는 생략됨.
  • 코드의 논리적인 구조만 유지됨.
  • 더 정교한 분석과 변환이 가능함.

✅ AST 예시

int sum = a + b * 10;

위 코드의 AST는 다음과 같이 표현된다.

       =
      / \
    sum  +
        /   \
       a     *
           /   \
          b    10

AST를 기반으로 코드를 분석하고 변환할 수 있다.


6. 결론

이번 프로젝트에서는 Java 프로그램을 IR로 변환하고, 이를 조작하여 난독화하는 도구를 개발한다. 이를 위해 LLVM을 활용하여 IR을 생성하고, 파싱과 AST를 이해하여 프리티 프린터도 직접 구현해볼 예정이다.

1개의 댓글

comment-user-thumbnail
2025년 3월 16일

저기 이거 진짜로 할 생각이면 Bytecode 를 기반으로 하는게 훨씬 좋습니다.
Java bytecode -> LLVM IR 관련 프로젝트는 찾으면 많이 나올겁니다. 참고한번 해보세요

답글 달기