이 포스트를 읽기전에 반드시 앞 포스트를 읽기를 권장한다. 어느 블로그에서 본 비유법인데 굉장히 인상적이여서 한번 적어본다. Virtualized Code(영어) → Virtualized Machin CPU(통역사) → My CPU(나) → Program 이런식으로 실제 코드를 우리 CPU(예를 들면 Intel)은 알아먹지 못하게 바꾸고, 그걸 읽을 수 있는 루틴(VM)을 프로그램내에 같이 적재해 둠으로써 일반적인 방법으로는 쉽게 접근하지 못하게 난독화 하는 것이다. 우선 기본적으로 변환된 Virtualized Code의 생김새를 살펴보겠다. (항상 이렇게 생긴건 아니라고한다.) opcode : 기본적으로 각 어셈 Instruction에는 고유한 opcode가 부여되어 있고, 프로그램이 구성될 때 해당 ..
수많은 안티디버깅 기법이 있지만, 이번에 소개할 코드가상화 기법은 사실상 안티디버깅이라고 보기는 힘들다. 안티디버깅 보다는 코드 난독화쪽에 가까운 기법을 소개하겠다. 우선 자세한 내용을 들어가기 전에, 개발자 관점에서 VCP를 구현하기 위해 생각해야되는 점들을 보겠다. 원래 코드를 어떻게 변환시킬 것인가? (Binary Translation) → 이 후 포스트에서 살펴볼 예정이다. 변환된 코드는 VM(Virtual Machin)에서 어떻게 실행을 시킬것인가? ★★★ 변환된 코드와 VM을 PE파일에 어떻게 포함시킬 것인가? 어떻게 해야 해석하기 어려운 변환코드를 만들 수 있을까? (opcode의 랜덤화) 이럴경우 어떻게 접근해야되는지 생각해보자. 코드가상화 기법이 적용된 프로그램을 살펴보면 보통 아래와 같..