소프트웨어 난독화
IT 위키
- Software Obfuscation; 난독화
- 프로그램의 동작은 그대로 두면서 사람이나 도구가 분석하기 어렵게 코드를 변형하는 기술
역공학(Reverse Engineering), 무단 변조, 알고리즘 도용을 어렵게 만드는 것이 목적이다. 암호화와 달리 복호화 과정 없이 그대로 실행된다는 점이 다르다.
- 소스 코드 난독화 : 원시 코드를 변형한다. 스크립트 언어(JavaScript)나 배포되는 소스에 적용
- 바이너리 난독화 : 컴파일된 실행 파일이나 중간 언어(바이트코드)를 변형한다. Java·.NET·안드로이드 APK
| 구분 | 기법 | 내용 |
|---|---|---|
| 배치 난독화(Layout) | 식별자 변경, 주석·디버그 정보 제거, 포맷 제거 | 클래스·메서드·변수명을 a, b, c 같은 무의미한 이름으로 바꾼다. 가장 기본적이고 부작용이 적다 |
| 제어 흐름 난독화(Control) | 불투명 술어(Opaque Predicate) | 결과가 항상 같지만 정적 분석으로는 알 수 없는 조건문을 끼워 넣어 가짜 분기를 만든다 |
| 제어 흐름 평탄화(Flattening) | 중첩된 분기·반복을 하나의 거대한 switch 문과 상태 변수로 바꿔 구조를 뭉갠다 | |
| 코드 분할·병합 | 하나의 함수를 쪼개거나 여러 함수를 합친다 | |
| 가짜 코드 삽입 | 실행되지 않는 더미 코드를 넣는다 | |
| 데이터 난독화(Data) | 문자열 암호화, 상수 분할, 배열 재구성, 변수 인코딩 | 하드코딩된 키·URL 이 그대로 보이지 않게 한다 |
| 예방적 난독화(Preventive) | 역난독화 도구의 알려진 취약점을 노린 구조 사용 | 디컴파일러가 오동작하게 만든다 |
- 효력(Potency) — 사람이 이해하기 얼마나 어려워졌나
- 내성(Resilience) — 자동 역난독화 도구에 얼마나 버티나
- 은밀성(Stealth) — 난독화된 부분이 눈에 띄지 않는가
- 비용(Cost) — 실행 속도와 크기가 얼마나 늘었나
- 분석을 늦출 뿐 막지는 못한다. 충분한 시간과 실행 추적(동적 분석)으로는 결국 풀린다
- 성능 저하와 파일 크기 증가
- 디버깅과 오류 추적이 어려워진다. 배포용 매핑 파일을 따로 보관해야 한다
- 악성코드도 같은 기법을 쓴다. 백신의 탐지를 피하는 데 난독화와 패킹이 동원된다
