성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
[정성태] The Windows Registry Adventure #1: ...
글쓰기
제목
이름
암호
전자우편
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>
첨부파일
스팸 방지용 인증 번호
1047
(왼쪽의 숫자를 입력해야 합니다.)