어떻게 하다보니 Obsidium이라는 Protector를 접했다. 처음에는 디버거 조차 붙지 않아서 몇 번의 삽질 끝에 '일단' 디버거는 붙이는 방법을 기재한다.
(1) 안티 디버깅 우회
0. x64dbg 및 ScyllaHide 플러그인 설치 (혹은 커널 레벨에서의 안티 디버깅 관련 API를 우회하고 싶으면 TitanHide 이용)
ScyllaHide : https://github.com/x64dbg/ScyllaHide/releases
1. Single Step, Breakpoint, Access Violation, illegal instruction, Divide by zero 예외 무시 처리
2. ScyllaHide 옵션을 Obsidium 옵션으로 설정
3. Shift + F9로 예외 무시 실행
디버거의 로그 창을 보면 주기적으로 다른 스레드에서 Breakpoint Exception 등을 발생시킨다는 것을 알 수 있다. 별도의 스레드를 띄워서 안티 디버깅 루틴을 동작시킨다는 의미이다.
(2) 실제 사례
2중 패킹(Obsidium + Themida)
Themida에서 다소 부족한 안티 디버깅 기능을 Obsidium에서 가져오고 API 난독화는 Themida의 기능을 가져온 것이다.
어떤 순서로 패킹했느냐가 중요한데 먼저 적용된 프로텍터의 보호 기법에 따라서 원본 코드가 보호되기 때문이다. (원본 코드는 Themida 방식으로 보호 됨)
(3) API 난독화 기법
정확히는 IAT의 주소를 난독화 된 코드 영역의 주소로 바꾼다. 예를 들어 MessageBoxA 함수의 Import Table 주소가 0x70123456 이었다면 Obsidium으로 API 난독화를 진행하면 0x70123456이 아니라 0x460100와 같은 프로텍터에서 난독화 된 코드 영역 주소로 바뀐다.
그리고 해당 난독화 코드의 영역에서 원본 API 코드를 일부 복사하여 실제 API 영역에서 실행하는 것이 아닌, 난독화 한 코드에서 일부 코드를 실행한 다음 원본 API 코드 영역으로 넘어간다. 따라서 API의 첫 번째 부분에 브레이크 포인트를 걸어도 잡히지 않는다. (Themida와 유사한 기법)
(4) Detecting PinTool
Obsidium에서는 Single Step Exception 및 NtQueryInformationProcess 함수를 이용해서 Debug Port 체크를 통해서 PinTool을 탐지한다. 따라서 이를 걷어내는 사전 작업 루틴을 APICall PinTool에 추가할 것이다.
현재 : Single Step 우회 및 NtQueryInformationProcess 후킹 완료. 아직도 안티 디버깅 루틴에 걸림.
'Unpacking > Unpacking Tech' 카테고리의 다른 글
VMProtect로 난독화 된 악성코드 분석에 대한 예시 (4) | 2017.10.18 |
---|---|
Stub Code 특성을 이용한 OEP 찾기 (0) | 2017.06.11 |
ASProtect (0) | 2017.03.03 |
Hooking 과 난독화(Obfuscation) 의 관계 (1) | 2017.01.30 |
API Backtrace 를 이용한 API 역난독화, 과연 만능일까? (0) | 2017.01.28 |