> For the complete documentation index, see [llms.txt](https://plainbit.gitbook.io/digital-forensics-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://plainbit.gitbook.io/digital-forensics-wiki/windows/wer.md).

# 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="https://2372172751-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo1a6XYNwCVA0kQDDcMrf%2Fuploads%2FMo1nPvqrDA54ftA2zLnC%2FWER_1.png?alt=media&amp;token=8201fc84-d7dd-4be5-86fa-21acb111c768" 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>
