# WER

## 1. 개요

Windows Error Reporting(WER)은 Microsoft의 자동 보고 시스템으로, Windows 운영 체제에서 발생하는 애플리케이션, 드라이버, 운영 체제 오류를 감지하고 보고한다. 디지털 포렌식 분석 관점에서 WER은 오류 발생 프로그램과 발생 시간을 확인할 수 있으며 연관된 이벤트 로그를 통해 시스템 활동을 추적할 수 있다.

***

## 2. 아티팩트 경로

### WER 보고서 파일(Report.wer)

WER 보고서 파일은 시스템의 오류 보고서를 포함하며, 주로 다음 경로에 저장된다.

* **경로**: `C:\\ProgramData\\Microsoft\\Windows\\WER`
  * **하위 폴더**:
    * `ReportArchive`: 보관된 오류 보고서
      * `ReportQueue`: 대기 중인 오류 보고서
        * 실제 파일은 확인되지 않았으나 $I30 파일에서 wer 파일이 있었음을 알 수 있다.
      * `Temp`: 임시 오류 보고서
        * 실제 파일은 확인되지 않았으나 $I30 파일에서 wer 파일이 있었음을 알 수 있다.
* **파일 형식**:
  * `.wer`: 텍스트 형식의 오류 보고서
  * `.dmp`: 메모리 덤프 파일
  * `.hdmp`: 압축된 메모리 덤프 파일 (하이브리드 덤프)

### WER EventLog

* **일반 이벤트 로그**:
  * **경로**: `C:\\Windows\\System32\\winevt\\Logs`
  * **이벤트 로그 파일**:
    * `Application.evtx`: 애플리케이션 관련 이벤트 로그
      * Event ID: 1000, 1001
    * `System.evtx`: 시스템 이벤트 로그
* **WER 진단 이벤트 로그**:
  * **경로**: `C:\\Windows\\System32\\winevt\\Logs\\Microsoft-Windows-WER-Diag%4Operational.evtx`
  * **로그 내용**: WER 시스템의 진단 정보와 관련된 이벤트 (예: 오류 보고서 생성 및 전송 상태, 전송 실패 이유 등)

### WER Registry

* 경로
  * HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
  * HKEY\_CURRENT\_USER\Software\Microsoft\Windows\Windows Error Reporting
* Registry
  * (S) Consent
    * (V) DefaultConsent
      * 1: Always ask
      * 2: Parameters only
      * 3: Parameter and safe data
      * 4: All data
  * (S) DebugApplications
    * (V) \[ExeName]
      * 0: Processes with an executable image name of “ExeName” do not require the user to choose “Debug” or “Continue”
      * 1: Processes with an executable image name of “ExeName” require the user to choose “Debug” or “Continue”
  * (S) LocalDumps
    * (S) \[Application Name]
      * (V) DumpFolder: 덤프 디렉터리 경로. Default 값은 %LOCALAPPDATA%\CrashDumps.
      * (V) DumpCount: 덤프 최대 값. Default 값은 10. 최대 값을 초과하면 폴더에서 가장 오래된 덤프 파일이 새 덤프 파일로 대체
      * (V) DumpType

        * 0: Custom dump
        * 1: Minidump (default)
        * 2: Fulldump

나머지는  공식 문서를 참고한다.

* <https://learn.microsoft.com/en-us/windows/win32/wer/wer-settings>

***

## 3. Report.wer

