WinDbg 를 사용하여 특정 function 에 대한 Break Point 를 설정하는 방법에 대해서 간단한 예제를 만들었습니다. cmd 프로세스를 실행한 뒤 mkdir 명령을 사용하여 내부적으로 eMkdir 함수가 호출될 때 디버그 모드로 전환하는 방법입니다.
1. 시작 - 실행 - CMD.EXE (프로세스 실행)
2. WinDbg 실행 - File - Attach to a Process - CMD.EXE
Executable search path is:
ModLoad: 4ad00000 4ad78000 C:\WINDOWS\system32\cmd.exe
ModLoad: 7c930000 7c9ce000 C:\WINDOWS\system32\ntdll.dll
ModLoad: 7c7d0000 7c900000 C:\WINDOWS\system32\kernel32.dll
ModLoad: 77bc0000 77c18000 C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77cf0000 77d80000 C:\WINDOWS\system32\USER32.dll
ModLoad: 77e20000 77e69000 C:\WINDOWS\system32\GDI32.dll
ModLoad: 5c2e0000 5c306000 C:\WINDOWS\system32\ShimEng.dll
ModLoad: 6fd60000 6ff2a000 C:\WINDOWS\AppPatch\AcGenral.DLL
ModLoad: 77f50000 77ff8000 C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77d80000 77e12000 C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77ef0000 77f01000 C:\WINDOWS\system32\Secur32.dll
ModLoad: 76af0000 76b1b000 C:\WINDOWS\system32\WINMM.dll
ModLoad: 76970000 76aad000 C:\WINDOWS\system32\ole32.dll
ModLoad: 770d0000 7715b000 C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 77b90000 77ba5000 C:\WINDOWS\system32\MSACM32.dll
ModLoad: 77bb0000 77bb8000 C:\WINDOWS\system32\VERSION.dll
ModLoad: 7d5a0000 7dd9d000 C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77e70000 77ee6000 C:\WINDOWS\system32\SHLWAPI.dll
ModLoad: 7e8c0000 7e971000 C:\WINDOWS\system32\USERENV.dll
ModLoad: 5a480000 5a4b8000 C:\WINDOWS\system32\UxTheme.dll
ModLoad: 762e0000 762fd000 C:\WINDOWS\system32\IMM32.DLL
ModLoad: 62340000 62349000 C:\WINDOWS\system32\LPK.DLL
ModLoad: 73f80000 73feb000 C:\WINDOWS\system32\USP10.dll
ModLoad: 77160000 77263000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
ModLoad: 5c820000 5c8ba000 C:\WINDOWS\system32\comctl32.dll
(518.760): Break instruction exception - code 80000003 (first chance)
eax=7ffd5000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c93120e esp=009dffcc ebp=009dfff4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246
ntdll!DbgBreakPoint:
7c93120e cc int 3
-- mkdir 단어를 포함하는 symbol 을 확인합니다
0:001> x cmd!*mkdir*
4ad0b21f cmd!eMkdir = <no type information>
4ad342fc cmd!MkdirStr = <no type information>
-- eMkdir function 을 Breakpoint 로 설정합니다.
0:001> bp cmd!eMkdir
-- Breakpoint List
0:001> bl
0 e 4ad0b21f 0001 (0001) 0:**** cmd!eMkdir
-- cmd 프로세스를 제어할 수 있도록 Debuggee 로 제어권을 넘깁니다.
0:001> g
-- mkdir 명령으로 디렉터리를 생성합니다.
-- mkdir 명령을 수행하면 eMkdir function 이 호출되며 Breakpoint 설정 대로 디버그 모드로 자동 전환됩니다.
Breakpoint 0 hit
eax=00159501 ebx=00000001 ecx=7c94005d edx=00040002 esi=0015870c edi=00158640
eip=4ad0b21f esp=0013fc70 ebp=0013fe9c iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
cmd!eMkdir:
4ad0b21f 8bff mov edi,edi
-- Stack 를 확인해 보면 eMkdir function 이 호출된 시점에 머물러 있는 것을 확인할 수 있습니다.
0:000> kv
ChildEBP RetAddr Args to Child
0013fc6c 4ad05a92 00158640 00000000 00158640 cmd!eMkdir (FPO: [1,0,0])
0013fe9c 4ad013eb 00158640 00158640 00000002 cmd!FindFixAndRun+0x1f5 (FPO: [1,134,0])
0013fee0 4ad0f138 00000000 00000001 00000000 cmd!Dispatch+0x137 (FPO: [2,12,0])
0013ff44 4ad05154 00000001 00034038 00032c28 cmd!main+0x216 (FPO: [Non-Fpo])
0013ffc0 7c7e7077 00310033 00310036 7ffd5000 cmd!mainCRTStartup+0x125 (FPO: [Non-Fpo])
0013fff0 00000000 4ad05046 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])
-- Breakpoint 를 Clear 하고 리스트를 확인한 뒤 Quit and Detach 합니다.
0:000> bc 0
0:000> bl
0:000> qd
작성자 : Lai Go / 작성일자 : 2009.08.26