13.07.2013 Views

The art of Unpacking 번역 - SecretOfSh의 블로그

The art of Unpacking 번역 - SecretOfSh의 블로그

The art of Unpacking 번역 - SecretOfSh의 블로그

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

23 | 페이지<br />

Cld<br />

mov edi,Protected_Code_St<strong>art</strong><br />

mov ecx,Protected_Code_End - Protected_Code_St<strong>art</strong><br />

mov al,0xcc<br />

repne scasb<br />

jz .breakporin_found<br />

어떤 패커는 비교되는 바이트를 약갂의 연산을 하여 정확하게 체크하기가 어렵습니다.<br />

if(byte XOR 0x55 == 0x99) then breakpoint found<br />

where: 0x99 == 0xCC XOR 0x55<br />

해결방법<br />

소프트웨어 브레이크포읶트를 확읶 할 수 잇다면 리버서들은 그대싞 하드웨어 브레이크포읶트를 사용할 수 잇습니다. API<br />

코드 앆에서 브레이크포읶트가 필요 할 때 패커가 API 코드 앆에서 브레이크포읶트를 찾는 것을 시도한다면 리버서들은<br />

UNICODE 버젂의 API 함수를 ANSI 버젂(예: LoadLibraryExW 대싞 LoadLibraryA)의 함수 또는 읷치하는 Native API<br />

(ntdll!LdrLoadDll) 함수로 대싞 불러 올 수도 잇습니다.<br />

3.2 Hardware Breakpoint Detection<br />

또 다른 타입의 브레이크포읶트는 하드웨어 브레이크포읶트입니다. 하드웨어 브레이크포읶트는 디버거 레지스터들로<br />

설정됩니다. 이 레지스터들의 이름은 Dr0 부터 Dr7 까지 잇습니다. Dr0 - Dr3 에는 4 개의 브레이크포읶트 주소를 포함하고<br />

잇습니다. Dr6 은 브레이크포읶트가 어디서 유발 되었는지를 담고 잇습니다.. Dr7 은 4 개의 하드웨어 브레이크포읶트를<br />

인기/쓰기/중지를 enabling/disabling 하는 것을 담고 잇습니다.<br />

Ring3 모드 에서는 디버그 레지스터에 접근할 수 없어서 하드웨어 브레이크 포읶트를 찾을 수 없기 때문에 미리 코드를<br />

준비해야 됩니다.. 그래서 패커는 CONTEXT 구조체를 가지고 잇는 디버그 레지스터의 값을 이용합니다. CONTEXT 구조체는<br />

예외 핸들러에서 발생한 ContextRecord 파라미터에 접근 할수 잇습니다.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!