Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 3개 있습니다.)
디버깅 기술: 148. cdb.exe를 이용해 (ntdll.dll 등에 정의된) 커널 구조체 출력하는 방법
; https://www.sysnet.pe.kr/2/0/12092

.NET Framework: 874. C# - 커널 구조체의 Offset 값을 하드 코딩하지 않고 사용하는 방법
; https://www.sysnet.pe.kr/2/0/12098

디버깅 기술: 156. C# - PDB 파일로부터 심벌(Symbol) 및 타입(Type) 정보 열거
; https://www.sysnet.pe.kr/2/0/12114




cdb.exe를 이용해 (ntdll.dll 등에 정의된) 커널 구조체 출력하는 방법

커널 구조체들이 운영체제 버전 및 패치에 민감하다 보니 코드에 해당 offset 값들을 하드 코딩하는 게 영 탐탁지 않습니다. 게다가 offset 값들을 알아보는 것도 꽤나 귀찮은 작업인데요, 매번 windbg를 실행해 "dt" 명령어를 다음과 같이 실행해 offset이 맞는지 확인하는 식입니다.

0:001> dt _PEB
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

멋이 좀 덜하긴 하지만, 저 출력 작업만 명령행으로 구할 수 있다면 대강의 문자열 파싱으로 offset 값 구하는 것이 그리 어렵지 않을 것 같습니다. 이를 위해 cdb.exe를 이용할 수 있습니다.

CDB Command-Line Options
; https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/cdb-command-line-options

cdb, ntsd, windbg 등은 모두 같은 디버그 엔진(dbgeng.dll)을 사용하는 래퍼에 불과하다고 합니다. 또한 내부 사용 명령도 일관성을 유지하고 있는 데다 cdb.exe의 경우 명령행에서 전달하는 것도 가능하므로 다음과 같이 커널 구조체의 출력 결과를 쉽게 얻을 수 있습니다.

// "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe"

c:\temp> cdb -pn notepad.exe -c "dt _PEB; qd"

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'
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
quit:

그럼 이렇게 필터링하는 것도 가능하고,

c:\temp> cdb -pn notepad.exe -c "dt _PEB; qd" | findstr Ldr
   +0x018 Ldr              : Ptr64 _PEB_LDR_DATA

간단하게 저 출력만 분석하면 구조체 필드의 offset 값을 하드 코딩하지 않고 사용할 수 있을 것입니다.




그렇다면 cdb.exe를 실행하기 위한 최소한의 파일은 뭐가 있을까요? 우선, cdb.exe 자체는 여타 다른 의존성이 없습니다. 단지 커널 구조체를 가져오기 위해서는 대상이 되는 DLL(예를 들어 ntdll.dll)의 심벌 파일이 필요한데 cdb.exe만 복사해 실행하는 경우에는 다음과 같은 식으로 심벌 로드에 오류가 발생합니다.

0:007> .sympath SRV*c:\temp*http://msdl.microsoft.com/download/symbols
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> .reload /s /f ntdll.dll
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.

그래서 지난 글에 설명한,

pdb 파일을 다운로드하기 위한 symchk.exe 실행에 필요한 최소 파일
; https://www.sysnet.pe.kr/2/0/12091

내용에 따라 (symchk.exe는 필요 없으니) 다음의 4개 파일만 함께 복사해 주시면 됩니다.

  • cdb.exe
  • dbghelp.dll
  • SymbolCheck.dll
  • symsrv.dll




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 1/15/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  [183]  184  185  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
396정성태2/13/200730039오류 유형: 18. "Automatic Updates" 서비스 CPU 100% 점유 현상
393정성태11/8/200619564오류 유형: 17. Unable to start debugging - The binding handle is invalid.
371정성태10/23/200618751오류 유형: 16. STS Communication failed.
370정성태11/12/200622633.NET Framework: 75. Windows CardSpace 이야기 (이 글의 내용은 재작성되어질 예정입니다.)
375정성태10/25/200624653    답변글 .NET Framework: 75.1. 개인 발행 카드에 대한 Microsoft 예제 실습(이 글의 내용은 재작성되어질 예정입니다.)
376정성태10/27/200624232    답변글 .NET Framework: 75.2. "Windows CardSpace"와 "인증서 서비스"의 만남(이 글의 내용은 재작성되어질 예정입니다.)
377정성태10/26/200623882    답변글 .NET Framework: 75.3. Managed Card 발행에 대한 Microsoft 예제 실습 (1) - CardWriter (이 글의 내용은 재작성되어질 예정입니다.)
385정성태11/6/200626516    답변글 .NET Framework: 75.4. Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현 (이 글의 내용은 재작성되어질 예정입니다.) [7]
387정성태11/2/200627308    답변글 .NET Framework: 75.5. Windows CardSpace와 SYSNET 사이트의 만남 (이 글의 내용은 재작성되어질 예정입니다.) [1]
397정성태11/11/200624794    답변글 .NET Framework: 75.6. CardWriter.csproj와 함께 알아보는 인증서 식별 방법(이 글의 내용은 재작성되어질 예정입니다.)
398정성태11/12/200623310    답변글 .NET Framework: 75.7. 카드에 암호 거는 방법(이 글의 내용은 재작성되어질 예정입니다.)
399정성태11/12/200625596    답변글 .NET Framework: 75.8. 인증서/스마트 카드에 기반한 Managed Card - STS 구현(이 글의 내용은 재작성되어질 예정입니다.) [5]
369정성태10/22/200621079오류 유형: 15. 자동 업데이트 실패
367정성태10/22/200636870Windows: 3. IIS 7.0 다중 바인딩 설정하는 방법 [1]
365정성태10/21/200620590Windows: 2. 서버(build 5600)에 IIS 7.0 서비스와 .NET 3.0 설치 방법
359정성태10/17/200616694오류 유형: 14. VS.NET 빌드 오류 - FxCopCmd.exe returned error code 65.
358정성태10/17/200621898오류 유형: 13. WSE 3.0 서비스 관련 WSE101 오류 / Destination Unreachable
357정성태12/1/200624152.NET Framework: 74. WCF 이야기 [4]
378정성태10/28/200628970    답변글 .NET Framework: 74.1. WCF와 WSE 3.0의 활용 [4]파일 다운로드1
379정성태11/3/200627882    답변글 .NET Framework: 74.2. WCF로 구현하는 .NET Remoting [4]파일 다운로드1
380정성태10/28/200626834    답변글 .NET Framework: 74.3. 웹 서비스와 닷넷 리모팅으로써의 WCF 구현파일 다운로드1
381정성태10/28/200629202    답변글 .NET Framework: 74.4. WCF 서비스 참조 추가 메뉴 [2]
382정성태10/28/200635270    답변글 .NET Framework: 74.5. WCF 서비스를 IIS에서 호스팅하는 방법파일 다운로드1
383정성태10/28/200630084    답변글 .NET Framework: 74.6. IIS 6.0: 다중 Endpoint 제공파일 다운로드1
384정성태10/28/200626946    답변글 .NET Framework: 74.7. IIS 7.0: 다중 Endpoint 제공
389정성태11/11/200629798    답변글 .NET Framework: 74.8. WCF에 SSL 적용 (1) - Httpcfg.exe 도구를 이용한 SSL 설정
... 181  182  [183]  184  185  186  187  188  189  190  191  192  193  194  195  ...