DOI QR코드

DOI QR Code

LLVM Pass를 활용한 Tigress 가상화 난독화 핵심 구조 정적 탐지 방법

Static Detection of Core Structures in Tigress Virtualization Obfuscation Using an LLVM Pass

  • 투고 : 2025.12.18
  • 심사 : 2026.01.22
  • 발행 : 2026.02.28

초록

악성코드는 분석을 어렵게 하기 위해 악성행위에 난독화 기법을 적용한다. 그 중 가상화 난독화는 공격자가 정의한 임의의 가상 머신코드를 사용하여 프로그램을 보호하는 기법으로서, 결과 코드가 길고 복잡해서 역난독화 및 분석을 어렵게 하는 강력한 난독화 방법이다. 본 논문은 이러한 가상화 난독화 코드의 역난독화를 위하여 정적 분석으로 가상화 난독화의 구조를 탐지하고자 하였다. 난독화된 코드의 가상화 난독화 작동 원리를 파악하고, LLVMIR을 이용하여 역난독화의 핵심 특징이 되는 디스패치, 핸들러, VM 영역 등 핵심 구조를 정의 및 식별하였다. 실험 결과, 최적화가 적용되지 않은 환경에서는 제안한 LLVM Pass가 switch, direct, indirect 등 주요 가상화 옵션에 대해 모든 핵심 구조를 완전하게 탐지함을 확인하였다.

Malware often uses obfuscation to hinder security analysis. Among these techniques, virtualization-based obfuscation is particularly strong because it protects programs by translating original instructions into attacker-defined virtual machine (VM) bytecode, producing long and complex code that is difficult to analyze and deobfuscate. This paper aims to identify the structural components of virtualization-based obfuscation through static analysis. By examining the execution model of obfuscated code, we define and detect the key elements required for deobfuscation-namely the dispatch routine, handler blocks, and the VM region-using LLVM IR. Experimental results show that, in the absence of compiler optimizations, the proposed LLVM Pass successfully detects all core structures across major virtualization options, including switch, direct, and indirect modes.

키워드

I. 서론

1.1 연구 배경

사이버 위협의 고도화에 따라 악성 코드의 분석 및 역공학(reverse engineering) 방어 기술 또한 발전하고 있다. 최근 악성 코드는 보안 분석가의 분석을 회피하기 위해 난독화(obfuscation) 기법[11]이 적용되며, 그 중 가상화 난독화(virtualization obfuscation)는 프로그램의 제어 흐름과 데이터를 가상의 명령어로 변환하여 역공학 난이도를 높이는 데에 사용된다. 특히, 가상화 난독화 결과 코드는 크고 복잡해서 일반적인 분석, AI 기반 분석 등에서 사용하기 어렵고, 대부분 코드 실행 및 동적 분석(dynamic analysis)에 의존하여 가상화 난독화를 역난독화 하고 있다. 그러나, 동적 분석은 커버리지 문제, 안티 디버깅 등의 제약이 존재하며, 트레이스 추출이 성공했다고 하더라도 여전히 부담스러운 크기라는 단점이 있다.

본 논문은 코드를 직접 실행하지 않는 정적 분석(static analysis)을 활용하여 가상화 난독화된 코드를 분석하는 방안을 제시한다. LLVM(Low-Level Virtual Machine) [2] IR(Intermediate Representation) 단계에서 핵심 구조를 정의 및 추출하는 방법을 제안하고, 정적 분석 기반의 도구를 개발하여, 원본 의미 해석을 위한 안정적이고 범용적으로 활용될 수 있는 정보를 탐지하고자, 가상 머신의 핵심 구조(디스패치, 핸들러, VM 영역)를 정확하게 식별하는 것을 목표로 한다. 본 연구는 Tigress를 대상으로 진행되었으나 향후 다른 상용 난독화 도구로 확장 가능할 것으로 사료된다.

II장에서는 연구 배경과 관련 연구를 소개한다. III장에서는 가상화 난독화가 적용된 코드의 구조를 분석한다. IV장에서는 정적 분석 기반으로 핵심 구조를 식별한 방법을 제시한다. V장에서는 해당 방법을 적용한 실험 결과로 정적 분석의 유효성을 검증하고, VI장에서 결론 및 향후 연구 계획을 제시 한다.

II. 연구 배경 및 관련 연구

2.1 Tigress의 가상화 난독화

