본문 바로가기

스터디/파이썬 해킹 프로그래밍

Hardware Breakpoint 까지 이론, 함수 정리

하드웨어 브레이크 포인트는 CPU 디버그 레지스터의 특정 비트 값을 이용한다.

하드웨어 브레이크 포인트를 구현 할 때 가장 중요한 점은

네 개의 디버그 레지스터 중에서 어느 레지스터가 사용중이고 어느 레지스터가 사용 가능한 상태인지 항상 알고 있어야 한다는 것이다.

--> 항상 사용 가능한 디버그 레지스터를 이용해 하드웨어 브레이크 포인트를 설정하는지 확인 해야 함

--> 사용 중인 레지스터를 사용할 경우 디버거가 엉킬 수 있음


1. 프로세스 내의 모든 쓰레드 리스트를 구한다.

2. 각 쓰레드의 CPU 컨텍스트 레코드를 구한다.

3. 구한 쓰레드의 모든 context 레코드의 디버그 레지스터 중 하나 (DR0 ~ DR3 중 사용 가능한 디버그 레지스터) 에 원하는 브레이크 포인트 주소 설정

4. DR7 레지스터의 비트 설정.

==> 브레이크 포인트의 종류와 길이, 설정한 브레이크 포인트를 활성화 


일단 하드웨어 브레이크 포인트를 설정하는 루틴을 작성했다면 그 다음에는 하드웨어 브레이크 포인트로부터 발생하는 

예외를 제대로 처리할 수 있게 메인 디버그 이벤트 루프를 수정해야 한다.


하드웨어 브레이크 포인트는 인터럽트1 (INT 1) 을 발생시킨다.

--> INT 1 를 처리할 수 있는 예외 핸들러를 추가한다.


my_debugger.py 소스 참고


INT 1 이 발생하면 어느 디버그 레지스터에 하드웨어 브레이크 포인트가 설정되어 있는지 확인한다.

발생한 이벤트가 어느 하드웨어 브레이크 포인트에 의한 것인지 알아낸 다음, 해당 하드웨어 브레이크 포인트를 제거한다.

제거하기 위해서는 DR7 레지스터의 플래그 값과 브레이크 포인트 주소를 가지고 있는 디버그 레지스터의 값을 제거한다.


my_test_hw.py 참고


my_test_hw.py 의 수정된 소스를 통해 하드웨어 브레이크 포인트를 테스트 할 수 있다.


다음과 비슷한 결과를 얻을 수 있다.

Enter the PID of the process to attach to : 2504

[*] Address of printf: 0x77c4186a

Event Code: 3 Thr‘ ead ID: 37134

Event Code: 6 Thread ID: 37134

Event Code: 6 Thread ID: 37134

Event Code: 6 Thread ID: 37134

Event Code: 6 Thread ID: 37134

Event Code : 6 Thread ID: 37134

Event Code : 6 Thread ID: 37134

Event Code: 6 Thread ID: 37134

Event Code: 6 Thread ID: 37134

Event Code: 6 Thread ID: 37134

Event Code: 6 Thread ID : 37134

Event Code : 6 Thread ID: 37134 Event Code : 6 Thread ID : 37Ø4

Event Code : 6 Thr‘ ead ID: 37Ø4

Event Code : 6 Thread ID : 37Ø4

Event Code : 6 Thread ID : 37Ø4

Event Code : 6 Thread ID: 37Ø4

Event Code: 2 Thread ID: 2228

Event Code: 1 Thread ID : 2228

[ *] Exception address: 0x7c901230

[*] Hit the first breakpoint.

Event Code: 4 Thread ID : 2228

Event Code: 1 Thread 10: 3704

[*] Hardware breakpoint removed. 


출력 결과를 보면 하드웨어 브레이크 포인트가 발생하고 그 다음 해당 핸들러가 제거되었다는 것을 알 수 있다.

핸들러가 종료된 이후 디버그 이벤트를 처리하는 루프는 계속 실행된다.