티스토리 뷰

반응형
디버거가 중단점(breakpoint)에서의 브레이크를 검출하기 위해서는, 프로세스에 「예외」 로 불리는 통상의 프로그램의 처리에서는 일어나지 않는 특수한 상황을 일으키게 할 필요가 있습니다.
프로세스에 예외가 생긴 시점에서 프로세스의 제어는 디버거로 옮기기 (위해)때문에, 디버거는 이 시점에서 프로세스의 thread에 있어서의 범용 레지스터나 스테이터스 제어 레지스터의 값등을 취득·변경 가능합니다.
알기 쉽게 말하면, 중단점(breakpoint)의 차이는 디버거가 검출하는 「예외」 의 종류의 차이입니다.
또, 이 차이에 대해 프로세스에의 다른 해석적 접근을 실시하는 것이 가능하게 됩니다.

1.코드 실행 중단점(breakpoint)

이것은, 메모리상에 전개·실행되는 코드중의 임의의 개소의 최초의 니모닉 주소(1바이트)를, 「INT3」(작동코드는 CC) 명령에 고쳐 쓰는 것입니다.
이 인터럽트 명령은 실행되면 디버그 예외 핸들러를 호출하는 특수한 것으로, 이 호출을 디버거측에서 예외로서 검출합니다.
디버거는 브레이크시에 「INT3」로 고쳐 쓴 개소를 일시적으로 오리지날의 명령에 고쳐 써, 오리지날의 명령을 실행시킵니다.

2.메모리 접근 브레이크 포인트(Memory Access BreakPoint)

이것은, 프로세스의 임의의 메모리 블록의 액세스 속성을 읽기(쓰기) 불가로 변경하는 것으로, 프로세스가 그 메모리블록내의 주소에 읽기(쓰기) 작업을 시도 했을 때에 액세스 위반을 일으키게 해 이 액세스 위반을 디버거측에서 예외로서 검출합니다.
이 중단점(breakpoint)은 메모리블록의 액세스 속성을 본래 있을 수 없는 속성으로 변경하기 위해(때문에), 프로세스를 갱신시키는 일이 있습니다.이 중단점(breakpoint) 설정에 의한 액세스 위반과 프로세스의 버그등에 의한 액세스 위반은 비슷하면서도 다른 것입니다.
후자의 경우는, 기본적으로 디버거는 EIP 해당 니모닉을 무효화 혹은 EIP의 값을 다음의 니모닉 앞의 주소에 고쳐 써 예외를 처리하지 않으면 예외로부터 빠져 나갈 수가 없습니다.다만, 액세스 위반에 따라서는, 그 예외를 무시해 처리를 속행 가능한 케이스도 있습니다.

3.하드웨어브레이크포인트(Hard breakpoint)

「Intel 80386」이후의 CPU에 내장되어 있는 디버그 레지스터를 사용해, 코드 실행 및 메모리 Access(읽고 쓰기)로 Break시키는 것입니다.
상기 1및 2와 달리, 프로세스의 코드나 메모리블록의 액세스 속성은 변경하지 않습니다.하드웨어브레이크포인트는 프로그램의 프로세스가 가지는 thread마다 설정을 실시합니다만, Windows95에서는 자동적으로 모든thread에 일괄 설정됩니다( 「OllyDbg」는 디폴트로 모든thread에 일괄 설정).디버그 레지스터 8개(DR0~DR7) 가운데, Hard breakpoint(하드웨어브레이크포인트)의 설정에는 최고 5개을 사용해, 4개소까지 중단점(breakpoint)을 설정 가능합니다.
중단점(breakpoint)의 설정 단위는 1,2,4바이트입니다만, 안전성을 생각하면 1바이트에서의 설정이 적절이라고 생각됩니다.

상기 3종의 breakpoint에 대해서는, 모두 프로세스측에서 설정된 것을 검출 가능합니다.

또, 중단점(breakpoint)이 설정되어 있지 않아도, 프로세스는 자신이 디버그 되고 있는 것을 쉽게 검출할 수 있습니다.
즉, 소프트웨어 제작자는 역 공학 대책으로서 디버거로부터 기동·Attach 혹은 breakpoint를 설정된 시점에서 실행되는, 어떠한 리버스 엔지니어전용의 처리를 소프트웨어에 알려주는 일도 가능합니다.
댓글