가상화 난독화는 가상 기계어 명령어를 이용한 난독화 기법으로, 역공학이 매우 어렵다. 가상화된 영역은 일반적 CPU의 명령어 처리 구조와 같은 FDE(Fetch-Decode-Execute) 의 swich-loop 구조를 가진다. Fetch를 통해 가상의 VPC(Virtual Program Counter)를 가져와 Decode 후, 인식된 가상 명령어에 대응하는 핸들러를 실행하는 방식으로 동작한다. 프로그램의 의미 있는 명령어는 핸들러 내부에 파편화되고 제어 흐름이 디스패처를 통해 간접적으로 처리되므로, 기존의 분석 기법으로는 분석 대상이 되는 코드 추적 및 해당 코드의 실제 의미 해석이 매우 어렵다.

Fig.1.은 가상화 난독화를 적용한 코드의 제어흐름 그래프이다. 상단의 파란색 박스는 디스패처가 시작되는 블록으로서, switch 구조가 컴파일을 통해 중첩 조건문 형태로 변형이 된 것을 확인할 수 있다. 빨간색 박스에 있는 블록들은 핸들러이며, 이 중, 중앙의 보라색 박스는 가상화 종료 핸들러로서 디스패처 구조를 벗어나는 블록이다.

JBBHCB_2026_v36n1_147_2_f0001.png 이미지

Fig. 1. Control Flow Graph(CFG) after VM-obfuscation

본 연구에서 대상으로 하는 Tigress [1]는 공개된 난독화 도구이다. 입력으로 C 코드를 받아 난독화된 C 코드를 출력하는 소스코드 기반 난독화 도구이며, 데이터 난독화, 제어 흐름 난독화, 분석 방지(anti analysis) 등 다양한 기능 및 옵션을 제공한다. 주요 옵션으로 switch, direct, indirect를 제공한다. direct와 indirect는 switch-loop 구조를 은닉하는 쓰레드화된(threaded) 가상화를 나타내며, 그 중 indirect는 테이블 기반 분기를 사용하여 정적 분석을 더욱 어렵게 하는 것을 의도하고 있다.

2.2 기존의 가상화 난독화 역난독화 도구

가상화 역난독화를 수행하기 위해서는 먼저 가상화 난독화 여부를 판단한다. 대부분의 기존 연구들은 가상화 난독화가 이미 적용되어 있다고 가정하거나, AI모델 등을 활용하여 가상화 여부를 확인하고 있다[12]. 단순화 단계에서는 가상화 난독화된 코드의 복잡성 때문에, 값이 결정되어 드러나는 동적 분석(dynamic analysis)이 선호된다. 즉, 동적 트레이스를 추출하여 가상화 관련 구조를 분석하는 방법으로 접근하는 것이 가장 보편적이다[3-10].

그러나 가상화 난독화된 코드를 단순화 하는 동적 분석은 몇가지 한계가 있다. 무엇보다도, 난독화 코드에 분석 방지(anti analysis) 기술이 적용되어 있는 경우, 이를 실행 전에 해제시켜야 분석을 진행할 수 있다는 부담이 있고, 커버리지 문제라는 태생적 한계가 존재한다.

본 연구에서는 동적 트레이스 없이 코드만을 이용한 정적 분석을 바탕으로 구조 분석을 수행하는 방법을 제안한다. 이에 따라, 트레이스를 기반으로 정적 분석을 최종적으로 사용한 기존 연구[10]와 달리, 코드의 각 부분이 가상화된 코드에서 어떤 역할을 하는지 구조를 미리 파악함으로써 이후 분석에 도움을 준다. 또한, 본 논문은 특정 도구에 집중하여 진행되어온 기존 연구들과 유사하게, 본 연구에서는 Tigress 가상화 역난독화에 초첨을 맞추었다.

2.3 LLVM(Low-Level Virtual Machine)

LLVM은 위의 Fig.2.와 같은 모듈화된 컴파일러 및 툴체인 프레임워크로서 프론트엔드, 최적화기(optimizer), 백엔드로 구분하여 구현되어 있다. 따라서 특정 언어 및 아키텍처에 종속되지 않아 다양한 언어에 대한 분석을 효과적으로 수행할 수 있는 프레임워크이다. 특히, LLVM의 pass를 활용하면 분석가가 코드의 블록 및 함수, 명령문 등에 대해 자유롭게 접근할 수 있어서, 고안된 분석 기법을 컴파일 과정에 주입할 수 있다.

