WinDbg 디버깅2007. 9. 23. 02:21
반응형

s (Search Memory)

메모리에서 원하는 문자열이나 메모리 패턴을 찾을 때 사용하는 명령입니다.
디버깅할 때 종종 아주 유용하게 사용하는 경우가 있으므로 알아두시면 좋습니다.

WinDbg Help 를 보면 아주 다양한 옵션을 사용할 수 있다는 것을 알 수 있습니다.
다 알면 유용한 것들일텐데 안타깝게도 제가 다 알지를 못하고 있습니다. -_-a

유용하게 자주 사용하는 것들만 간단히 설명합니다.

[Syntax]
s [-Type] Range Pattern

Type Description
b Byte (8 bits) (default)
w WORD (16 bits)
d DWORD (32 bits)
q QWORD (64 bits)
a ASCII string(not necessarily null-terminated)
u Unicode string(not necessarily null-terminated)

Type 을 생략하면 Byte 단위로 메모리를 검색합니다.
Range 는 시작주소와 끝주소를 표시합니다.
Pattern 은 찾아야 할 패턴입니다.

WinDbg Help 에 있는 예제를 그대로 가져와서 설명합니다.

0:000> s 0012ff40 0012ff60 'H' 'e' 'l' 'l' 'o'

위 예제는 0012ff40 부터 0012ff60 까지 범위에서 H,e,l,l,o 문자패턴을 가지고 있는 메모리를 찾아 달라는 뜻입니다.
Range 를 지정하는 방법을 '시작주소 L길이' 를 사용할 수도 있는데 다음은 위에서 보인 예제와 같은 의미입니다.

0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o'

패턴을 다음과 같이 ASCII 코드 값으로 적어줘도 같은 의미입니다.

0:000> s 0012ff40 L20 48 65 6c 6c 6f

이와 같은 형식은 메모리에서 특정 숫자들이 나열되어 있는 것을 찾을 때도 사용할 수 있습니다.

옵션을 사용하여 다음과 같이 사용해도 위와 같은 의미입니다.

0:000> s -a 0012ff40 L20 "Hello"

-a 라는 Type 옵션을 주고 패턴은 "Hello" 처럼 문자열 형식으로 적어줄 수 있습니다.

예제1)

제가 작성한 드라이버를 적용한 시스템에서 메모리가 부족한 문제가 발생한 경우가 있었습니다.
문제를 검토하다 보니 가장 많이 사용될 만한 메모리 할당의 내용은 50 00 50 00 43 00 32 00 3a 00 로 시작하는 패턴을 가지고 있었습니다. 정말 이것이 과도하게 할당된 것인지 확인해 보기 위해서 NonPagedPool 시작위치부터 0x10000000 길이(대충 무지 길게 잡은 겁니다 ^^)만큼 이 패턴에 대한 검색을 수행했습니다.

kd> s 810c7000 L10000000 50 00 50 00 43 00 32 00 3a 00
810c7154  50 00 50 00 43 00 32 00-3a 00 3a 00 4e 00 65 00  P.P.C.2.:.:.N.e.
810c72b4  50 00 50 00 43 00 32 00-3a 00 3a 00 4e 00 65 00  P.P.C.2.:.:.N.e.
810c7414  50 00 50 00 43 00 32 00-3a 00 3a 00 4e 00 65 00  P.P.C.2.:.:.N.e.
810c7574  50 00 50 00 43 00 32 00-3a 00 3a 00 4e 00 65 00  P.P.C.2.:.:.N.e.
810c76d4  50 00 50 00 43 00 32 00-3a 00 3a 00 4e 00 65 00  P.P.C.2.:.:.N.e.
...
...
...

그러자 그 패턴과 일치하는 메모리 위치가 수도 없이 나열되었습니다. (정말 셀 수 없었답니다. -_-;)
이것이 버그임을 s 명령으로 검증하고 메모리를 해제하도록 버그를 수정한 사례였습니다.

