코드 난독화로 역공학 비용을 높이는 방법
코드 난독화의 목적과 소스·바이너리 계층, 레이아웃·제어 흐름·데이터 난독화 기법을 정리한다.
2026-08-14 · 최초 발행 2026-04-17
배포된 코드가 곧 분석 대상이 될 때
소프트웨어를 배포하면 바이너리와 소스코드는 역공학(Reverse Engineering)의 대상이 된다. 분석자는 내부 알고리즘을 파악하거나 보안 취약점을 찾고, 라이선스 검증 로직을 무력화하려 할 수 있다.
코드 난독화(Code Obfuscation)는 이런 분석에 대한 저항성을 높이기 위해 원시 코드를 변환하는 기술이다. 프로그램의 실행 결과와 기능은 유지하되, 소스코드 또는 바이너리를 읽고 이해하기 어렵게 만든다.
이 변환은 내부 로직 파악을 지연시키고, 독자적인 알고리즘과 영업 비밀을 보호한다. 취약점 탐색을 어렵게 해 공격 표면을 줄이는 데도 쓰이며, 불법 복제와 크래킹을 위한 라이선스 우회 역시 방해한다.
소스에서 보호된 앱까지의 변환 경로
난독화는 소스코드 수준과 바이너리 수준에서 적용할 수 있다. 변환 엔진은 코드의 외형, 실행 흐름, 데이터 표현을 바꾸고, 소스 수준의 결과물은 컴파일을 거쳐 바이너리로 이어진다.
코드의 읽히는 흔적을 지우는 레이아웃 변환
레이아웃 난독화(Layout Obfuscation)는 프로그램의 외형적인 구조를 바꾼다. 의미를 담고 있던 변수나 함수 이름을 a, b1, lIlI처럼 해석하기 어려운 문자로 치환하는 식별자 변경(Renaming)이 여기에 속한다.
주석, 들여쓰기, 공백처럼 분석에 단서가 되는 설명과 형식도 제거 대상이다. 코드가 수행하는 기능을 바꾸지 않으면서 사람이 구조를 따라가기 어렵게 만드는 방식이다.
실행 경로를 따라가기 어렵게 만드는 변환
제어 흐름 난독화(Control Flow Obfuscation)는 프로그램의 실행 순서를 복잡하게 만들어 분석을 방해한다.
제어 흐름 평탄화(Control Flow Flattening)는 조건문과 반복문을 하나의 거대한 스위치(Switch) 문으로 통합한다. 개별 로직의 연결 관계를 파악하기 어려워진다.
불투명 술어(Opaque Predicate)는 항상 참 또는 거짓이 되는 복잡한 수식을 삽입한다. 이 수식은 실행되지 않는 죽은 코드(Dead Code)로 분석을 유도한다.
데이터 의미를 숨기는 방법
데이터 난독화(Data Obfuscation)는 데이터의 저장과 처리 방식을 암호화하거나 분산시킨다. 코드 안의 평문 문자열을 암호화한 뒤 실행 시점에만 복호화하는 문자열 암호화가 대표적이다. 문자열 노출을 최소화하려는 목적이다.
변수 분리와 결합도 사용된다. 하나의 변수를 여러 변수로 나누거나 여러 변수를 하나로 합쳐, 데이터가 가진 의미를 바로 읽기 어렵게 만든다.
분석의 수지를 바꾸는 방어선
코드 난독화는 절대적인 보안책은 아니다. 충분한 시간과 자원을 가진 공격자는 결국 코드를 분석해낼 수 있다. 난독화의 가치는 분석에 드는 비용이 분석을 통해 얻는 이익보다 커지게 만드는 데 있다.
공격의 경제성을 낮춤으로써 대부분의 위협을 사전에 차단하는 심리적·기술적 방어선이 된다. 소스코드 유출이 쉬운 자바스크립트와 모바일 앱 환경에서는 현대 소프트웨어 배포의 필수 공정으로 자리 잡고 있다.
Sources
- Collberg, C., & Low, J. (2002). Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection. Addison-Wesley.
- Barak, B., et al. (2001). On the (Im)possibility of Obfuscating Programs. Advances in Cryptology — CRYPTO 2001.
- JavaScript Obfuscator Tools Documentation.