성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] How can I tell whether two programs...
[정성태] The case of the fail-fast crashes c...
[정성태] Creating Docker multi-arch images f...
[정성태] BinaryFormatter removed from .NET 9...
[정성태] Extending the Windows Shell Progres...
[우광현] 와..... 범위를 잡았으니 클라이언트가 해당 범위를 확인해본다...
[정성태] 딱히, 그것 이상으로 더 설명할 내용이 없습니다. 동적 포...
[정성태] If Windows 3.11 required a 32-bit p...
[정성태] What is a hard error, and what make...
[괴물신인] 질문작성자인데 이 글을 이제봤네요 ㄷㄷ 이 글처럼 타입별로 인...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>cdb.exe를 이용해 (ntdll.dll 등에 정의된) 커널 구조체 출력하는 방법</h1> <p> 커널 구조체들이 운영체제 버전 및 패치에 민감하다 보니 코드에 해당 offset 값들을 하드 코딩하는 게 영 탐탁지 않습니다. 게다가 offset 값들을 알아보는 것도 꽤나 귀찮은 작업인데요, 매번 windbg를 실행해 "dt" 명령어를 다음과 같이 실행해 offset이 맞는지 확인하는 식입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:001> <span style='color: blue; font-weight: bold'>dt _PEB</span> ntdll!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar +0x003 BitField : UChar +0x003 ImageUsesLargePages : Pos 0, 1 Bit +0x003 IsProtectedProcess : Pos 1, 1 Bit ...[생략]... +0x7b8 LeapSecondData : Ptr64 _LEAP_SECOND_DATA +0x7c0 LeapSecondFlags : Uint4B +0x7c0 SixtySecondEnabled : Pos 0, 1 Bit +0x7c0 Reserved : Pos 1, 31 Bits +0x7c4 NtGlobalFlag2 : Uint4B </pre> <br /> 멋이 좀 덜하긴 하지만, 저 출력 작업만 명령행으로 구할 수 있다면 대강의 문자열 파싱으로 offset 값 구하는 것이 그리 어렵지 않을 것 같습니다. 이를 위해 cdb.exe를 이용할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > CDB Command-Line Options ; <a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/cdb-command-line-options'>https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/cdb-command-line-options</a> </pre> <br /> cdb, ntsd, windbg 등은 모두 같은 디버그 엔진(dbgeng.dll)을 사용하는 래퍼에 불과하다고 합니다. 또한 내부 사용 명령도 일관성을 유지하고 있는 데다 cdb.exe의 경우 명령행에서 전달하는 것도 가능하므로 다음과 같이 커널 구조체의 출력 결과를 쉽게 얻을 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>cdb -pn notepad.exe -c "dt _PEB; qd"</span> Microsoft (R) Windows Debugger Version 10.0.17763.168 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. *** wait with pending attach Unable to add extension DLL: ntsdexts Unable to add extension DLL: uext Unable to add extension DLL: exts The call to LoadLibrary(ext) failed, Win32 error 0n2 "지정된 파일을 찾을 수 없습니다." Please check your debugger configuration and/or network access. Symbol search path is: srv* Executable search path is: ModLoad: 00007ff7`d8b60000 00007ff7`d8ba3000 C:\WINDOWS\system32\notepad.exe ModLoad: 00007ff8`b76f0000 00007ff8`b78dd000 C:\WINDOWS\SYSTEM32\ntdll.dll ...[생략]... ModLoad: 00007ff8`ade60000 00007ff8`ade9e000 C:\Windows\System32\IME\IMEKR\imkrapi.dll ModLoad: 00007ff8`add90000 00007ff8`addcf000 C:\Windows\System32\IME\shared\imjkapi.dll (c3c.17a4): Break instruction exception - code 80000003 (first chance) ntdll!DbgBreakPoint: 00007ff8`b7793080 cc int 3 0:001> cdb: Reading initial command 'dt _PEB; qd' <span style='color: blue; font-weight: bold'>ntdll!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar ...[생략]... +0x7c0 SixtySecondEnabled : Pos 0, 1 Bit +0x7c0 Reserved : Pos 1, 31 Bits +0x7c4 NtGlobalFlag2 : Uint4B</span> quit: </pre> <br /> 그럼 이렇게 필터링하는 것도 가능하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>cdb -pn notepad.exe -c "dt _PEB; qd" | findstr Ldr</span> +0x018 Ldr : Ptr64 _PEB_LDR_DATA </pre> <br /> 간단하게 저 출력만 분석하면 구조체 필드의 offset 값을 하드 코딩하지 않고 사용할 수 있을 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그렇다면 cdb.exe를 실행하기 위한 최소한의 파일은 뭐가 있을까요? 우선, cdb.exe 자체는 여타 다른 의존성이 없습니다. 단지 커널 구조체를 가져오기 위해서는 대상이 되는 DLL(예를 들어 ntdll.dll)의 심벌 파일이 필요한데 cdb.exe만 복사해 실행하는 경우에는 다음과 같은 식으로 심벌 로드에 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:007> <span style='color: blue; font-weight: bold'>.sympath SRV*c:\temp*http://msdl.microsoft.com/download/symbols</span> DBGHELP: Symbol Search Path: srv*c:\temp*http://msdl.microsoft.com/download/symbols Symbol search path is: SRV*c:\temp*http://msdl.microsoft.com/download/symbols Expanded Symbol search path is: srv*c:\temp*http://msdl.microsoft.com/download/symbols ************* Path validation summary ************** Response Time (ms) Location Deferred SRV*c:\temp*http://msdl.microsoft.com/download/symbols 0:007> <span style='color: blue; font-weight: bold'>.reload /s /f ntdll.dll</span> DBGHELP: C:\WINDOWS\SYSTEM32\ntdll.pdb - file not found DBGHELP: ntdll.pdb - file not found *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\SYSTEM32\ntdll.dll - DBGHELP: ntdll - export symbols ************* Symbol Loading Error Summary ************** Module name Error ntdll The system cannot find the file specified The SYMSRV client failed to find a file in the UNC store, or there is an invalid UNC store (an invalid path or the pingme.txt file is not present in the root directory), or the file is present in the symbol server exclusion list. </pre> <br /> 그래서 지난 글에 설명한,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pdb 파일을 다운로드하기 위한 symchk.exe 실행에 필요한 최소 파일 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/12091'>http://www.sysnet.pe.kr/2/0/12091</a> </pre> <br /> 내용에 따라 (symchk.exe는 필요 없으니) 다음의 4개 파일만 함께 복사해 주시면 됩니다.<br /> <br /> <ul> <li>cdb.exe</li> <li>dbghelp.dll</li> <li>SymbolCheck.dll</li> <li>symsrv.dll</li> </ul> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1786
(왼쪽의 숫자를 입력해야 합니다.)