소프트웨어 난독화
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) - 실행 속도와 크기가 얼마나 늘었나