Windbg 명령어 모음
eb
eb 주소값 00 00 00 00 00 : 주소값부터 시작해서 5바이트를 00으로 채운다.
- 심볼이 맞는지 확인하는 명령
0:000> !chksym ntdll
- ntdll의 Export 함수 변경여부 확인하는 명령
0:000> !chkimg ntdll -d
- notepad.exe의 _EPROCESS 주소 찾기
kd> !process 0 0 notepad.exe
- notepad.exe의 스레드 주소 찾기(full detail 얻기)
kd> !process _EPROCESS 7
PROCESS 8a3ceda0 SessionId: 0 Cid: 00f0 Peb: 7ffd7000 ParentCid: 0748
DirBase: 53ca5000 ObjectTable: e180c200 HandleCount: 411.
Image: xxx.exe
VadRoot 8a27db68 Vads 103 Clone 0 Private 591. Modified 2014. Locked 0.
DeviceMap e1862530
Token e5750d48
ElapsedTime 00:04:22.375
UserTime 00:00:00.187
KernelTime 00:00:00.734
QuotaPoolUsage[PagedPool] 43944
QuotaPoolUsage[NonPagedPool] 4600
Working Set Sizes (now,min,max) (1748, 50, 345) (6992KB, 200KB, 1380KB)
PeakWorkingSetSize 1748
VirtualSize 46 Mb
PeakVirtualSize 48 Mb
PageFaultCount 4595
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 945
UserTime, KernelTime : 유난히 이 값이 높다면, 시스템 리소스를 대폭 감소시키는 프로세스라고 생각할 수 있다.
Working Set Sizes : 페이지 단위. 유난히 값이 높다면, 메모리 누수가 있거나 시스템 리소스를 대폭 감소시키는 프로세스의 표시로 볼 수 있다.
QuotaPoolUsageentries : 프로세스에서 사용되는 paged, nonpaged pool를 열거. 메모리 릭 시스템에서 모든 프로세스에서 과도한 nonpaged pool usage를 찾으면 프로세스가 메모리 릭을 갖고있다고 말할 수 있다.
- notepad.exe의 주스레드를 이용 Context Swiching
kd> .thread /p /r 주스레드
- notepad.exe의 프로세스를 이용 Context Switching
kd> !process /i XXXXXXXX
- 모든 활성화된 프로세스의 정보를 보여줘라
kd> !process 0
PROCESS 897a9da0 SessionId: 0 Cid: 0914 Peb: 7ffdb000 ParentCid: 03dc
DirBase: 6c325000 ObjectTable: e569ccd0 HandleCount: 103.
Image: alg.exe
897a9da0 : EPROCESS 주소
Cid : 프로세스 아이디
e569ccd0 : Process Object Address(이건 뭥미? !handle로 호출을 해보면 정보를 더 얻어올수 있다)
현재디버깅중인 프로세스 보여줘라
kd> !process
해당 프로세스정보를 보여줘라
kd> !process 0 0 explorer.exe
유저심볼을 로드하라
.reload /user
강제로딩
.reload /i
유저모들에서 kd로 전환
.breakin
전체시스템메모리 보기
kd>!vm
0:000> !handle (핸들 인덱스 생략이기 때문에 현재 프로세스 핸들 모두를 display)
0:000> !handle 8 f (핸들 인덱스 8에 대해서 모든 정보 display)
kd> !handle 0 4 (핸들 인덱스로 0이 입력되었기 때문에 모든 핸들 display, UMFlags값으로 4번이므로 "핸들이름"만 포함)
kd> !handle 14 13 (핸들 인덱스 14번에 대해서 "커널핸들테이블"로부터 정보 display)
bp 1002d7be "dps poi(pThunkData) L1;gc"
bp 명령어로 1002d7be 지점에 브레이크 포인트를 걸고, 이 브레이크 포인트가 Hit 되었을 때
이후에 나오는 "" 내부의 명령어를 실행하라는 의미이다.
dps 명령은 해당 메모리의 내용을 심벌로 보여주는 명령이다.
poi 는 포인터 참조 명령어로 C 언어의 * 와 같은 효과이다.
bp WS2_32!send "db poi(ebp+0x08);gc"
WS2_32!send가 Hit할때 그때의 ebp+0x08이 가리키고 있는 값을 바이트로 표시해주고 계속 실행하라는 명령
bu kernel32!CreateProcessW "db poi(esp+8)"
CreateProcessW에서 Hit할때 2번째 매개변수로 입력된 값을 보고자 할때
bu 주소값 "j eax=9 'r eax';'gc'"
bu 주소값 ".if (eax=9) {r eax} .else {gc}"
위의 구문은 strlen()명령 다음에 멈출려고 했던 명령인데, 길이가 9인 경우는 eax값을 출력하고 멈추는 것이고, 9가 아닌 다른 값이면 계속 실행하라는 의미이다. 그 아래에 있는 명령은 .if를 사용한 완전히 똑같은 명령이다. 취향에 따라서 골라서 써라.
조건 브레이크는 특정조건일때에만 멈추게 할 수 있으므로 잘 아는것이 중요하다.
위의 명령에다가 메시지를 뿌려주고자 할때에는 다음과 같이 할 수가 있다.
bu 주소값 "j eax=9 '.echo eax==9' ; 'gc'"
bu 주소값 ".if (eax=9) {.echo eax==9} .else {.echo eax!=9; gc}"
두개 이상의 명령을 사용하려면 ;으로 명령어를 구분한다.
gc커맨드를 쓰는 이유는 g커맨드는 F5결과이고 gc커맨드는 F10결과이다
핸들값이 0인 경우에는 메시지만 뿌려주고 계속 진행하고, 0이 아닌 경우는 멈춰라
bp nt!NtTerminateProcess ".if( poi(esp+4)=0 ) {.echo esp+4==0; gc} .else { }"
address에 1바이트 쓰기가 될때 멈춰라
ba w1 address
패턴모두에 대해서 멈춰라
bm notepad!Win*
bd 0-3
0번부터 3번까지를 Disable해주겠다.
0:000> dt pThunkData -r1
Local var @ 0x7f5c8 Type _IMAGE_THUNK_DATA32*
0x01001104
+0x000 u1 : _IMAGE_THUNK_DATA32::
+0x000 ForwarderString : 0x7c8107f0
+0x000 Function : 0x7c8107f0
+0x000 Ordinal : 0x7c8107f0
+0x000 AddressOfData : 0x7c8107f0
dt 명령어는 structure 를 표시해주는 명령어이고, 옵션인 –r1 은 내부에 또 다른 structure 가 있을 때 1 단계까지 펼쳐서 보여준다는 의미이다.
.reload
.reload /u kernel32.dll (디버깅 심볼 언로딩)
.reload /i kernel32.dll(강제 로딩)
.reload /f kernel32.dll(즉시 로딩)
ld
ld kernel32(deferred loading된 디버깅 심볼 로딩. 주의 확장자 없음)
lm
lmv : 상세정보볼때
lml : 디버깅 심볼이 로딩된 모듈만 보여줘라.
~
~# : 예외를 일으킨 쓰레드를 볼때 사용
k
kf : 로컬스택의 크기를 보고자 할때 사용
kn : 스택프레임 번호를 함께 본다.
.frame 1 : 해당 프레임 설정
kp : 함수정보출력
kb : 인자표시
kv : FPO 정보표시
g
gu : 현재 함수 종료까지 실행하겠다.
lmi
!lmi user32.dll (모듈상세정보표시)
x
x /v user32!BitBlt 심볼타입표시
x /v user32!BitBlt 데이터타입표시
x /n user32!Text* 이름순정렬
r
r $proc 현재 프로세스의 PEB주소, 현재 프로세스의 EPROCESS주소
r $thread 현재 스레드의 TEB주소, 현재 스레드의 ETHREAD주소
r $tpid 현재 프로세스 PID
r $tid 현재 스레드 ID
dv
dv /i (변수 심볼유형, 인자유형 표시)
dv /v (변수저장위치표시)
dt
dt _EPROCESS 주소 : 주소를 _EPROCESS형으로 변환해서 표시
dt _PEB @$peb : 현재 프로세스 PEB정보를 보여줘라
dpu
dpu 주소 l4 (UNICODE 스트링 배열을 덤프해라)
s
s -d 00100000 0010F000 C0000005 (00100000 ~ 0010F000사이에서 C00000005의 값을 찾아라)
다른 스레드는 Freeze 시키고 현재 스레드에서 한 문장 실행
~.t
스레드 0을 제외한 모든 스레드 Freeze 시키고 현재 함수 복귀할때까지 실행
~0 gu
windbg 상태에서 regedit를 열어보지 않고 레지스트리값들을 확인해 볼 수 있다.
0:000> !dreg hklm\System\Select!*
Value: "Current" - REG_DWORD: 3 = 0x00000003
------------------------------------------------------------------------
Value: "Default" - REG_DWORD: 3 = 0x00000003
------------------------------------------------------------------------
Value: "Failed" - REG_DWORD: 2 = 0x00000002
------------------------------------------------------------------------
Value: "LastKnownGood" - REG_DWORD: 4 = 0x00000004
------------------------------------------------------------------------
0:000> !uniqstack -b
Processing 2 threads, please wait
. 0 Id: ab8.de8 Suspend: 1 Teb: 7ffdd000 Unfrozen
Start: WinDbgTest!mainCRTStartup (00401ad6)
Priority: 0 Priority class: 32 Affinity: 3
ChildEBP RetAddr Args to Child
0013ff38 00401962 00252124 5c2e0280 7ffde000 WinDbgTest!OnBnClickedBtnCheckMem+0x29 [D:\Work\_Test_\_WINDBG_\WinDbgTest\WinDbgTest.cpp @ 76]
0013ff4c 00401bb9 00000001 00032c38 00033288 WinDbgTest!main+0xc [D:\Work\_Test_\_WINDBG_\WinDbgTest\WinDbgTest.cpp @ 138]
0013ffc0 7c816fe7 00252124 5c2e0280 7ffde000 WinDbgTest!mainCRTStartup+0xe3
0013fff0 00000000 00401ad6 00000000 78746341 kernel32!BaseProcessStart+0x23
. 1 Id: ab8.e6c Suspend: 1 Teb: 7ffdc000 Unfrozen
Priority: 0 Priority class: 32 Affinity: 3
ChildEBP RetAddr Args to Child
003affc8 7c981e38 00000005 00000004 00000001 ntdll!DbgBreakPoint+0x1
003afff4 00000000 00000000 00000000 00000000 ntdll!DbgUiRemoteBreakin+0x2d
Total threads: 2
해당 메모리의 속성을 보여줘라
0:000> !vprot 0013ff34
BaseAddress: 0013f000
AllocationBase: 00040000
AllocationProtect: 00000004 PAGE_READWRITE
RegionSize: 00001000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00020000 MEM_PRIVATE
할당된 가상메모리 덤프
!vadump -v
!list 명령
errlook 실행하지 말고 아래의 명령어로 해당 명령어 설명을 확인해라
!error 2
0:000> !imgreloc (로드된 모듈들의 재배치되기전의 주소 출력해라)
00400000 WinDbgTest - at preferred address
76d90000 Apphelp - at preferred address
77bc0000 MSVCRT - at preferred address
77d80000 RPCRT4 - at preferred address
77ef0000 Secur32 - at preferred address
77f50000 ADVAPI32 - at preferred address
7c800000 kernel32 - at preferred address
7c930000 ntdll - at preferred address
로드된 모듈들에 대한 커스터마이징 출력해라
!for_each_module ["명령어"]
예) !for_each_module .echo @#ModuleIndex : @#Base @#End @#ModuleName @#ImageName @#LoadedImageName
가상메모리에서 MZ검색
.imgscan
디버그 레지스터 확인
0:000> rm 0x20;r
범용레지스터 확인
0:000> rm 0x01;r
r eip=7c800000
r eax = @ebx; 수도코드를 사용해서 바꿀수 있다는 부분에 주목
r zf=0; 플래그값도 바꿀수 있다는 부분에 주목
특정주소에 어셈블 코드 삽입
a eip
00000000 sub esp,10
진수변경
n 8(10, 16)
커널모드에서 함수 사용시간 측정 명령어
kernrate -z module -j module
특정 메시지만 필터링하기
.ofilter "*test*" : test가 들어가는 모든것을 보여줘
.ofilter "test" : test만 보여줘
.ofiter /i "test" : test만 제외하고 다 보여줘
실행시 옵션 -logo, -c
출력창에 뿌려지는 문자열을 아래 명시한 파일로 생성해줘라.
windbg -logo "console.log"
실행시의 동작을 -c를 이용해서 해주는 예제
windbg -logo "console.log" -c ".reload" -c "~*kb"
watch, local 변수창에 유니코드 표시
.enable_unicode 1
비스타이상에서 DbgPrint 출력을 해줘라
ed Kd_DEFAULT_MASK 8
'⌨ DEVELOPMENT > Windows Kernel' 카테고리의 다른 글
안전모드에서도 디바이스 드라이버를 로드하기 (0) | 2015.04.26 |
---|---|
Kernel debugging Windbg Symbol Path (0) | 2015.03.21 |
댓글
이 글 공유하기
다른 글
-
안전모드에서도 디바이스 드라이버를 로드하기
안전모드에서도 디바이스 드라이버를 로드하기
2015.04.26 -
Kernel debugging Windbg Symbol Path
Kernel debugging Windbg Symbol Path
2015.03.21