Windows Eventlog の見方?(解析)

Blog

初めに

Windows Eventlogの中身の構造を知りたかったので細かく調査してメモしています

Windows Eventlogの公式ドキュメントはないので間違い等あるかもしれませんがご了承ください

書籍

技術書典にて「Windows EventLogを本気で理解する」を頒布をしました。

本記事の内容を詳しく記載しております、ご興味がある方は、Booth等で頒布してますのでチェックしてみてください!

※売上金は本サイトの運営費に充てられます

Booth

Windows EventLogを本気で理解する - FREES - BOOTH
Windows EventLogをバイナリエディタのみで読み進んでいくとてもマニアックな本です。 Windows EventLogはBinXMLと呼ばれるバイナリで表されたXMLが使われます。BinXMLについての解説本です。 Imhexと...

技術書典

Windows EventLogを本気で理解する:FREES
Windows EventLogをバイナリエディタのみで読み進んでいくとてもマニアックな本です。 Windows EventLogはBinXMLと呼ばれるバイナリで表されたXMLが使われます。BinXMLについての解説本です。 Imhexと...

Window Eventlogとは

Windows Eventlog(ウィンドウズ イベントログ)は、Windowsオペレーティングシステムによって生成される各種情報、警告、エラーなどのイベントを収集する機能です。Windowsイベントログには、システム、セキュリティ、アプリケーションの3つの主要なログがあります。

システムログには、Windowsシステムの動作に関する情報、エラー、警告が記録されます。例えば、ハードウェアの故障やシステムのクラッシュなどが含まれます。

セキュリティログには、Windowsシステムのセキュリティ関連の情報が記録されます。例えば、認証の失敗やログオンの成功などが含まれます。

アプリケーションログには、アプリケーションソフトウェアの実行に関する情報、エラー、警告が記録されます。例えば、アプリケーションのクラッシュや異常終了などが含まれます。

Header

ファイルの先頭から0x1000までがヘッダー情報です

0x00~0x08にはASCIIコードで`ElfFile`があります

OffsetSizeValueDescription
08“ElfFile\x00”Signature
88First chunk number
168Last chunk number
248Next record identifier
324128Header size
362Minor format version
See section: Format versions
382Major format version
See section: Format versions
4024096Header block size
(or chunk data offset)
422Number of chunks
4476Unknown (Empty values)
1204File flags
See section: File flags
1244Checksum
CRC32 of the first 120 bytes of the file header
1283968Unknown (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データです

OffsetSizeValueDescription
08“ElfChnk\x00”Signature
88First event record number
168Last event record number
248First event record identifier
328Last event record identifier
404128Header size
(or offset to pointer data)
444最後のイベントレコードのデータオフセット
最後のイベントレコードのデータへのオフセット。
オフセットはチャンクヘッダーの開始位置からの相対値です。
484空き領域オフセット
チャンク内の空き領域へのオフセット。オフセットはチャンクヘッダーの開始位置からの相対値です。
524Event records checksum
CRC32 of the events records data
5664Unknown (Empty values)
1204Unknown (flags?)
1244Checksum
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で表されます。

OffsetSizeValueDescription
04“0x2a0x2a0x000x00”Signature
44Size
署名とサイズを含むイベントレコードのサイズ
88イベントレコード識別子
168Written 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
…​4Copy 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

OffsetSizeValueDescription
010x0fFragment header token
Should be: BinXmlFragmentHeaderToken
See section: Token types
110x01Major version
210x01Minor version
310x00Flags

Template instance

OffsetSizeValueDescription
010x0cTemplate instance token
Should be: BinXmlTokenTemplateInstance
See section: Token types
1…​Template definition
…​…​Template instance data

Template definition

Data Sizeは0x547

OffsetSizeValueDescription
01Unknown(Version? Or number of template defs?)
Seen: 0x01
14Unknown (Template identifier?)
54Template definition data offset
Template definition data
94Unknown (Next template definition offset)
0 if not used
1316Template identifier
Contains a GUID
294Data size
データのサイズ。
テンプレート定義の最初の33バイトを除く、フラグメントヘッダー、エレメント、エンドオブファイルトークンのサイズが含まれます。
33…​Fragment header
…​…​Element
…​1End of file token
Should be: BinXmlTokenEOF
See section: Token types

Element start

OffsetSizeValueDescription
010x01
0x41
Open start element tag token
Should be: BinXmlTokenOpenStartElementTag
See section: Token types
Optional see notes below
12Dependency identifier
-1 (0xffff) ⇒ not set
Common
34Data 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
74Element 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のデータがある

OffsetSizeValueDescription
04Unknown
42Name hash
Which hash algorithm?
62Number 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となる

OffsetSizeValueDescription
04Data 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要素となる

OffsetSizeValueDescription
010x06
0x46
Attribute token
Should be: BinXmlTokenAttribute
See section: Token types
Optional see notes below
14Attribute 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が表現されています

OffsetSizeValueDescription
010x05
0x45
Value token
Should be: BinXmlTokenValue
See section: Token types
110x01Value 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文字は後に続きます

OffsetSizeValueDescription
22Number 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です

OffsetSizeValueDescription
010x01
0x41
Open start element tag token
Should be: BinXmlTokenOpenStartElementTag
See section: Token types
Optional see notes below
12Dependency identifier
-1 (0xffff) ⇒ not set
Common
34Data 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
74Element 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です

OffsetSizeValueDescription
010x0eOptional substitution token
Should be: BinXmlTokenOptionallSubstitution
See section: Token types
12Substitution identifier
Identifier of the value in the template instance data, where 0 represents the first value
31Value type
See section: Value types
OptionalSubstitutionToken: 0x0E
SubstitutionIdentifier: 0x0004
ValueType:0x06(UInt16Type)
Qualifiers

Qualifiersは、セキュリティイベントの重要度や種類を示すために使用される、イベントに関する追加情報を提供する数値です。Qualifiersの値には、以下のような種類があります。

  1. Audit success(監査成功):このQualifiersの値は、成功したアクションを示します。
  2. Audit failure(監査失敗):このQualifiersの値は、失敗したアクションを示します。
  3. Informational(情報):このQualifiersの値は、重要性が低く、情報の提供を目的としたイベントを示します。
  4. Warning(警告):このQualifiersの値は、重要性が中程度で、警告を示すイベントを示します。
  5. Error(エラー):このQualifiersの値は、重要性が高く、エラーを示すイベントを示します。
  6. Success(成功):このQualifiersの値は、重要性が高く、成功したアクションを示すイベントを示します。
  7. 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>

コメント

タイトルとURLをコピーしました