소프트웨어 난독화

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) — 실행 속도와 크기가 얼마나 늘었나
  • 분석을 늦출 뿐 막지는 못한다. 충분한 시간과 실행 추적(동적 분석)으로는 결국 풀린다
  • 성능 저하와 파일 크기 증가
  • 디버깅과 오류 추적이 어려워진다. 배포용 매핑 파일을 따로 보관해야 한다
  • 악성코드도 같은 기법을 쓴다. 백신의 탐지를 피하는 데 난독화와 패킹이 동원된다

같이 보기

[편집 | 원본 편집]