JBBHCB_2026_v36n1_147_3_f0001.png 이미지

Fig. 2. LLVM Framework structure [2]

III. 가상화 난독화 구조 분석

3.1 디스패처(Dispatcher) 구조 분석

일반적으로 가상화 난독화된 코드의 구조는 크게 세 가지 핵심적 키워드로 설명 된다. 가상 프로그램 카운터인 VPC, 가상 명령어 배열, 이들을 실행하는 인터프리터 역할을 하는 디스패처이다. 이 중 디스패처는 VPC 가상 명령어 배열, 핸들러에 기반하는 가상 머신에 대해 실행 프레임워크 역할을 한다. VPC는 다음에 실행할 핸들러를 결정하며, 가상 인터프리터 배열에 존재하는 핸들러 중 난독화 프로그램에 해당하는 실제 명령어가 순서대로 실행되도록 한다.

Tigress 난독화 도구는 다양한 디스패치 옵션을 제공하며, 본 논문에서는 주요 옵션인 switch, direct, indirect를 적용한 후의 난독화된 코드에서 발생하는 구조적 변화를 분석하였다. 먼저, switch 옵션의 경우 Fig.3.과 같이 switch-loop 구조를 가지고 있으며, 반복문(loop) 내부에서 VPC 값이 가리키는 명령이 switch-case 문을 통해 선택되어 해당 핸들러가 실행된다.

JBBHCB_2026_v36n1_147_3_f0002.png 이미지

Fig. 3. VM-obfuscated C code with switch option (in part)

direct 옵션은 Fig.4.와 같이 goto 명령어를 이용한 쓰레드화된 코드 형태를 취한다. 쓰레드화된 코드 형태란 핸들러 내부에서 다음 핸들러로 직접 분기하는 구조로서, 핸들러 내부에서 VPC를 직접 변화시키고 goto 목적지에 다음 핸들러의 시작점이 존재하게 된다. indirect 옵션은 direct 옵션과 유사하나, 분기 시 VPC 값을 이용해 핸들러 주소로 구성된 점프테이블을 참조하여 해당하는 레이블로 간접 분기하게 된다.(Fig. 5.)

JBBHCB_2026_v36n1_147_3_f0003.png 이미지

Fig. 4. VM-obfuscated C code with direct option (in part)

JBBHCB_2026_v36n1_147_4_f0001.png 이미지

Fig. 5. VM-obfuscated C code with indirect option (in part)

IV. 정적 분석 기반 핵심 구조 식별

4.1 LLVM IR 분석 환경 구축

정적 분석을 수행하기 위해 먼저 LLVM 22.0.0 기반의 분석 환경을 구축하였다. 분석은 Ubuntu 24.04 환경에서 진행되었으며, 실험 데이터는 C 언어로 작성된 코드를 대상으로 Tigress 4.0.11 난독화 도구의 가상화 난독화를 적용하여 생성하였으며, 가상화에 초점을 맞추기 위해 다른 난독화 옵션은 배제하였다. LLVM Pass 실행에 맞추어 Tigress 난독화 환경 옵션을 Linux, Clang으로 설정하였다. 즉, 일반 C 파일을 Tigress 특정 옵션으로 난독화 한 후, 난독화된 C 코드를 Clang 컴파일러를 통해 LLVM IR로 변환하였으며, 해당 결과로 생성된 파일을 이용하여 정적 분석을 수행하였다. 현재는 소스 코드로부터 얻은 IR에 대해 분석되었으나, 향후 바이너리 코드 리프팅 도구로부터 얻은 IR에 대해서도 확대 적용이 가능할 것으로 사료된다.

4.2 특징 기반 LLVM Pass 설계 및 구현

가상화 난독화된 프로그램을 분석하기 위해서는 가상화된 가상 머신의 구조를 파악하는 것이 중요하므로, 본 논문에서는 LLVM IR 분석을 통해 가상화 난독화된 코드의 핵심 구조를 탐지하는 LLVM Pass를 구현하였다. 본 연구에서 정의한 핵심 구조는 Table 1과 같이 디스패치 시작 지점(Dispatch Start), handler 블록(Handler), VM 영역의 시작 및 종료 지점(VM Start/End)으로 정의하였다. 이로써 코드 실행 없이 난독화된 코드의 제어 흐름을 정적으로 분석하였다. 결과적으로 정적 분석을 통해 추출한 난독화된 코드의 특정 구조적 특징은 특수하게 고안된 가짜(dummy) 함수 호출 명령 형태로 LLVM IR에 삽입하여 바이너리 코드 단계에서도 핵심구조 탐지에 활용 가능할 수 있도록 하였다1).

