Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 12개 있습니다.)

windbg - 풀 덤프 파일로부터 .NET DLL을 추출/저장하는 방법

(2022-10-09 업데이트) 아래의 글에 설명한 방법 외에 "리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 모든 닷넷 모듈을 추출하는 방법"에서 설명한 SaveModules.zip을 빌드한 프로그램을 사용하셔도 됩니다.




예전에도, Managed와 Native DLL에 대해 파일로 추출해서 저장하는 방법을 소개해 드렸는데요.

닷넷 응용 프로그램에서 특정 예외가 발생했을 때 풀 덤프받는 방법
; https://www.sysnet.pe.kr/2/0/1376

windbg - 덤프 파일로부터 네이티브 DLL을 추출하는 방법
; https://www.sysnet.pe.kr/2/0/1386

최근에 받은 full dump 파일로부터 .NET DLL을 저장하려고 해보니... ^^; lm 명령어에 해당 .NET DLL이 보이질 않습니다. 그런데, 그 DLL만 없는 것이 아니고 전체적으로 Managed DLL이 목록에 나타나질 않았는데, 실제로 다음은 .NET MVC Framework 기반의 웹 응용 프로그램의 풀 덤프를 받아 lm 명령으로 모듈을 나열한 결과입니다.

0:018> lm
start             end                 module name
00000000`773f0000 00000000`774c2000   msvcr100   (deferred)             
00007ff6`180b0000 00007ff6`180ba000   w3wp       (deferred)             
00007ffd`1d1e0000 00007ffd`1d2e6000   diasymreader   (deferred)             
00007ffd`1e360000 00007ffd`1e6ad000   System_Data   (deferred)             
00007ffd`23b00000 00007ffd`23b25000   System_EnterpriseServices_Wrapper   (deferred)             
00007ffd`23c30000 00007ffd`23c50000   clrcompression   (deferred)             
00007ffd`23d70000 00007ffd`23dd8000   OraOps12   (deferred)             
00007ffd`255a0000 00007ffd`255a8000   webengine   (deferred)             
00007ffd`255b0000 00007ffd`255bb000   wbhst_pm   (deferred)             
00007ffd`257b0000 00007ffd`257be000   gzip       (deferred)             
00007ffd`25c10000 00007ffd`25c1b000   aspnet_filter   (deferred)             
00007ffd`25c20000 00007ffd`25c31000   authsspi   (deferred)             
00007ffd`25c40000 00007ffd`25c4e000   authbas    (deferred)             
00007ffd`25c50000 00007ffd`25c59000   validcfg   (deferred)             
00007ffd`25c60000 00007ffd`25c74000   filter     (deferred)             
00007ffd`25c80000 00007ffd`25ca0000   isapi      (deferred)             
00007ffd`25e50000 00007ffd`25e63000   wsnmp32    (deferred)             
00007ffd`25e70000 00007ffd`25ebd000   System_Transactions   (deferred)             
00007ffd`25ec0000 00007ffd`25ef8000   oraons     (deferred)             
00007ffd`25f00000 00007ffd`25f96000   cryptui    (deferred)             
00007ffd`26010000 00007ffd`2603c000   iisfreb    (deferred)             
00007ffd`26040000 00007ffd`2fa25000   OraOCIEI12   (deferred)             
00007ffd`2fa60000 00007ffd`2fb08000   oci        (deferred)             
00007ffd`2fd60000 00007ffd`2fd7d000   iisetw     (deferred)             
00007ffd`2ffc0000 00007ffd`2ffce000   modrqflt   (deferred)             
00007ffd`2ffd0000 00007ffd`2ffe0000   cscapi     (deferred)             
00007ffd`30000000 00007ffd`30009000   iisreqs    (deferred)             
00007ffd`30010000 00007ffd`3001d000   loghttp    (deferred)             
00007ffd`30020000 00007ffd`3002f000   custerr    (deferred)             
00007ffd`30030000 00007ffd`30135000   clrjit     (deferred)             
00007ffd`303f0000 00007ffd`303fe000   authanon   (deferred)             
00007ffd`30400000 00007ffd`3040d000   static     (deferred)             
00007ffd`30430000 00007ffd`3043a000   redirect   (deferred)             
00007ffd`30440000 00007ffd`3048f000   iiscore    (deferred)             
00007ffd`30490000 00007ffd`30566000   MSVCR120_CLR0400   (deferred)             
00007ffd`30580000 00007ffd`30edc000   clr        (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\clr.pdb\9194AEC366064E5E9D09042A2DE1F46D2\clr.pdb
00007ffd`30ee0000 00007ffd`30eea000   version    (deferred)             
00007ffd`30ef0000 00007ffd`30f88000   mscoreei   (deferred)             
00007ffd`30fa0000 00007ffd`30faa000   protsup    (deferred)             
00007ffd`30fb0000 00007ffd`30fba000   dirlist    (deferred)             
00007ffd`30fc0000 00007ffd`30fcc000   httpapi    (deferred)             
00007ffd`30fd0000 00007ffd`30fd9000   defdoc     (deferred)             
00007ffd`30fe0000 00007ffd`31078000   webengine4   (deferred)             
00007ffd`31130000 00007ffd`31194000   mscoree    (deferred)             
00007ffd`311b0000 00007ffd`311c1000   compstat   (deferred)             
00007ffd`312e0000 00007ffd`312f0000   cachhttp   (deferred)             
00007ffd`313e0000 00007ffd`313e8000   cachtokn   (deferred)             
00007ffd`31410000 00007ffd`31427000   samcli     (deferred)             
00007ffd`315d0000 00007ffd`3160b000   mlang      (deferred)             
00007ffd`317e0000 00007ffd`31819000   iisres     (deferred)             
00007ffd`31b80000 00007ffd`31bfb000   nativerd   (deferred)             
00007ffd`31c00000 00007ffd`31c4a000   iisutil    (deferred)             
00007ffd`31cd0000 00007ffd`31ce4000   NapiNSP    (deferred)             
00007ffd`31cf0000 00007ffd`31cfb000   secur32    (deferred)             
00007ffd`32230000 00007ffd`3223a000   cachfile   (deferred)             
00007ffd`32240000 00007ffd`3225e000   w3dt       (deferred)             
00007ffd`32260000 00007ffd`32276000   w3wphost   (deferred)             
00007ffd`324d0000 00007ffd`324dc000   winrnr     (deferred)             
00007ffd`32810000 00007ffd`32819000   rasadhlp   (deferred)             
00007ffd`328f0000 00007ffd`328fb000   ktmw32     (deferred)             
00007ffd`32b50000 00007ffd`32b69000   dhcpcsvc   (deferred)             
00007ffd`32b80000 00007ffd`32b94000   dhcpcsvc6   (deferred)             
00007ffd`32c90000 00007ffd`32c98000   cachuri    (deferred)             
00007ffd`32ca0000 00007ffd`32cab000   w3tp       (deferred)             
00007ffd`32fb0000 00007ffd`33018000   FWPUCLNT   (deferred)             
00007ffd`33160000 00007ffd`3316a000   winnsi     (deferred)             
00007ffd`33170000 00007ffd`331a8000   xmllite    (deferred)             
00007ffd`33200000 00007ffd`33229000   IPHLPAPI   (deferred)             
00007ffd`34120000 00007ffd`34150000   ntmarta    (deferred)             
00007ffd`34500000 00007ffd`34515000   netapi32   (deferred)             
00007ffd`34520000 00007ffd`346a8000   dbghelp    (deferred)             
00007ffd`34730000 00007ffd`34749000   nlaapi     (deferred)             
00007ffd`35780000 00007ffd`3581f000   SHCore     (deferred)             
00007ffd`35b70000 00007ffd`35b7c000   netutils   (deferred)             
00007ffd`35b80000 00007ffd`35b96000   wkscli     (deferred)             
00007ffd`35ba0000 00007ffd`35ba9000   dpapi      (deferred)             
00007ffd`35bb0000 00007ffd`35bba000   kernel_appcore   (deferred)             
00007ffd`360f0000 00007ffd`360fe000   pcwum      (deferred)             
00007ffd`36370000 00007ffd`363a5000   rsaenh     (deferred)             
00007ffd`36460000 00007ffd`3647e000   userenv    (deferred)             
00007ffd`364c0000 00007ffd`36563000   dnsapi     (deferred)             
00007ffd`366b0000 00007ffd`36708000   mswsock    (deferred)             
00007ffd`36710000 00007ffd`3672e000   cryptsp    (deferred)             
00007ffd`36940000 00007ffd`36966000   bcrypt     (deferred)             
00007ffd`36a60000 00007ffd`36a85000   srvcli     (deferred)             
00007ffd`36c30000 00007ffd`36c5b000   sspicli    (deferred)             
00007ffd`36c60000 00007ffd`36cc0000   bcryptPrimitives   (deferred)             
00007ffd`36cc0000 00007ffd`36cca000   CRYPTBASE   (deferred)             
00007ffd`36cd0000 00007ffd`36d67000   sxs        (deferred)             
00007ffd`36e50000 00007ffd`36e64000   profapi    (deferred)             
00007ffd`36f00000 00007ffd`36f12000   msasn1     (deferred)             
00007ffd`36fd0000 00007ffd`371a7000   crypt32    (deferred)             
00007ffd`37200000 00007ffd`3730f000   KERNELBASE   (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\kernelbase.pdb\5C8EFE66B1EA441D80F6E43552F28A7F2\kernelbase.pdb
00007ffd`37360000 00007ffd`373b7000   sechost    (deferred)             
00007ffd`373e0000 00007ffd`373e7000   psapi      (deferred)             
00007ffd`373f0000 00007ffd`375c6000   combase    (deferred)             
00007ffd`37610000 00007ffd`37661000   shlwapi    (deferred)             
00007ffd`37670000 00007ffd`377aa000   kernel32   (deferred)             
00007ffd`37810000 00007ffd`37946000   rpcrt4     (deferred)             
00007ffd`37950000 00007ffd`37a07000   oleaut32   (deferred)             
00007ffd`37bf0000 00007ffd`37c48000   ws2_32     (deferred)             
00007ffd`37f30000 00007ffd`37fd5000   advapi32   (deferred)             
00007ffd`37fe0000 00007ffd`38084000   clbcatq    (deferred)             
00007ffd`38090000 00007ffd`38099000   nsi        (deferred)             
00007ffd`380a0000 00007ffd`38147000   msvcrt     (deferred)             
00007ffd`381c0000 00007ffd`38338000   ole32      (deferred)             
00007ffd`38340000 00007ffd`39757000   shell32    (deferred)             
00007ffd`39800000 00007ffd`39971000   user32     (deferred)             
00007ffd`39990000 00007ffd`39ad5000   gdi32      (deferred)             
00007ffd`39ae0000 00007ffd`39c8a000   ntdll      (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\ntdll.pdb\B17873D46FFF421587F6E743D1A4B1851\ntdll.pdb

System_EnterpriseServices_Wrapper, System_Transactions 정도만 목록에 있을 뿐 System.dll 조차도 보이질 않는데요. 이 때문에 savemodule 명령어를 위한 주소를 구할 수가 없습니다.

재미있는 것은, !name2ee의 동작도 이상하다는 점입니다. 가령, System.Web.Mvc.dll에 분명히 있는 System.Web.Mvc.MvcHandler.EndProcessRequest 메서드의 이름 풀이를 위해 DLL을 명시하면 결과를 내지 못하는데,

0:018> !name2ee System.Web.Mvc!System.Web.Mvc.MvcHandler.EndProcessRequest
0:018>

그냥 '*'로 모든 모듈을 검색해서 찾으라는 명령어로 바꾸면 다음과 같이 결과를 냅니다.

0:018> !name2ee *!System.Web.Mvc.MvcHandler.EndProcessRequest
Module:      00007ffcd1990700
Assembly:    SMDiagnostics.dll
--------------------------------------
Module:      00007ffcd1e8ddc8
Assembly:    Microsoft.Web.Administration.dll
--------------------------------------
Module:      00007ffcd14d52d8
Assembly:    System.Runtime.Caching.dll
...[생략]...
--------------------------------------
Module:      00007ffcd1409970
Assembly:    System.Web.Mvc.dll
Token:       00000000060007e2
MethodDesc:  00007ffcd1863800
Name:        System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult)
JITTED Code Address: 00007ffcd170a270
...[생략]...

다행인 것은, savemodule 명령어가 .NET Module 주소 값도 받아들인다는 점입니다. 즉, 위의 !name2ee 결과로 나오는 Module 주소인 00007ffcd1409970 값을 사용해도 되는 것입니다.

이 2개의 결과가 동일한지 테스트를 위해 임시로 Windows Forms 응용 프로그램을 하나 만들었습니다. sos 확장을 로드한 후 기본 생성된 Form1 클래스를 다음과 같이 확인할 수 있습니다.

0:000> !name2ee WindowsFormsApplication1!WindowsFormsApplication1.Form1
Module:      00007fff560640c0
Assembly:    WindowsFormsApplication1.exe
Token:       0000000002000002
MethodTable: 00007fff56068a00
EEClass:     00007fff561b11c0
Name:        WindowsFormsApplication1.Form1

lm 명령으로 구한 start 주소는 다음과 같은데,

0:000> lm
start             end                 module name
0000017e`06140000 0000017e`06148000   WindowsFormsApplication1   (deferred)             
00007fff`85ac0000 00007fff`86352000   System_Xml_ni   (deferred)             
00007fff`878c0000 00007fff`887a3000   System_Windows_Forms_ni C (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\System.Windows.Forms.pdb\EB5CB7959D814F46A194DAF569C175FF1\System.Windows.Forms.pdb
00007fff`8a9a0000 00007fff`8b325000   System_Core_ni   (deferred)             
00007fff`8b330000 00007fff`8bf00000   System_ni   (deferred)             
...[생략]...

이 2개의 주소 값을 기반으로 savemodule을 수행한 후,

0:000> !savemodule 00007fff560640c0 c:\temp\test1.dll
3 sections in file
section 0 - VA=2000, VASize=109c, FileAddr=200, FileSize=1200
section 1 - VA=4000, VASize=62c, FileAddr=1400, FileSize=800
section 2 - VA=6000, VASize=c, FileAddr=1c00, FileSize=200

0:000> !savemodule 0000017e`06140000 c:\temp\test2.dll
3 sections in file
section 0 - VA=2000, VASize=109c, FileAddr=200, FileSize=1200
section 1 - VA=4000, VASize=62c, FileAddr=1400, FileSize=800
section 2 - VA=6000, VASize=c, FileAddr=1c00, FileSize=200

test1.dll과 test2.dll을 .NET Reflector로 확인해 보니 동일한 코드가 나왔습니다. 끝~~~!!!




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/20/2022]

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

비밀번호

댓글 작성자
 



2016-04-28 07시06분
이 글에서 "!name2ee System.Web.Mvc!System.Web.Mvc.MvcHandler.EndProcessRequest"와 같이 실행하면 결과가 없고,
"!name2ee *!System.Web.Mvc.MvcHandler.EndProcessRequest"라고 해야 한다고 썼는데요.

좀 더 해보니, 모듈의 확장자를 넣으니 잘 동작이 되었습니다.

!name2ee System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.EndProcessRequest

좀 헷갈리는군요. ^^; 아마도 sos.dll의 버전에 따라 확장자 명시가 필요한 듯도 합니다.

일례로 아래의 글을 쓰면서 실습했을 때는 잘 동작했었습니다.

windbg 사례 - .NET 예외가 발생한 시점의 오류 분석
; http://www.sysnet.pe.kr/2/0/10942
정성태

... 46  47  48  49  50  51  52  53  54  55  56  [57]  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12197정성태3/17/202010861VS.NET IDE: 144. .NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성 - 두 번째 이야기 [1]
12196정성태3/17/20208809오류 유형: 608. The ServicedComponent being invoked is not correctly configured (Use regsvcs to re-register).
12195정성태3/16/202010502.NET Framework: 902. C# - 프로세스의 모든 핸들을 열람 - 세 번째 이야기
12194정성태3/16/202012836오류 유형: 607. PostgreSQL - Npgsql.NpgsqlException: sorry, too many clients already
12193정성태3/16/20209504개발 환경 구성: 485. docker - SAP Adaptive Server Enterprise 컨테이너 실행 [1]
12192정성태3/14/202011969개발 환경 구성: 484. docker - Sybase Anywhere 16 컨테이너 실행
12191정성태3/14/202012305개발 환경 구성: 483. docker - OracleXE 컨테이너 실행 [1]
12190정성태3/14/20208504오류 유형: 606. Docker Desktop 업그레이드 시 "The process cannot access the file 'C:\Program Files\Docker\Docker\resources\dockerd.exe' because it is being used by another process."
12189정성태3/13/202013315개발 환경 구성: 482. Facebook OAuth 처리 시 상태 정보 전달 방법과 "유효한 OAuth 리디렉션 URI" 설정 규칙
12188정성태3/13/202015496Windows: 169. 부팅 시점에 실행되는 chkdsk 결과를 확인하는 방법
12187정성태3/12/20208248오류 유형: 605. NtpClient was unable to set a manual peer to use as a time source because of duplicate error on '...'.
12186정성태3/12/20209336오류 유형: 604. The SysVol Permissions for one or more GPOs on this domain controller and not in sync with the permissions for the GPOs on the Baseline domain controller.
12185정성태3/11/20209979오류 유형: 603. The browser service was unable to retrieve a list of servers from the browser master...
12184정성태3/11/202011446오류 유형: 602. Automatic certificate enrollment for local system failed (0x800706ba) The RPC server is unavailable. [3]
12183정성태3/11/20209782오류 유형: 601. Warning: DsGetDcName returned information for \\[...], when we were trying to reach [...].
12182정성태3/11/202011032.NET Framework: 901. C# Windows Forms - Vista/7 이후의 Progress Bar 업데이트가 느린 문제파일 다운로드1
12181정성태3/11/202011872기타: 76. 재현 가능한 최소한의 예제 프로젝트란? - 두 번째 예제파일 다운로드1
12180정성태3/10/20208467오류 유형: 600. "Docker Desktop for Windows" - EXPOSE 포트가 LISTENING 되지 않는 문제
12179정성태3/10/202019852개발 환경 구성: 481. docker - PostgreSQL 컨테이너 실행
12178정성태3/10/202011319개발 환경 구성: 480. Linux 운영체제의 docker를 위한 tcp 바인딩 추가 [1]
12177정성태3/9/202010984개발 환경 구성: 479. docker - MySQL 컨테이너 실행
12176정성태3/9/202010399개발 환경 구성: 478. 파일의 (sha256 등의) 해시 값(checksum) 확인하는 방법
12175정성태3/8/202010482개발 환경 구성: 477. "Docker Desktop for Windows"의 "Linux Container" 모드를 위한 tcp 바인딩 추가
12174정성태3/7/202010036개발 환경 구성: 476. DockerDesktopVM의 파일 시스템 접근 [3]
12173정성태3/7/202011038개발 환경 구성: 475. docker - SQL Server 2019 컨테이너 실행 [1]
12172정성태3/7/202015918개발 환경 구성: 474. docker - container에서 root 권한 명령어 실행(sudo)
... 46  47  48  49  50  51  52  53  54  55  56  [57]  58  59  60  ...