Monthly Archive for 6월, 2009

[windbg]특정 API 모니터링하기

디버깅을 하다보면 특정API를 모니터링하고 싶어질때가 있습니다.  예를 들어 호출하는 API의 Parameter 값을 모두확인하면서 디버깅을 하고 싶다던지 말이죠. 이럴 경우  windbg의 bp ( Break Point) 명령과 .printf 를 이용하여 쉽게 모니터링이 가능합니다.

일단 bp command의 문법을 살펴보죠

[~Threadbp[ID] [Options] [Address [Passes]] ["CommandString"
[~Threadbu[ID] [Options] [Address [Passes]] ["CommandString"
[~Threadbm [OptionsSymbolPattern [Passes] ["CommandString"]

 

Kernel-Mode

bp[ID] [Options] [Address [Passes]] ["CommandString"
bu[ID] [Options] [Address [Passes]] ["CommandString"
bm [Options] SymbolPattern [Passes] ["CommandString"]

여기서 주목해봐야할 점은 가장 마지막인자인 CommandString입니다. 이 부분에 Break Point 가 걸렸을때 동작을 기술해주시면 Break Point가 걸리는 순간 CommandString에 포함된 동작을 하게 됩니다. 우리가 필요한것은 이 부분을 작성하여 Break Point가 걸리는 시점에 모니터링 하고자 하는 API의 Parameter를 Print 해주면 되겠죠.

간단히 notepad를 이용해서 테스트 해보죠. notepad를 띄우고 Windbg를 notepad에 Attach 합니다. 그리고 아래와 같이 CreateFileW에 Break Point를 걸어줍니다.

bp kernel32!CreateFileW “.printf \”CreateFileW(\%mu,\%x,\%x,\%p,\%x,\%x,\%p)\\n\”,poi(esp+0×04),poi(esp+0×08),poi(esp+0×0c),poi(esp+0×10),poi(esp+0×14),poi(esp+0×18),poi(esp+0×1c);g”

그리고 notepad를 그대로 실행해줍니다. 이제 정상적으로 Break Point가 걸린 시점에서 CreateFileW가 모니터링되는지 확인해보면 되겠죠. CreateFileW를 발생시키기위해서 “파일 열기”를 수행하게 되면 아래와 같이 발생되는 CreateFileW에 대한 Parameter가 모니터링 되는것을 확인 할 수 있습니다.

CreateFileW(\.\shadow,20,3,00000000,3,0,00000000)
CreateFileW(F:\WINDOWS\klangor.dll,
80000000,3,00076ad0,3,80,00000000)
CreateFileW(F:\WINDOWS\softcamp\sds\klangor.dll,
80000000,3,00076ad0,3,80,00000000)
CreateFileW(F:\WINDOWS\klangor.dll,
80000000,3,00076ad0,3,80,00000000)
CreateFileW(F:\WINDOWS\softcamp\sds\klangor.dll,
80000000,3,00076ad0,3,80,00000000)
CreateFileW(F:\WINDOWS\klangor.dll,
80000000,3,000772a0,3,80,00000000)
CreateFileW(F:\WINDOWS\softcamp\sds\klangor.dll,
80000000,3,000772a0,3,80,00000000)
CreateFileW(F:\WINDOWS\klangor.dll,
80000000,3,000772a0,3,80,00000000)
CreateFileW(F:\WINDOWS\softcamp\sds\klangor.dll,
80000000,3,000772a0,3,80,00000000)
CreateFileW(F:\WINDOWS\klangor.dll,
80000000,3,00076e64,3,80,00000000)
CreateFileW(F:\WINDOWS\softcamp\sds\klangor.dll,
80000000,3,00076e64,3,80,00000000)
... 생략

생각보다 쉽죠 . 이러한 방법의 모니터링은 디버깅시에 꽤 유용하게 사용이 가능합니다. 특히 DebugPrint 없이 Release 된 모듈을 디버깅할때는 이러한 방법으로 디버깅을해서 오류를 찾아내는 경우도 많습니다.

한번 활용해 보시길 … Enjoy Debugging