Table 1. Definitions of key elements in virtualization obfuscation structure

JBBHCB_2026_v36n1_147_4_t0001.png 이미지

4.2.1 디스패치 시작 지점 식별

가상화 구조 중 디스패치 시작 지점은 가상 머신의 실행 프레임워크가 시작되는 지점이며, 모든 핸들러로 분기되는 허브 블록이다. 따라서 이러한 디스패치 시작점은 가장 많은 진출 점을 가진다. Fig.6.의 코드는 함수 F에 존재하는 모든 기본 블록(basic block)을 순회하며, 가장 많은 진출 점을 가진 기본 블록을 Dispatch Start로 지정한다.

JBBHCB_2026_v36n1_147_5_f0001.png 이미지

Fig. 6. Locating dispatcher block (LLVM Pass)

Tigress 도구 내에서 direct 및 indirect 옵션은 쓰레드화된 코드 형태를 취함에도 불구하고 이러한 중앙 허브 블록이 나타난다. 그 이유는, 각 핸들러 종료 시점에서 거의 동일한 goto 명령2)을 사용하기 때문에, 하나의 공통 블록을 반복 활용하도록 컴파일러가 기본적으로 변환하기 때문으로 확인하였다. 즉, direct, indirect 옵션도 가장 많은 진출 점을 가진 블록으로 Dispatch Start 블록을 구분할 수 있다.

4.2.2 핸들러 블록 식별

Handler 블록은 원본 프로그램의 실제 동작을 담당하는 최소 단위의 코드 블록이다. 앞서 설명한 Dispatch Start가 중앙 허브 블록의 역할을 담당하고 있으므로, 여기서 분기되는 모든 블록은 핸들러로 볼 수 있다. 이를 기반으로 Dispatch Start 블록의 모든 후행자(successor)를 Handler 블록으로 정의하였다.

4.2.3 VM 영역 시작/종료 식별

VM 영역은 실제로 가상화 난독화가 적용된 코드의 전체 범위를 나타낸다. VM Start는 Dispatch 블록을 호출하는 블록으로 정의하였으며 실제로 난독화된 코드에서 가상화 이전 코드와의 비교를 통해 실제 해당 부분이 VM 영역의 시작 지점임을 확인하였다. VM 종료 지점의 경우 Handler 블록 중에서 Dispatch 블록으로 다시 분기하지 않고 프로그램의 VM 로직을 종료시키는 Handler 블록으로 정의하였다.

V. 실험 결과

5.1 실험 환경 및 데이터

본 실험은 LLVM IR 분석 환경과 동일하며, 정렬, 팩토리얼, 피보나치 수열 등 다양한 반복문 구조를 가진 C 코드를 대상으로 수행되었다. 해당 코드들에 Tigress의 주요 가상화 옵션(switch, direct, indirect)을 적용한 후, Clang 을 통해 비최적화(-O0) 및 다양한 최적화 수준(-O1, -O2, -O3, -Ofast, -Og, -Os, -Oz)의 LLVM IR을 생성하였다. 분석 결과, 최적화 적용 시 단일 분기 블록의 병합 등 제어 흐름 그래프(CFG)의 단순화가 공통적으로 관찰되었다. 이에 따라, 본 연구에서는 구조적 변형이 가장 두드러지게 나타나는 -O3를 대표 실험군으로 선정하여 -O0과 비교 분석하였다.

5.2 핵심 구조 식별 결과 및 토의

Fig. 7.은 가상화 난독화 코드를 대상으로 LLVM Pass를 실행하여 핵심 구조를 파악한 결과이다. Table 2에는 세 가지 제어구조에 대한 핵심 구조 탐지 여부를 정리하였다. 최적화 수준이 -O0인 경우, 제안하는 방법을 통해 VM Dispatch, VM Handler, VM 시작/종료 등 네 가지 핵심 구조를 모두 성공적으로 식별하였다.

