웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

break point

디버깅이 준비가 되었으면 이제 시작해야겠죠

에러가 난 덤프 파일이 있을수 있지만 아직 준비단계이기에 단축키 및 간단한 명령어등을 이용해서 WinDbg와 친해지도록 하겠습니다.

디버깅은 오류가 났을때에 덤프를 통해서 분석을 하기도 하고 Kernel live debugging을 하기 위해서도 사용할 수 있습니다.


오늘의 디버깅 방법은 driver가 load되는 시점에 bp를 걸어서 원하는 함수를 디버깅 하는 방법을 해보겠습니다.


사용되는 단축키는

F8 (step in - 함수 진입시 안으로 들어갈 때)

F9 (현재 cursor break point)

F10 (step over - 함수 안으로 진입하지 않고 다음 스텝으로 진행)

Ctrl + Break (동작중 break point)


사용되는 명령어

sxe av (set exception break when access violation)

sxe ld module (set exception break when [module] load

sxe ud module (set exception break when [module] unload

bp (break point address)

bl (break point list)

bc (break point clear)

lm (load module list)

g (go)

start

driver를 load하기 전 다음과 같이 load 시점에 exception을 걸어둡니다.


kd> sxe ld hacker_n0te.sys

kd> g



driver load시 다음과 같이 break point가 잡힐 것 입니다. (int 3은 어셈블리에서 break point 를 나타냅니다.)


nt!DebugService2+0x5:

fffff800`751d58e5 cc              int     3

kd> lm

start             end                 module name

fffff800`00000000 fffff800`0005f000   volmgrx    (deferred)             

fffff800`0005f000 fffff800`00076000   vsock      (deferred)             

fffff800`00084000 fffff800`000ea000   mcupdate_GenuineIntel   (deferred)             

fffff800`000ea000 fffff800`000f8000   werkernel   (deferred)

...

fffff800`0234f000 fffff800`02357000   hacker_n0te   (deferred)

...



load된 module list에 내가 작성한 module이 올라온것을 확인했으면 bp를 걸면 됩니다.


kd> bp hacker_n0te!DriverEntry

kd> g


위와 같이 DriverEntry를 bp로 잡아주어도 되고, 직접 작성한 function등을 잡아도 됩니다.


break point의 목록은 bl 명령어로 확인 가능하며

break point를 제거하기 위해선 bc * 혹은 bc [frame number] 등의 명령어를 사용할 수 있습니다.


다음 스크린샷에서 Disassembly 창을 보시면 DriverEntry function에서 break point가 걸린것을 확인하실 수 있습니다.

마찬가지로 bp 를 이용하여 module!function으로 원하는 함수에 bp를 걸고 디버깅이 가능하며,

F8, F9, F10 키를 이용하여 스텝단위로 디버깅을 할 수 있습니다.


또한 소스코드가 있는경우엔 Symbol 연결시 자동으로 로드 되니 더욱 편리하게 디버깅이 가능합니다.





반응형