Unpacking 작업에서 가장 중요하고 첫 번째로 진행하는 과정은 OEP 를 찾는 과정이다. 요즘 Packer/Protector 들의 보호기법이 악랄해지고, 각종 Trap 들을 많이 설치해서 OEP 찾는 과정도 순탄치가 않다.
기본적인 원리를 무시한 상태로 편법만을 쓰는 것을 선호하지 않지만, 구버전의 Packer/Protector 로 Packing 된 바이너리의 OEP 를 빠르게 찾는 방법을 지금까지 공부한 내용만큼 정리해본다.
1.일반적으로 Decode 루틴 진입 전에 PUSHAD 를 해서 기존의 레지스터들을 백업한다. 그 다음은 POPAD 를 이용해서 레지스터들을 복구한다. Hardware Breakpoint 를 이용해서 해당 Stack 에 접근 시도하는 부분을 찾은 다음에 근처에 JMP 명령, Call 명령, 또는 PUSH 주소 RET 형태의 명령들을 유심히 살펴본다.
2.IAT 에 LoadLibrary, GetProcAddress, VirtualProtect 정도의 함수만 있다. ASProtect 의 경우에는 OEP 로 점프하는 부분 근처에서 GetSystemTime 함수를 호출하는데 이 함수에 BP 를 걸어서 실행하면 2번의 호출 후에 OEP 로 점프하는 부분이 있다.
3.OEP 에는 원래의 Code 가 실행될텐데, Stub Code 가 등장하고 main 또는 WinMain 함수가 호출된다. Stub Code GetVersion(Ex), GetCommandLine(A/W) 함수를 호출하는데 해당 함수를 호출하는 부분에서 OEP 를 찾아본다.
'Unpacking > Unpacking Tech' 카테고리의 다른 글
ASProtect (0) | 2017.03.03 |
---|---|
Hooking 과 난독화(Obfuscation) 의 관계 (1) | 2017.01.30 |
API Backtrace 를 이용한 API 역난독화, 과연 만능일까? (0) | 2017.01.28 |
Themida 가 사용하는 API Redirect (1) | 2017.01.22 |
API Redirect 기법이 적용된 Protector 에 대한 교과서적 접근 방법 (0) | 2017.01.19 |