둘둘리둘둘리둘둘리둘둘리둘둘리둘

하드웨어 브레이크포인트, 동작방식 본문

Windows/Reversing

하드웨어 브레이크포인트, 동작방식

dool2ly 2015. 12. 2. 19:53

@하드웨어 브레이크 포인트(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

L

 

Type

Length 

Type 

Length 

Type 

Length 

Type 

Length 

0

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)

Comments