初めに
Windows Eventlogの中身の構造を知りたかったので細かく調査してメモしています
Windows Eventlogの公式ドキュメントはないので間違い等あるかもしれませんがご了承ください
書籍
技術書典にて「Windows EventLogを本気で理解する」を頒布をしました。
本記事の内容を詳しく記載しております、ご興味がある方は、Booth等で頒布してますのでチェックしてみてください!
※売上金は本サイトの運営費に充てられます
Booth
技術書典
Window Eventlogとは
Windows Eventlog(ウィンドウズ イベントログ)は、Windowsオペレーティングシステムによって生成される各種情報、警告、エラーなどのイベントを収集する機能です。Windowsイベントログには、システム、セキュリティ、アプリケーションの3つの主要なログがあります。
システムログには、Windowsシステムの動作に関する情報、エラー、警告が記録されます。例えば、ハードウェアの故障やシステムのクラッシュなどが含まれます。
セキュリティログには、Windowsシステムのセキュリティ関連の情報が記録されます。例えば、認証の失敗やログオンの成功などが含まれます。
アプリケーションログには、アプリケーションソフトウェアの実行に関する情報、エラー、警告が記録されます。例えば、アプリケーションのクラッシュや異常終了などが含まれます。
Header
ファイルの先頭から0x1000までがヘッダー情報です
0x00~0x08にはASCIIコードで`ElfFile`があります
Offset | Size | Value | Description |
---|---|---|---|
0 | 8 | “ElfFile\x00” | Signature |
8 | 8 | First chunk number | |
16 | 8 | Last chunk number | |
24 | 8 | Next record identifier | |
32 | 4 | 128 | Header size |
36 | 2 | Minor format version See section: Format versions | |
38 | 2 | Major format version See section: Format versions | |
40 | 2 | 4096 | Header block size (or chunk data offset) |
42 | 2 | Number of chunks | |
44 | 76 | Unknown (Empty values) | |
120 | 4 | File flags See section: File flags | |
124 | 4 | Checksum CRC32 of the first 120 bytes of the file header | |
128 | 3968 | Unknown (Empty values) |
Golangで構造体で表現するとこんな感じ
type EVTXHeader struct {
Magic [8]byte
Firstchunk uint64
LastChunk uint64
NextRecordID uint64
HeaderSize uint32
MinorVersion uint16
MajorVersion uint16
HeaderBlockSize uint16
_ [76]byte
FileFlags uint32
CheckSum uint32
}
データを入れるとこんな感じになる
{
Magic:[8]uint8{0x45, 0x6c, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x0},
Firstchunk:0x0,
LastChunk:0x4,
NextRecordID:0x7de1,
HeaderSize:0x80,
MinorVersion:0x1,
MajorVersion:0x3,
HeaderBlockSize:0x1000,
_:[76]uint
8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0
x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
FileFlags:0x10000,
CheckSum:0x8efa0000
}
Chunk
Headerのあと、0x1000からChunkデータが始まります。
Chunkデータは、512(0x200)バイトのサイズがあります。ここでは、
0x1000~0x1200までがChunkデータです
Offset | Size | Value | Description |
---|---|---|---|
0 | 8 | “ElfChnk\x00” | Signature |
8 | 8 | First event record number | |
16 | 8 | Last event record number | |
24 | 8 | First event record identifier | |
32 | 8 | Last event record identifier | |
40 | 4 | 128 | Header size (or offset to pointer data) |
44 | 4 | 最後のイベントレコードのデータオフセット 最後のイベントレコードのデータへのオフセット。 オフセットはチャンクヘッダーの開始位置からの相対値です。 | |
48 | 4 | 空き領域オフセット チャンク内の空き領域へのオフセット。オフセットはチャンクヘッダーの開始位置からの相対値です。 | |
52 | 4 | Event records checksum CRC32 of the events records data | |
56 | 64 | Unknown (Empty values) | |
120 | 4 | Unknown (flags?) | |
124 | 4 | Checksum CRC32 of the first 120 bytes and bytes 128 to 512 of the chunk. |
データを入れるとこんな感じになる
{
Magic:[8]uint8{0x45, 0x6c, 0x66, 0x43, 0x68, 0x6e, 0x6b, 0x0}, FirstEventRecNumber:0x1,
LastEventRecNumber:0x4e,
FirstEventRecID:0x7c86,
LastEventRecID:0x7cd3,
HeaderSize:0x80
},
Offs
et:4096
}
Event Record
0x1200からEventRecordが始まります。
offsetの2byte目の2byteは、EventRecord全体のサイズです
以下のデータだとsizeは0x0828なのでEventRecordの範囲は0x1200~0x1A28で表されます。
Offset | Size | Value | Description |
---|---|---|---|
0 | 4 | “0x2a0x2a0x000x00” | Signature |
4 | 4 | Size 署名とサイズを含むイベントレコードのサイズ | |
8 | 8 | イベントレコード識別子 | |
16 | 8 | Written date and time Contains a FILETIME The date and time the event record was written (logged) | |
24 | … | Event Contains binary XML See section: Binary XML | |
… | 4 | Copy of size |
{
Magic:[4]uint8{0x2a, 0x2a, 0x0, 0x0},
Size:0x828,
RecordID:0x7c86,
FileTime:0x1d4be26bf9a2775
},
Event:{
"Event":{
"System":{
"Provider":{
"Name":"Microsoft-Windows-Eventlog",
"Guid":"{fc65ddd8-d6ef-4962-83d5-6e5cfe9ce148}"
},
"EventID":{
"Value":1102},
"Version":0,"Level":4,"Task":104,"Opcode":0,"Keywords":4620693217682128896,"TimeCreated":{"SystemTime":1549462673.3172593},"EventRecordID":31878
,"Correlation":{},"Execution":{"ProcessID":1236,"ThreadID":8176},"Channel":"Security","Computer":"TestComputer","Security":{}},"UserData":{"LogFileCleared":{"SubjectUserSid":"S-1-5-21-546003962-2713609280-610790815-100
1","SubjectUserName":"test","SubjectDomainName":"TESTCOMPUTER","SubjectLogonId":170294}}}}}
binary XML
0x1218からbinary XMLのデータが始まります
まず先頭の8byteはFragment header
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x0f | Fragment header token Should be: BinXmlFragmentHeaderToken See section: Token types |
1 | 1 | 0x01 | Major version |
2 | 1 | 0x01 | Minor version |
3 | 1 | 0x00 | Flags |
Template instance
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x0c | Template instance token Should be: BinXmlTokenTemplateInstance See section: Token types |
1 | … | Template definition | |
… | … | Template instance data |
Template definition
Data Sizeは0x547
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | Unknown(Version? Or number of template defs?) Seen: 0x01 | |
1 | 4 | Unknown (Template identifier?) | |
5 | 4 | Template definition data offset Template definition data | |
9 | 4 | Unknown (Next template definition offset) 0 if not used | |
13 | 16 | Template identifier Contains a GUID | |
29 | 4 | Data size データのサイズ。 テンプレート定義の最初の33バイトを除く、フラグメントヘッダー、エレメント、エンドオブファイルトークンのサイズが含まれます。 | |
33 | … | Fragment header | |
… | … | Element | |
… | 1 | End of file token Should be: BinXmlTokenEOF See section: Token types |
Element start
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x01 0x41 | Open start element tag token Should be: BinXmlTokenOpenStartElementTag See section: Token types |
Optional see notes below | |||
1 | 2 | Dependency identifier -1 (0xffff) ⇒ not set | |
Common | |||
3 | 4 | Data size The size of the data. This includes the size of the element name, attribute list, close element tag, content and end element tag, except for the first 7 bytes of the element start. | |
Optional see notes below | |||
7 | 4 | Element name offset チャンクの開始点からの相対値 See section: Name | |
Common | |||
11 | … | Attribute list See section: Attribute list |
OpenStartElementTagToken: 0x41
DependencyIdentifier: 0xFFFF
DataSize: 0x5B3
ElementNameOffset: 0x24D
Name
上記のElementNameOffsetの要素で0x124DからNameのデータがある
Offset | Size | Value | Description |
---|---|---|---|
0 | 4 | Unknown | |
4 | 2 | Name hash Which hash algorithm? | |
6 | 2 | Number of characters | |
8 | … | UTF-16 little-endian string with an end-of-string character |
Unknown: 0x00000000
NameHash: 0x0CBA
NumberOfCharacters: 0x05
Name: "Event"(0x0045, 0x0076, 0x0065, 0x006E, 0x0074)
Attribute list
Attribute ListとはXMLのAttributeのことであるDataSizeがあり、Event
の属性データサイズを表している
Name要素が終わり、0x1261からAttribute Listとなる
Offset | Size | Value | Description |
---|---|---|---|
0 | 4 | Data size Does not include the 4 byte of the size. | |
4 | … | Array of attributes See section: Attribute |
DataSize:0x87
Attribute
AttributeはXMLのAttributeでここでは一つの属性についての構造である
AttributeNameOffsetが0x026Aなので0x126AからName要素となる
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x06 0x46 | Attribute token Should be: BinXmlTokenAttribute See section: Token types |
Optional see notes below | |||
1 | 4 | Attribute name offset The offset is relative from the start of the chunk See section: Name | |
Common | |||
5 | … | Attribute data |
AttributeToken: 0x6A
AttributeNameOffset: 0x026A
Name 2
上記のNameと同じ構造である
Unknown: 0x00000000
NameHash: 0x0FBC
NumberOfCharacters: 0x05
Name: "xmlns"(0x0078, 0x006D, 0x006C, 0x006E, 0x0073)
Value Token
ここでは、AttributeのValueが表現されています
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x05 0x45 | Value token Should be: BinXmlTokenValue See section: Token types |
1 | 1 | 0x01 | Value type Should be: StringType See section: Value types |
2 | … | Value data See section: Unicode text string |
Unicode Text String
Value TokenのOffset:2では以下の構造で表されます
Character数が0x35(53文字)で53文字は後に続きます
Offset | Size | Value | Description |
---|---|---|---|
2 | 2 | Number of characters | |
4 | … | UTF-16 little-endian string without an end-of-string character |
NumberOfCharacters:0x35
Value: http://schemas.microsoft.com/win/2004/08/events/event
Close start element tag
Valueのあとの次の0x02は、要素の終了 「'>'」を表します。
ここまでくるとXMLの構造は
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
と想像できると思います。
Attribute Listの始まりは、0x1261でDataSizeは、0x87なので0x1261+0x87+0x4(DataSize)=0x12EC
となり、ここでAttributeListが終了していることがわかります
Element start #2
ここから新たなElementが始まり、0x01の場合は、AttributeがないElementです
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x01 0x41 | Open start element tag token Should be: BinXmlTokenOpenStartElementTag See section: Token types |
Optional see notes below | |||
1 | 2 | | Dependency identifier -1 (0xffff) ⇒ not set |
Common | |||
3 | 4 | | Data size The size of the data. This includes the size of the element name, attribute list, close element tag, content and end element tag, except for the first 7 bytes of the element start. |
Optional see notes below | |||
7 | 4 | | Element name offset チャンクの開始点からの相対値 See section: Name |
Common | |||
11 | … | | Attribute list |
OpenStartElementTagToken: 0x01
DependencyIdentifier: 0xFFFF
DataSize: 0x0464
ElementNameOffset: 0x2F8
Name
上記からNameのOffsetは0x2F8なので0x12F8からNameの要素である
Unknown: 0x00000000
NameHash: 0x546F
NumberOfCharacters: 0x06
Name: "System"(0x0053, 0x0079, 0x0073, 0x0073, 0x0065, 0x006D, 0x00)
Close start element tag
今回は、Attribute Listがないため、Nameの次からTokenTypeである
0x02のため、以下のXMLとなる
<System>
Element Start #3
OpenStartElementTagToken: 0x41
DependencyIdentifier: 0xFFFF
DataSize: 0xD9
ElementNameOffset: 0x031A
Name
Unknown: 0x00000000
NameHash: 0x7BF1
NumberOfCharacters: 0x08
Name: "Provide"(0x0050, 0x0072, 0x006F, 0x0076, 0x0069, 0x0064, 0x0065,0x0072, 0x00)
Attribute List
DataSize:0xB6
Attribute & Name
AttributeToken: 0x46
AttributeNameOffset: 0x033D
Unknown: 0x00000000
NameHash: 0x954B
NumberOfCharacters: 0x04
Name: "Name"(0x004E, 0x0061, 0x006D, 0x0065, 0x0000)
Value Token & Unicode Text String
ValueToken: 0x05
ValueType: 0x01(Unicode string)
NumberOfCharacters:0x1A
Value: Microsoft-Windows-Eventlog
Attribute & Name
AttributeToken: 0x06
AttributeNameOffset: 0x038C
Unknown: 0x00000000
NameHash: 0x1529
NumberOfCharacters: 0x04
Name: "Guid"(0x0047, 0x0075, 0x0069, 0x0064, 0x0000)
Value Token & Unicode Text String
ValueToken: 0x05
ValueType: 0x01(Unicode string)
NumberOfCharacters:0x26
Value: {fc65ddd8-d6ef-4962-83d5-6e5cfe9ce148}
Close empty element tag
0x13EEでは0x03であり、XMLの ‘/>’を表している
したがって、今までの要素をXMLで表現すると
<Provide Name="Microsoft-Windows-Eventlog" Guid="{fc65ddd8-d6ef-4962-83d5-6e5cfe9ce148}" />
Element start #4
OpenStartElementTagToken: 0x41
DependencyIdentifier: 0x003F
DataSize: 0x004D
ElementNameOffset: 0x03FA
Unknown: 0x00000000
NameHash: 0x61F5
NumberOfCharacters: 0x07
Name: "EventID"(0x0045, 0x0076, 0x0065, 0x006E, 0x0074, 0x0049, 0x0044,0x0000)
Attribute List
DataSize:0x27
Attribute & Name
AttributeToken: 0x06
AttributeNameOffset: 0x041B
Unknown: 0x0000038C
NameHash: 0xDA29
NumberOfCharacters: 0x0A
Name: "Qualifiers"(0x0051, 0x0075, 0x0061, 0x006C, 0x0069, 0x0066, 0x0065,, 0x0072,, 0x0073)
Optional substitution
特定のフィールドが存在しない場合に代替値を提供することができます。これにより、BinXmlの解析時に欠落しているフィールドの代替値を使用して、データの処理を継続することができます。
例えば、セキュリティログのBinXmlテンプレートでは、イベントが発生したユーザー名を示すフィールドがありますが、このフィールドが空の場合があります。この場合、Optional Substitutionを使用して、代替の値を提供することができます。
以下の場合は、AttributeのQualifiersの値がOptional substitutionです
Offset | Size | Value | Description |
---|---|---|---|
0 | 1 | 0x0e | Optional substitution token Should be: BinXmlTokenOptionallSubstitution See section: Token types |
1 | 2 | Substitution identifier Identifier of the value in the template instance data, where 0 represents the first value | |
3 | 1 | Value type See section: Value types |
OptionalSubstitutionToken: 0x0E
SubstitutionIdentifier: 0x0004
ValueType:0x06(UInt16Type)
Qualifiers
Qualifiersは、セキュリティイベントの重要度や種類を示すために使用される、イベントに関する追加情報を提供する数値です。Qualifiersの値には、以下のような種類があります。
- Audit success(監査成功):このQualifiersの値は、成功したアクションを示します。
- Audit failure(監査失敗):このQualifiersの値は、失敗したアクションを示します。
- Informational(情報):このQualifiersの値は、重要性が低く、情報の提供を目的としたイベントを示します。
- Warning(警告):このQualifiersの値は、重要性が中程度で、警告を示すイベントを示します。
- Error(エラー):このQualifiersの値は、重要性が高く、エラーを示すイベントを示します。
- Success(成功):このQualifiersの値は、重要性が高く、成功したアクションを示すイベントを示します。
- Failure(失敗):このQualifiersの値は、重要性が高く、失敗したアクションを示すイベントを示します。
Close start element tag
ここでタグが閉じられているので
<EventID Qualifiers="??">
Optional substitution
OptionalSubstitutionToken: 0x0E
SubstitutionIdentifier: 0x0003
ValueType:0x06(UInt16Type)
Close end element tag
<EventID Qualifiers="%0x0004">%0x0003</EventID>
Element start #5
OpenStartElementTagToken: 0x01
DependencyIdentifier: 0x000B
DataSize: 0x0022
ElementNameOffset: 0x044E
Unknown: 0x00000000
NameHash: 0x0918
NumberOfCharacters: 0x07
Name: "Version"(0x0056, 0x0065, 0x0072, 0x0073, 0x0069, 0x006F, 0x006E,0x0000)
Close start element tag
Optional substitution
OptionalSubstitutionToken: 0x0E
SubstitutionIdentifier: 0x000B
ValueType:0x04(UInt8Type
)
Close end element tag
<Version>%0x000B</Version>
Element start #6
OpenStartElementTagToken: 0x01
DependencyIdentifier: 0x0000
DataSize: 0x001E
ElementNameOffset: 0x0477
Unknown: 0x00000000
NameHash: 0xCE64
NumberOfCharacters: 0x05
Name: "Level"(0x004C, 0x0065, 0x0076, 0x0065, 0x006C, 0x0000)
Close start element tag
Optional substitution
OptionalSubstitutionToken: 0x0E
SubstitutionIdentifier: 0x0000
ValueType:0x04(UInt8Type)
Close end element tag
<Level>%0x0000</Level>
コメント