예제2)

수 년전에는 프로그램을 개발할 때 Easter Egg 를 삽입하는 것이 꽤 유행했었습니다. 개발자 이름이 리스트업 된다던가 화려한 그래픽이 나온다던가 하는 식으로 유명한 프로그램들은 저마다 고유한 Easter Egg 를 가지고 있었습니다.
그 때 생각한 것이 드라이버도 Easter Egg 를 가질 수 있지 않을까 하는 것이었습니다. 그래서 V3의 드라이버는 Easter Egg 를 가지고 있답니다.
자... 한번 찾아보실까요?

먼저 lmvm 으로 V3 필터 드라이버의 시작 주소를 찾습니다.

lkd> lmvm v3flt2k
start    end        module name
ebcf6000 ebd10400   V3Flt2K    (no symbols)          
    Loaded symbol image file: \??\C:\PROGRA~1\AhnLab\V3\V3Flt2K.sys
    Image path: \??\C:\PROGRA~1\AhnLab\V3\V3Flt2K.sys
    Image name: V3Flt2K.sys
    Timestamp:        Wed Jul 12 02:55:27 2006 (44B3E60F)
    CheckSum:         000258D1
    ImageSize:        0001A400
    Translations:     0000.04b0 0000.04e0 0409.04b0 0409.04e0

s 명령으로 시작주소부터 끝주소 사이에서 VIEWEGG 라는 문자열을 찾습니다.

lkd> s -a ebcf6000 ebd10400 "VIEWEGG"
ebd0ca98  56 49 45 57 45 47 47 20-20 20 2c 25 25 25 20 20  VIEWEGG   ,%%% 

찾아진 주소 ebd0ca98 가 Easter Egg 의 시작주소입니다.
이 드라이버의 Easter Egg 는 16 x 11 의 그림입니다.
db 명령으로 볼 수 있습니다.

lkd> db ebd0ca98 L10*b
ebd0ca98  56 49 45 57 45 47 47 20-20 20 2c 25 25 25 20 20  VIEWEGG   ,%%% 
ebd0caa8  20 20 20 20 20 20 20 20-2c 25 25 25 60 25 3d 2d          ,%%%`%=-
ebd0cab8  20 20 20 20 20 20 20 2c-25 25 60 28 20 27 7c 20         ,%%`( '|
ebd0cac8  20 20 20 20 20 20 20 25-25 40 20 2f 5c 5f 2f 20         %%@ /\_/
ebd0cad8  2c 25 2e 2b 2d 25 25 20-22 40 5f 5f 20 20 20 20  ,%.+-%% "@__   
ebd0cae8  25 2f 20 20 20 20 20 20-20 20 7c 5f 5f 60 5c 20  %/        |__`\
ebd0caf8  25 5c 20 20 7c 20 5c 20-20 20 2f 20 20 2f 2f 20  %\  | \   /  //
ebd0cb08  20 3e 20 40 2d 2d 2d 5c-20 7c 20 20 5b 2f 20 20   > @---\ |  [/ 
ebd0cb18  3c 20 3c 60 20 20 20 20-7c 7c 20 20 20 20 20 20  < <`    ||     
ebd0cb28  20 60 5c 5c 20 20 20 20-7c 7c 20 20 20 20 20 20   `\\    ||     
ebd0cb38  5e 5e 5e 22 22 5e 5e 5e-22 22 5e 5e 5e 5e 5e 5e  ^^^""^^^""^^^^^^

크엇... 뭐가 보이시나요? ^^
귀여운 유니콘이 잘 보이시나요?

V3 필터 드라이버의 Easter Egg 를 찾는 방법이었습니다.
여러분의 PC 에 V3 를 사용하고 계신다면 지금 당장 한번 찾아보시지요. ^^

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=4&s_bulu=&s_key=&no=50

반응형
Posted by GreeMate