JBBHCB_2026_v36n1_147_6_f0001.png 이미지

Fig. 7. Execution of the proposed llvm pass

Table 2. The result of experiment

JBBHCB_2026_v36n1_147_5_t0001.png 이미지

다만, -O3 최적화가 적용된 LLVM IR에서는 가상화 구조의 시작점인 VM Start 블록 특정에 한계가 있었다. 이는 최적화 과정에서 main 함수와 VM Start 블록이 병합되었기 때문이며, 향후 LLVM Pass를 통해 인위적인 분기문을 삽입하여 두 블록을 분리한다면 충분히 해결 가능할 것으로 사료된다.

본 연구는 기존 연구와 달리 동적 정보 없이 정적 분석만을 활용한 기법이라는 점에서 차별성을 가진다. 또한, 바이너리 수준의 분석을 위해 필요한 리프팅 단계 역시 향후 고성능 리프터가 확보된다면 본 기법을 바이너리 영역까지 효과적으로 확장할 수 있을 것으로 기대할 수 있다.

VI. 결론

본 논문은 가상화 난독화된 코드의 핵심 구조를 정적으로 식별하는 방법에 대하여 연구하였다. 이를 통해, 동적 트레이스를 추출하지 않고도 난독화된 코드만 자동 분석함으로써 난독화 코드의 디스패처 및 VM 구조의 뼈대를 확인할 수 있다. LLVM Pass를 활용하였으며, 다양한 가상화 옵션을 분석하였다. 향후, 이러한 핵심 구조 분석 방법을 기반으로, 난독화된 코드의 의미적 해석을 수행하는 방안과 동적 분석과 시너지를 내는 방안에 대해 연구할 계획이다.

참고문헌

  1. Tigress, "Tigress C obfuscator," Available: https://tigress.wtf/introduction.html, Jan. 2026.
  2. LLVM, "The LLVM Compiler Infrastructure," Available: https://llvm.org/, Jan. 2026.
  3. GitHub, "VMProtect-devirtualization" Available: https://github.com/JonathanSalwan/VMProtect-devirtualization, Jan. 2026.
  4. J. Jeon and T. Han, "Dynamic Analysis of Virtualization-Obfuscated Binary Executables," Journal of KISS : Software and Applications, 40(1), pp. 61-71, Jan. 2013.
  5. S. Kim, "Code Automatic Analysis Technique for Virtualization-based Obfuscation and Deobfuscation," Journal of Korea Institute of Information, Electronics, and Communication Technology, 11(6), pp. 724-731, Dec. 2018. https://doi.org/10.17661/JKIIECT.2018.11.6.724
  6. C. Bang et al., "VMProtect Operation Principle Analysis and Automatic Deobfuscation Implementation," Journal of the Korea Institute of Information Security & Cryptology, 30(4), pp. 605-616, Aug. 2020.
  7. S. Park and Y. Park, "Analysis of Anti-Reversing Functionalities of VMProtect and Bypass Method Using Pin," KIPS Transactions on Computer and Communication Systems, 10(11), pp. 297-304, Nov. 2021. https://doi.org/10.3745/KTCCS.2021.10.11.297
  8. S. Lee and T. Han, "A Dynamic Approach to Extract the Original Semantics and Structure of VM-based Obfuscated Binary Executables," Journal of KIISE, 41(10), pp. 859-869, Oct. 2014. https://doi.org/10.5626/JOK.2014.41.10.859
  9. D. Xu et al., "VMHunt: A Verifiable Approach to Partially-Virtualized Binary Code Simplification," Proceedings of the 2018 ACM SIGSAC Conference on Computer and Communications Security (CCS '18), pp. 442-458, Oct. 2018.
  10. A. Kalysch, J. Götzfried, and T. Müller, "VMAttack: Deobfuscating Virtualization-Based Packed Binaries," Proceedings of the 12th International Conference on Availability, Reliability and Security (ARES '17), pp. 1-10, Aug. 2017.
  11. C. Collberg, C. Thomborson, and D. Low, "A taxonomy of obfuscating transformations," Technical Report, Department of Computer Science, The University of Auckland, New Zealand, Jul. 1997.
  12. D. Yoo et al., "CNN based Virtualized Obfuscated malware detection technique," Proceedings of Symposium of the Korean Institute of communications and Information Sciences, Gangwon, pp. 66-67, Jan. 2024.