성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] The Windows Registry Adventure #1: ...
[정성태] systemd for Developers I ; https:/...
[정성태] 엄밀히 object 타입의 인스턴스가 다른 타입으로 형변환 가능...
[정성태] 아래의 글에서 나오는 "Windows Application Pa...
[정성태] The history of calling conventions,...
[정성태] Secure and Deploy .NET Windows Form...
[정성태] Get Started with Milvus Vector DB i...
[정성태] cyberark/PipeViewer - A tool that...
[정성태] WinForms in a 64-Bit world – our st...
[정성태] 예제에서 SELECT_SQL도 내부적으로는 SqlCommand/...
글쓰기
제목
이름
암호
전자우편
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'>Patch Guard로 인해 블루 스크린(BSOD)가 발생하는 사례</h1> <p> 한때는, 악성 프로그램들이 자신의 존재를 감추려 실행 프로그램을 Task Manager에서 안 보이게 만드는 것이 유행이었습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ActiveProcessLinks---hide/src/hide.cpp ; <a target='tab' href='https://github.com/irp/ActiveProcessLinks---hide/blob/master/src/hide.cpp'>https://github.com/irp/ActiveProcessLinks---hide/blob/master/src/hide.cpp</a> AntiForensics techniques : Process hiding in Kernel Mod ; <a target='tab' href='https://www.cert-devoteam.fr/en/antiforensics-techniques-process-hiding-in-kernel-mode/'>https://www.cert-devoteam.fr/en/antiforensics-techniques-process-hiding-in-kernel-mode/</a> </pre> <br /> 그런데, 지금은 저렇게 해서 감추었다가는 BSOD가 발생하게 됩니다. 왜냐하면 64비트 윈도우 운영체제에 Patch Guard라는 것이 동작하고 있기 때문입니다. 실제로 테스트 삼아 ActiveProcessLinks를 건드려 프로세스를 숨겨 보면, 곧바로 BSOD가 발생하지 않고 특정할 수 없는 순간에, 그러니까 불시에 ^^; 운영체제가 재부팅해 버립니다.<br /> <br /> 이후 다음과 같은 덤프 내역을 확인할 수 있는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Problem signature: Problem Event Name: BlueScreen OS Version: 6.1.7601.2.1.0.256.1 Locale ID: 1042 Additional information about the problem: <span style='color: blue; font-weight: bold'>BCCode: 109</span> BCP1: A3A039DB9503D4FA BCP2: B3B74661E781EB91 BCP3: FFFFFA830436A670 <span style='color: blue; font-weight: bold'>BCP4: 0000000000000005</span> OS Version: 6_1_7601 Service Pack: 1_0 Product: 256_1 Files that help describe the problem: C:\Windows\Minidump\011020-24281-01.dmp C:\Users\kevin\AppData\Local\Temp\WER-290406-0.sysdata.xml Read our privacy statement online: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409 If the online privacy statement is not available, please read our privacy statement offline: C:\Windows\system32\en-US\erofflps.txt </pre> <br /> 이것만 봐도 사실 대략 원인을 알 수 있습니다. 중요한 것은 "BCCode"가 109라는 것인데 이것은 "CRITICAL_STRUCTURE_CORRUPTION" 오류로 Patch Guard에 의한 덤프였으며 세세한 오류 원인은 "BCP4"로 알 수 있습니다. 위에서는 "BCP4 == 5"인데, 이에 대한 오류 원인은 dmp 파일을 windbg로 보면 좀 더 쉽게 파악할 수 있습니다.<br /> <br /> 다음은 이 글에 첨부한 <a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1523&boardid=331301885'>011020-24281-01.dmp</a> 미니 덤프 파일을 windbg로 열어본 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Microsoft (R) Windows Debugger Version 10.0.19528.1000 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. Loading Dump File [c:\kernel\011020-24281-01.dmp] Mini Kernel Dump File: Only registers and stack trace are available ************* Path validation summary ************** Response Time (ms) Location Deferred srv* OK c:\symbols Deferred SRV*c:\Symbols*https://msdl.microsoft.com/download/symbols Symbol search path is: srv*;c:\symbols;SRV*c:\Symbols*https://msdl.microsoft.com/download/symbols Executable search path is: Windows 7 Kernel Version 7601 (Service Pack 1) MP (8 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS 7601.24511.amd64fre.win7sp1_ldr_escrow.190729-1700 Machine Name: Kernel base = 0xfffff800`02611000 PsLoadedModuleList = 0xfffff800`0284ac90 Debug session time: Fri Jan 10 10:07:39.889 2020 (UTC + 9:00) System Uptime: 0 days 0:37:31.330 Loading Kernel Symbols ......... Loading User Symbols Loading unloaded module list ..... For analysis of this file, run <span style='color: blue; font-weight: bold'>!analyze -v</span> nt!KeBugCheckEx: fffff800`026a4ca0 48894c2408 mov qword ptr [rsp+8],rcx ss:0018:fffff880`033e94a0=0000000000000109 </pre> <br /> 출력에 따라 "!analyze -v" 명령어를 입력하면 "BCP4 == 5"에 대한 의미를 알게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 7: kd> <span style='color: blue; font-weight: bold'>!analyze -v</span> ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* <span style='color: blue; font-weight: bold'>CRITICAL_STRUCTURE_CORRUPTION (109)</span> This bugcheck is generated when <span style='color: blue; font-weight: bold'>the kernel detects that critical kernel code or data have been corrupted.</span> There are generally three causes for a corruption: 1) A driver has inadvertently or deliberately modified critical kernel code or data. See http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx 2) A developer attempted to set a normal kernel breakpoint using a kernel debugger that was not attached when the system was booted. Normal breakpoints, "bp", can only be set if the debugger is attached at boot time. Hardware breakpoints, "ba", can be set at any time. 3) A hardware corruption occurred, e.g. failing RAM holding kernel code or data. Arguments: Arg1: a3a039db9503d4fa, Reserved Arg2: b3b74661e781eb91, Reserved Arg3: fffffa830436a670, Failure type dependent information Arg4: 0000000000000005, Type of corrupted region, can be 0 : A generic data region 1 : Modification of a function or .pdata 2 : A processor IDT 3 : A processor GDT 4 : Type 1 process list corruption <span style='color: blue; font-weight: bold'>5 : Type 2 process list corruption</span> 6 : Debug routine modification 7 : Critical MSR modification 8 : Object type 9 : A processor IVT a : Modification of a system service function b : A generic session data region c : Modification of a session function or .pdata d : Modification of an import table e : Modification of a session import table f : Ps Win32 callout modification 10 : Debug switch routine modification 11 : IRP allocator modification 12 : Driver call dispatcher modification 13 : IRP completion dispatcher modification 14 : IRP deallocator modification 15 : A processor control register 16 : Critical floating point control register modification 17 : Local APIC modification 18 : Kernel notification callout modification 19 : Loaded module list modification 1a : Type 3 process list corruption 1b : Type 4 process list corruption 1c : Driver object corruption 1d : Executive callback object modification 1e : Modification of module padding 1f : Modification of a protected process 20 : A generic data region 21 : A page hash mismatch 22 : A session page hash mismatch 23 : Load config directory modification 24 : Inverted function table modification 25 : Session configuration modification 26 : An extended processor control register 27 : Type 1 pool corruption 28 : Type 2 pool corruption 29 : Type 3 pool corruption 2a : Type 4 pool corruption 2b : Modification of a function or .pdata 2c : Image integrity corruption 2d : Processor misconfiguration 2e : Type 5 process list corruption 2f : Process shadow corruption 30 : Retpoline code page corruption 101 : General pool corruption 102 : Modification of win32k.sys Debugging Details: ------------------ fffff800027f30e8: Unable to get Flags value from nt!KdVersionBlock GetUlongPtrFromAddress: unable to read from fffff800028ae300 KEY_VALUES_STRING: 1 Key : Analysis.CPU.Sec Value: 2 Key : Analysis.DebugAnalysisProvider.CPP Value: Create: 8007007e on THEMYTH9 Key : Analysis.DebugData Value: CreateObject Key : Analysis.DebugModel Value: CreateObject Key : Analysis.Elapsed.Sec Value: 2 Key : Analysis.Memory.CommitPeak.Mb Value: 57 Key : Analysis.System Value: CreateObject ADDITIONAL_XML: 1 VIRTUAL_MACHINE: HyperV BUGCHECK_CODE: 109 BUGCHECK_P1: a3a039db9503d4fa BUGCHECK_P2: b3b74661e781eb91 BUGCHECK_P3: fffffa830436a670 BUGCHECK_P4: 5 CUSTOMER_CRASH_COUNT: 1 PROCESS_NAME: System STACK_TEXT: fffff880`033e9498 00000000`00000000 : 00000000`00000109 a3a039db`9503d4fa b3b74661`e781eb91 fffffa83`0436a670 : nt!KeBugCheckEx SYMBOL_NAME: ANALYSIS_INCONCLUSIVE MODULE_NAME: Unknown_Module IMAGE_NAME: Unknown_Image STACK_COMMAND: .thread ; .cxr ; kb FAILURE_BUCKET_ID: BAD_STACK_0x109 OS_VERSION: 7.1.7601.24511 BUILDLAB_STR: win7sp1_ldr_escrow OSPLATFORM_TYPE: x64 OSNAME: Windows 7 FAILURE_ID_HASH: {b4d7023a-05c3-49b2-3ea4-6240fe57d90e} Followup: MachineOwner --------- </pre> <br /> 그러니까, (정확한 원인은 담고 있지 않지만) "Type 2 process list corruption" 유형의 문제로 인해 BSOD를 발생시켰던 것이며 개발자 입장에서는 ActiveProcessLinks 값을 변조하면 안 된다는 것을 알게 되는 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> windbg 덤프 분석 화면에도 나오지만 CRITICAL_STRUCTURE_CORRUPTION BSOD가 발생하는 것은 다음의 3가지 원인 때문에 그런 것입니다.<br /> <br /> <ol> <li>A driver has inadvertently or deliberately modified critical kernel code or data. See <a target='tab' href='https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/driver-x64-restrictions'>http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx</a></li> <li>A developer attempted to set a normal kernel breakpoint using a kernel debugger that was not attached when the system was booted. Normal breakpoints, "bp", can only be set if the debugger is attached at boot time. Hardware breakpoints, "ba", can be set at any time.</li> <li>A hardware corruption occurred, e.g. failing RAM holding kernel code or data.</li> </ol> <br /> 현실적인 기준으로 봤을 때, 일반적인 환경에서 이런 BSOD를 경험한다면 대부분은 "잘못 작성된 드라이버"를 설치한 경우이거나, "악성코드를 담은 드라이버"일 가능성이 높습니다.<br /> <br /> 전자의 경우라면 해당 제품의 이전 버전을 설치하거나 버그 픽스를 한 새로운 버전의 드라이버를 설치하면 되지만, 최근에 설치한 새로운 드라이버가 없는 상황에서 CRITICAL_STRUCTURE_CORRUPTION BSOD를 만난다면 자신의 운영체제에 소위 말하는 바이러스가 설치되었을 확률이 높습니다. 이런 경우, 커널 모드에서 활동하는 driver의 특성상 삭제하는 것이 쉽지 않으므로 자신이 전문가가 아니라면 운영체제를 포맷 후 새로 설치하는 것이 편할 것입니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1857
(왼쪽의 숫자를 입력해야 합니다.)