해당 단락에서는 `ReportArchive`에서 발견된 Report.wer 파일의 필드 값에 대해 정리함. Report.wer은 [AppCrashView.exe](https://www.nirsoft.net/utils/app_crash_view.html) 프로그램으로 확인할 수 있다.

<figure><img src="/files/GlGNNOB28vVhOUV2M39y" alt=""><figcaption></figcaption></figure>

### Report.wer 폴더 명

Report.wer 파일의 폴더 명을 보면 오류 유형부터 해시값들이 포함되어 있다.

```
%오류 유형%_%충돌 애플리케이션 이름%_%첫번째 해시%_%두번째 해시%_%ReportIdentifier%

예시)
AppCrash_Explorer.EXE_9cd53897ffc9d25be27f21a71ffa52cae8ae1aa_1c1d6539_29da9992
```

#### 첫번째 해시

폴더 명에서 발견되는 첫번째 해시로는 정확하게 명칭이나 관련된 설명을 확인할 수 없으나, 여러 `Report.wer` 파일을 분석한 결과 `Sig` 필드로 만들어지는 것으로 예상된다. `Sig` 필드 안에는 프로그램에 대한 정보 및 예외 코드 등 여러 데이터가 포함되어있다.

첫번째 해시값이 같다면 동일한 프로그램, 프로그램 버전, 오류, 예외 코드임을 알 수 있다.

#### 두번째 해시

폴더 명에서 발견되는 두번째 해시로는 `ReportType`과 `TargetAppVer`로 만들어지는 것으로 예상된다.

두번째 해시값이 같다면 같은 `ReportType`와 프로그램에 버전이 동일함을 알 수 있다.

오류 유형이 NonCritical인 경우 `ReportType`이 ‘0’이지만 `Report.wer`에서는 저장되지 않는다. 그래서 두번째 해시 값이 `00000000`으로 고정된다.

### Report.wer 필드

#### **EventType**

* APPCRASH
* BEX
* BEX64
* MoAppHang
* AppHangB1
* StoreAgentInstallFailure1
* StoreAgentDownloadFailure1

#### **ReportType**

* 0: NonCritical
* 1: Critical
* 2: ApplicationCrash
* 3: ApplicationHang
* 4: Kernel
* 5: Invalid

#### **ReportStatus**

* 대부분 \*\*268435456 (2^28)\*\*으로 Bit 값으로 예상됨
  * 268435456
    * 2^28
  * 268566528
    * 2^28 + 2^17
  * 97
    * 2^0 + 2^5 + 2^6

#### **ReportIdentifier**

* WER 보고서 식별자. 폴더 명에 마지막에 해당됨

#### **IntegratorReportIdentifier**

* 통합된 보고서 식별자
* 이벤트 로그에는 해당 식별자 값이 보고서 ID로 확인된다.

#### **TargetAppId**

* “W”로 시작하는 것과 “U”로 시작하는 것이 있음.
* AppCrash가 발생한 것은 “W”로 시작
* Application Hang (애플리케이션 중단)은 “U”로 시작함. 다만 기존에 AppCrash가 난 프로그램인 경우 “W”로 표시됨

#### **TargetAppVer**

* 버전명!시간!해시!프로그램 이름 으로 구성되어있다.
  * 시간은 프로그램의 속성에서 자세히 보기 후 수정한 시간으로 확인된다.
  * 버전 명은 대부분 없지만 Windows Store에서 다운 받은 파일인 경우 버전이 확인됨

#### 전체 필드

| 필드                         | 설명                          | 비고                            |
| -------------------------- | --------------------------- | ----------------------------- |
| Version                    | 보고서 버전                      |                               |
| EventType                  | 이벤트 유형                      | BEX=Buffer overflow EXception |
| AppCrash                   |                             |                               |
| EventTime                  | 이벤트 발생 시간                   | FileTime Timestamp            |
| ReportType                 | 보고서 유형                      | 0: NonCritical                |
| 1: Critical                |                             |                               |
| 2: ApplicationCrash        |                             |                               |
| 3: ApplicationHang         |                             |                               |
| 4: Kernel                  |                             |                               |
| 5: Invalid                 |                             |                               |
| Consent                    | Microsoft에 보고서를 전송 동의 여부    |                               |
| UploadTime                 | 보고서가 업로드된 시간                |                               |
| ReportStatus               | 보고서의 상태                     | 보고서 업로드, 보류 등등                |
| ReportIdentifier           | 보고서 식별자                     |                               |
| IntegratorReportIdentifier | 통합된 보고서 식별자                 |                               |
| Wow64Host                  | 64bit 호스트에서 실행되는 32bit 프로세스 |                               |
| Wow64Guest                 | 32비트 게스트 프로세스를 나타냅니다.       |                               |
| NsAppName                  | 오류가 발생한 응용 프로그램의 이름         |                               |
| OriginalFilename           | 응용 프로그램의 원래 파일 이름           |                               |
| AppSessionGuid             | 응용 프로그램 세션의 고유 식별자          |                               |
| TargetAppId                | 타겟 응용 프로그램의 식별자             |                               |
| TargetAppVer               | 타겟 응용 프로그램의 버전              |                               |
| BootId                     | 시스템 부팅 식별자                  |                               |
| TargetAsId                 | 타겟 응용 프로그램 세션의 고유 식별자       |                               |
| IsFatal                    | 오류가 치명적인지 여부                |                               |
| Response.BucketId          | 문제의 버킷 식별자                  |                               |
| Response.BucketTable       | 문제의 버킷 테이블                  |                               |
| Response.LegacyBucketId    | 이전 문제 버킷 식별자                |                               |
| Response.type              | 응답 유형                       |                               |
| Sig                        | 오류에 대한 시그니처 정보              |                               |
| DynamicSig                 | 동적 서명 정보                    |                               |
| UI                         | 사용자 인터페이스                   |                               |
| LoadModules                | 로드 모듈 이름                    |                               |
| State                      | 상태 정보                       |                               |
| OsInfo                     | 운영체제 정보                     |                               |
| FriendlyEventName          | 사용자에게 표시되는 이벤트의 친숙한 이름      |                               |
| ConsentKey                 | 동의 여부                       |                               |
| AppName                    | 응용프로그램 이름                   |                               |
| AppPath                    | 응용프로그램 경로                   |                               |
| NsPartner                  | 파트너 정보                      |                               |
| NsGroup                    | 그룹 정보                       |                               |
| ApplicationIdentity        | 응용 프로그램 식별 정보               |                               |
| MetadataHash               | 메타데이터 해시                    |                               |

***

## 4. Event Log 속 WER

해당 단락에서는 Application.evtx 에서 확인할 수 있는 내용에 대해 정리함. 이벤트 뷰어를 확인하기 위해서는 eventvwr.msc 프로그램을 사용해 확인할 수 있다. (Win + r 후 eventvwr.msc 입력)

### Event ID 1001

해당 이벤트 로그에서는 10개의 매개변수를 확인할 수 있다. 해당 파라미터는 Report.wer에서 Sig 필드와 같다.

```powershell
Get-EventLog -LogName Application -InstanceId 1001 -Source 'Windows Error Reporting'
```

### Event ID 1000

해당 이벤트 로그에서는 1001에서 확인한 파라미터의 값의 대해 정확한 명칭과 함께 값을 확인할 수 있다.

```powershell
Get-EventLog -LogName Application -InstanceId 1000 -Source 'Application Error'
```

## 5. WER 뷰어 및 파서 프로그램 제작

[GitHub - tkddnr924/WER-Parser](https://github.com/tkddnr924/WER-Parser)

* 프로그램 작성 중
* 각 필드에 의미를 확인 후 추가할 예정이며, 필드 값 별로 분류 및 검색까지 가능하게 할 예정이다.
* 이 프로그램에 목적은 기존 WER 뷰어의 기능을 강화하고 더 보기 좋게 하기 위함이다.

## 6. 참고

* <https://learn.microsoft.com/en-us/windows/win32/wer/wer-settings>
* <https://winreg-kb.readthedocs.io/en/latest/sources/system-keys/Windows-error-reporting.html>
* <https://sphinx-watson.readthedocs.io/de/latest/einstieg.html>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://plainbit.gitbook.io/digital-forensics-wiki/windows/wer.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
