loop-switch 구조에 효과적일 수 있는 난독화에 대해 조사하고
난독화 사용에 있어 효과적인 난독화 조합에 대해서도 조사하였다.
조사에는 Gpt의 도움을 받았다.
난독화 기법
바이너리 코드에 대한 분석을 하는 것을 감안,
단독으로 사용될 수 있는 난독화보다는 조합적으로 사용할 수 있는 난독화에 대해 조사하였다.
1. EncodeLiterals
- 핵심 효과 : 흐름 제어에 쓰이는 키값들을 정적으로는 해석할 수 없도록 인코딩
- switch case의 분기 키나 VM opcode 식별값이 숨겨지면 flow recovery가 어려움
2. DeadCode
- 핵심 효과 : 실행되지 않는 (죽은) 코드를 프로그램에 삽입해서 혼란스럽게 만듦
- switch 흐름을 직접적으로 교란하진 않지만, flatten된 구조에 간접적으로 사용 시 혼란을 유발 할 수 있음
- 단일로는 효율이 떨어짐
3. Split
- 핵심 효과 : 하나의 함수를 여러 개의 작은 함수로 분할하여 분석 난이도를 증가시킴
- dispatcher 구조처럼 tight loop 안에서 switch가 동작하는 경우에는 split이 적용 안 될 수 있음
난독화 조합
추천 :
- Virtualize + EncodeLiterals : VM 흐름 및 키 추적 차단
- Virtualize + OpaquePredicate : 가상화 + 조건 분기 불분명화
추가 :
가상화 + 흐름 난독화 (non-switch code > switch 구조 > 방해)
- Flatten + DeadCode : FSM 형태에 가짜 흐름 삽입 (노이즈 증가)
- Virtualize + Split : 함수 분할 + 조건 흐름을 애매하게 만들어 추적 방해
흐름 난독화 (switch code > 방해)
- Split + OpaquePredicate : 가상화된 흐름을 함수 단위로 분할 (정적 분석 복잡화)
루프 기반 switch 흐름에서 효과적인 난독화
1. state 값 추적 차단 : Opaque Predicate, EncodeLiterals
2. switch 안의 분기 흐름 교란 : DeadCode
3. 분기 순서를 예측하기 어렵게 만듦 : Virtualize, Split