본문 바로가기
Study/Debugging

소프트웨어 브레이크 포인터와 하드웨어 브레이크 포인터

by 뿡뿡대마왕 2011. 9. 28.
반응형

소프트웨어 브레이크 포인터?

소프트 웨어 브레이크 포인트는 응용 프로그램을 디버깅 할 때 가장 흔하게 자주 쓰는 브레이크 포인트이다.

사용자가 지정한 주소의 값을 프로세스 이미지에서 읽어 저장후 그 부분에 0xCC로 덮어 쒸운다.
CPU가 명령어를 실행하다가 0xCC를 만나면 INT 3을 발생시키고, 운영체제는 디버거에게 디버깅 이벤트를 넘겨준당

디버거에서 이벤트를 처리하면(즉 다시 RUN하면) 백업해놨던 값을 다시 프로세스 이미지에 덮어씌우주고 디버그 중인 프로세스 실행을 재개한다~
(만약 소프트웨어 브포를 걸면 oxcc로 값이 바껴있으므로 CRC검사를 하면 디버깅중인지를 탐지 할수도 잇다.)

하드웨어 브레이크 포인트

CPU에는 디버그 레지스터가 존재한다. (DR0~ DR7까지 있음)
DR0 ~ DR3 까지는 브레이크 포인트를 걸 주소를 저장하는 용도로 사용한다
DR4와 DR5는 예약되어 있으면 DR6는 디버그 상태정보를 그리고 DR7은 브포 조건을 설정하는데 사용된당

특정 주소를 읽고 쓸 때 사용하면 유용하다. 하지만 최대 4개까지 사용 할 수 없당.

메모리 브레이크 포인트
메모리 페이지의 퍼미션을 설정하여 예외를 발생시켜 그 위치에서 디버거에게 제어권을 넘기는 형식이라고 볼수 있다.
메모리 페이지의 보호속성을 변경할수 있는데 예를 들어 어느 주소영역대의 페이지속성을 쓰기만 가능하게 해놓은다면 어느 부분에서 그 부분을 읽을려고 할때 예외가 발생하게 될 것이다...이것을 이용하는 방법이라고 할 수 있겟당
참고로 페이지 단위는 1000바이트인걸로 알고 있당
(페이지를 변환을 할수 있는 API 함수는 VirtualProtectEx()함수를 사용하면 된다.)
반응형

댓글