망분리(폐쇄망)되어 있는 고객사가 있습니다.
메모리 덤프가 발생했는데 주지 않아요. 들어와서 분석하랍니다.
들어가서 분석하는 건 좋은데... 메모리 덤프를 인터넷 가능한 PC에 못 가져가게 합니다.
폐쇄망 PC에서는 MS 디버그 심볼을 다운로드받을 수가 없겠죠.
이럴 때는 이렇게 합니다.
- symchk.exe를 사용해 OFFLINE PC에서 메모리덤프에 포함된 모듈 정보 (목록 + Hash)를 작성합니다. (symchk.exe는 Debugging Tools for Windows 에 포함되어 있습니다.)
- 작성된 목록을 인터넷 가능한 PC로 옮겨 놓고, symchk.exe를 이용해 필요한 디버그 심볼을 다운로드 받습니다.
- 다운받은 디버그 심볼을 다시 OFFLINE PC로 옮겨서 디버깅을 합니다.
순서대로 살펴봅니다.
Step 1. 모듈 목록 작성
우선 폐쇄망 PC에 "Debugging Tools for Windows" 를 설치합니다.
(그 얘기인 즉... 인터넷 가능한 PC에서 Windows SDK 설치 패키지를 다운로드받아서 폐쇄망 PC로 옮기는 작업이 필요하다는 얘기죠. ㅎㅎ)
"Debugging Tools for Windows"이 설치된 위치에 symchk.exe가 존재하는데요... 보통은 디버그 심볼을 다운로드받는데 사용합니다만, 바로 다운로드받지 않고 디버그 심볼을 나중에 다운로드받을 수 있도록 목록 (Manifest 파일)을 작성하는 기능도 있습니다.
symchk.exe /id "G:\dump\memorydump.dmp" /om C:\temp\symbolinfo.txt
이렇게 하면 memorydump.dmp를 분석하는 데 필요한 디버그 심볼 정보가 dumpinfo.txt에 저장됨니다.
dumpinfo.txt의 내용은 대략 이렇게 생겼습니다.
libkafka.dll,5b76322289000,2
ssleay32.dll,5b7f8bc95c000,2
cryptnet.dll,19deade12e000,2
dbgcore.dll,acfb60e929000,2
mskeyprotect.dll,6e2ba14014000,2
ncryptsslp.dll,3d4525c821000,2
pcacli.dll,24f9246915000,2
netapi32.dll,6f9f557917000,2
GdiPlus.dll,e1b52ff919a000,2
comctl32.dll,94e2213fa7000,2
mfc140u.dll,57bfda655d3000,2
ondemandconnroutehelper.dll,97c1b65a15000,2
wsock32.dll,5bbe66dc9000,2
Service.dll,5c494e4c2f000,2
Windows.StateRepositoryPS.dll,9f7e75de131000,2
...
(만약 파일 내용에 해시값이 제대로 들어있지 않다면... "Debugging Tools for Windows"를 최신 버전으로 다시 설치해보세요.)
만약 분석하려는 대상이 메모리덤프가 아니고 실행중인 프로세스라면 이렇게 하면 됩니다.
symchk.exe /ie notepad.exe /om C:\temp\symbolinfo.txt
특정 실행파일을 콕 집을 수도 있죠.
symchk.exe /if c:\Windows\system32\FirewallAPI.dll /om c:\temp\symbolinfo.txt
Step 2. 필요한 디버그 심볼 다운로드
이제 만들어진 symbolinfo.txt를 인터넷 PC로 옮겨 놓고 symchk.exe를 이용해 필요한 심볼을 다운로드받습니다.
(이 말은, 인터넷 가능한 PC에도 'Debugging Tools for Windows' - 라고 쓰고 Windows SDK 라고 읽습니다 - 를 설치해야 한다는 뜻이죠.)
다음과 같이 하면 "C:\Temp\SYMBOLS" 폴더에 심볼이 다운로드됩니다.
symchk.exe /im c:\temp\symbolinfo.txt /s SRV*C:\Temp\SYMBOLS*http://msdl.microsoft.com/download/symbols
/s 옵션을 생략하면 _NT_SYMBOL_PATH 환경변수에 정의된 값을 하는데요, 만약 _NT_SYMBOL_PATH 가 정의되지 않았다면 %windir%\SYMBOLS 폴더에 다운로드됩니다. (이 경우엔 관리자 권한이 필요하겠네요. ㅎㅎ)
symchk.exe /im c:\temp\symbolinfo.txt
이제 다운로드된 심볼을 다시 폐쇄망 PC로 옮겨서 디버깅하시면 되겠습니다 !!
※ symchk.exe 는 동일 위치에 존재하는 SymbolCheck.dll 에 의존성이 있습니다. 즉, 해당 실행파일을 portable하게 옮겨서 사용하시려면 SymbolCheck.dll 을 함께 운반하셔야 합니다.
Special Thanks to... #이태화 님
'C++ > Debug' 카테고리의 다른 글
메모리덤프에서 C++ 예외 분석하기 (0xe06d7363) (0) | 2023.05.01 |
---|---|
pdb가 맞지 않을 때 연결하기 (chkmatch) (0) | 2022.02.17 |
(기술지원 담당자를 위한) 어플리케이션 메모리덤프 작성 가이드 (0) | 2018.08.16 |
WinDbg 디버깅 교육 (2) x86 stack inside (0) | 2018.01.09 |
WinDbg 디버깅 교육 (1) 디버깅 개론 (0) | 2018.01.08 |