브레이크 포인트(Break Point)란?
이는 중단점 또는 중지점이라고 부르며 프로그램을 의도적으로 잠시 또는 완전히 멈추게 하는 장소를 말한다
디버깅을 목적으로 브레이크 포인트를 걸게 되며 브포라고 줄이기도 한다고 한다
브레이크 포인트를 설정함으로서 레지스터와 같은 다양한 공간의 값들을 확인하면서 프로그램을 분석할 수 있다
브레이크 포인트의 종류
브레이크 포인트에도 몇가지 종류가 있다
소프트 브레이크 포인트(Soft Break Point)
프로그램을 디버깅할 때 가장 흔하게 쓰이는 방법으로서 한 바이트의 명령을 통해 프로세스 실행을 중지시키는 방법이다
그러나 이러한 방법은 실제 코드가 변경되어 CRC체크섬을 통해 변경여부를 확인해 프로그램을 종료시켜버릴 수 있다는 단점이 있다
이러한 경우를 우회할 수 있는 방법이 하드웨어 브레이트 포인트를 거는 방법이다
소프트 브레이크 포인트가 설정되는 과정은 다음과 같다
브레이크 포인트를 설정하면 해당 명령의 Opcode를 브레이크 포인트 리스트에 저장한다
그리고 해당 Opcode를 cc로 변경하여 인터럽트를 발생시킨다
( 이때 cc는 INT(trap INsTruction)3 이라는 cpu의 256개의 트랩(처음 32개가 예약되어있는 숫자)중 하나를 발생시키는 명령이다 )
cc를 통해 브레이크 포인트에 걸린 후 계속 진행하게 되면 브레이크 포인트 리스트에서 저장해 놓은 명령으로 Opcode를 다시 바꾼다
여기서 의문점이 든다
왜 실제로 브레이크 포인트를 걸었을 때 Opcode가 cc로 바뀌지 않는것일까?
그 이유는 원활한 디버깅을 위해서 표면적으로 바뀌어 보이지 않도록 개발된 것이라고 한다
하드웨어 브레이크 포인트(Hardware Break Point)
디버그 레지스터가 따로 존재하여 이를 이용한 브레이크 포인트를 설정하는 방법이다
INT1 이벤트를 발생시켜 브레이크 포인트를 작동시킨다
소프트 브레이크 포인트와 작동방식은 비슷하지만 로우레벨에서 작동하기 때문에
CPU가 명령을 수행하기 전에 브레이크 포인트 레지스터를 먼저 확인한다
위의 사진에서 볼 수 있듯이 DR0 부터 DR7까지 총 8개의 레지스터가 존재한다
0부터 3까지 총 4개의 레지스터에는 브레이크 포인트의 주소를 저장하고
4와 5는 예약되어있어 사용하지 않고
6은 디버그 이벤트의 상태정보
7은 브레이크 포인트의 사용 유무와 조건을 사용할 수 있다
7번 레지스터를 통해 특수한 상황에서 브레이크 포인트가 작동되도록 만들 수 있다
그러나 하드웨어 브레이크 포인트는 최대 4개까지밖에 설정하지 못한다는 단점이 있어 큰 메모리 영역을 다룰때는 부적합하다
이럴때는 메모리 브레이크 포인트를 사용해야 한다
메모리 브레이크 포인트(Memory Break Point)
메모리 브레이크 포인트는 브레이크 포인트는 아니지만 메모리 페이지의 권한을 변경하여 예외를 발생시켜
해당 위치에서 디버거에게 제어권한을 넘겨주는 방법이다
메모리를 페이지는 운영체제가 메모리를 처리하는 가장 작은 단위를 말하며 이는 1000바이트정도 된다고 한다
(참고로 VirtualProtectEx라는 API 함수를 이용하면 페이지의 변환을 알 수 있다고 한다)
권한은 실행, 읽기, 쓰기, 보호페이지 이렇게 4가지가 있다
해당 권한이 아닌 접근은 인터럽트를 발생시키며 보호페이지의 경우 어떠한 접근이라도 예외를 발생시긴다
'Study > reversing' 카테고리의 다른 글
코드의 흐름을 변경하는 어셈블리어 명령에 대해 알아보자 (0) | 2017.08.24 |
---|---|
함수의 호출 : 스택 프레임과 규약 그리고 프롤로그&에필로그 (0) | 2017.08.24 |
API (0) | 2017.08.24 |
리틀 엔디언 & 빅 엔디언 (0) | 2017.08.24 |
Hello 출력결과 바꿔보기 (0) | 2017.08.22 |