둘둘리둘둘리둘둘리둘둘리둘둘리둘
하드웨어 브레이크포인트, 동작방식 본문
@하드웨어 브레이크 포인트(Hardware Breakpoints)
Debuggee 프로세스를 수정할 수 없을경우(Software breakpoints를 사용할수 없을경우) instruction의 수정 없이 사용할 수 있는 하드웨어 브레이크 포인트가 유용하다. 하드웨어 브레이크 포인트는 debug registers 라는 특수한 레지스터에 CPU레벨에서 셋트되며, 하드웨어 브레이크 포인트를 셋트하고 관리하는 debug registers는 DR0에서 DR7까지가 있다.
DR0~DR3 : 브레이크 포인트 주소를 위해 예약됨
DR4, DR5 : Reserved
DR6 : Status register, 하드웨어 브레이크 포인트에의해 디버깅 이벤트 발생시 셋팅됨
DR7 : 다른 브레이크 포인트의 상태를 저장 (하드웨어 브레이크 포인트의 on/off 스위치)
DR7의 플레그를 설정하여 하드웨어 브레이크를 걸수있는경우는 아래와 같다.
- 특정 주소에서 명령이 실행될때
- 특정 주소에 데이터가 쓰여질때
- 특정 주소에 읽기나 쓰기가 수행될 때
DR7 레지스터 flags
Bits 0~7 : 브레이크 포인트들의 on/off스위치, Local과 Global scope가 있는데, 저자의 경험상
둘중 하나만 셋팅되어 있어도 User-mode 디버깅 중 어떤 문제도 없이 작동했다고한다.
Bits 8~15 : 일반적인 디버깅 목적으로 사용되지 않음(Intel x86 manual에 더많은 설명이있다고함)
Bits 16~31 : 브레이크 포인트의 Type과 Length를 결정
DR0 |
DR1 |
DR2 |
DR3 |
|
DR0 |
DR1 |
DR2 |
DR3 |
||||||||||||||||
L |
G |
L |
G |
L |
G |
L |
G |
|
Type |
Length |
Type |
Length |
Type |
Length |
Type |
Length |
||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 ~ 15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
Type - 00 : Break on excution, 01 : Break on data writes, 11 : Break on reads or writes but not execution
Length - 00 : 1byte, 01 : 2bytes(WORD), 11 : 4bytes(DWORD)
@하드웨어 브레이크 포인트 동작 방식
Soft breakpoints와 다르게 Hardware breakpoints는 interrupt 1(INT1)을 사용한다.
Hardware breakpoints는 Soft breakpoints와 동일한 방법으로 처리되지만, 더 낮은 레벨에서 작동된다.
CPU가 instruction을 실행하기전에 먼저 주소가 현재 hardware breakpoints에 등록되어있는지 아닌지를 확인하고, instruction에서 접근하는 메모리가 hardware breakpoints에 flagged되어있는지를 확인한다.
만약 주소가 DR0~DR3 레지스터에 있고, read, write, execute 조건이 세트되어 있다면 INT1을 발생시키고 CPU는 instruction 실행을 중단한다.
하드웨어 브레이크 포인트는 4개밖에 설정하지 못하고, 4byte 이상의 데이터에 세트할 수 없다는 제약사항이 있다.
이것은 메모리의 큰 섹션에 접근하는것을 추적하려고 할때 제약사항이될 수 있다. 그리고 그 상황을 해결하기 위해 메모리 브레이크 포인트(Memory breakpoints)를 사용할 수 있다.
출처 : Gray Hat Python - Python Programming for Hackers and Reverse Engineers(Author-Justin Seitz)
'Windows > Reversing' 카테고리의 다른 글
디버깅 이벤트(Debugging Events)관련 상수들 (0) | 2015.12.19 |
---|---|
메모리 브레이크 포인트, 동작방식 (0) | 2015.12.03 |
[Windows] 함수호출 규약 (Calling Convention) (x86) (0) | 2015.10.13 |
[ Linux ] 심볼없는 파일 메인함수 찾기 (0) | 2015.08.26 |
어셈블리어 연산자 (0) | 2015.07.15 |