windows xp日志文件格式分析
日志文件是windows系统中一个比较特殊的文件,它记录着windows系统中所发生的一切,如各种系统服务的启动、运行、关闭等信论文联盟http://息。windows日志包括应用程序、安全、系统等几个部分,应用程序日志、安全日志和系统日志对应的文件名为appevent.evt、
sysevent.evt。这些文件受到“event log(事件记录)”服务的保护只能被清空,但是不能删除某一条记录。
应用程序日志、安全日志、系统日志、dns日志等默认存放位置:%systemroot%\\system32\\config,默认文件大小512kb。
安全日志:%systemroot%\\system32\\config\\secevent.evt
系统日志:%systemroot%\\system32\\config\\sysevent.evt
应用程序日志:%systemroot%\\system32\\config\\appevent.evt
可以在注册表中修改这些log文件的默认存放位置:
hkey_local_machine\\system\\currentcontrolset\\services\\eventlog
2日志文件的数据结构
2.1日志文件头结构分析
windows msdn中日志文件头的结构体数据类型如下:
typedef struct _eventlogheader {
ulong headersize; //文件头的大小,是固定值(0x30)
ulong signature; //特定码值,总是(0x654c664c)
ulong majorversion; //主版本号,总是1
ulong minorversion; //次版本号,总是1
ulong startoffset; //第一条(最早)日志记录的偏移量
ulong endoffset; //文件尾的文件内偏移量
ulong currentrecordnumber; //将要产生记录的记录号
ulong oldestrecordnumber;//第一条(最早)记录的记录号
ulong maxsize; //日志文件的总大小,这里是64k(0x10000)
ulong flags; //日志文件的状态标志
ulong retention; //文件创建时的保留值,与注册表关联。wWw.133229.cOM
ulong endheadersize; //文件头的大小,文件头结束。
}eventlogheader, *peventlogheader
为了更为直观地展现出日志文件头的储存结构我们用winhex打开一个日志记录为空的日志文件,没有事件记录,只有文件头和文件尾。如图1所示。
可以看到前三行共48个字节是文件头部分,接下来的40个字节是文件尾部分,之间没有事件记录。文件头部分其内容和日志文件头结构体相一致。在这里由于日志文件的内容是空的,所以startoffset(第一条(最早)日志记录的文件内偏移量)和endoffset(文件尾的文件内偏移量)相同都是0x30。这是一个空日志文件,由于没有事件记录所以oldestrecordnumber(第一条(最早)日志记录的记录号)为00 00 00 00。
图1文件头和文件尾
2.2日志文件尾结构分析
windows msdn中日志文件尾的结构体数据类型如下:
typedef struct _eventlogeof {
ulong recordsizebeginning;//文件尾大小,固定值(0x28)
ulong one; //标识符,总是(0x11111111)
ulong two; //标识符,总是(0x22222222)
ulong three; //标识符,总是(0x33333333)
ulong four; //标识符,总是(0x44444444)
ulong beginrecord; //第一条(最早)日志记录的偏移量
ulong endrecord; //将要产生新的一条记录的偏移量,即当前文件尾的偏移量
ulong currentrecordnumber; //将要产生的记录的记录号
ulong oldestrecordnumber; //第一条(最早)日志记录的记录号,如果事件日志为空时这里的值是0
ulong recordsizeend; //文件尾大小,是固定值(0x28)
} eventlogeof, *peventlogeof;
在图1中所示的日志文件,是把日志里的事件记录清空后得到的空日志文件,所以文件尾中的oldestrecordnumber值是1而不是0,endrecord值0x f4 71 05 00和currentrecordnumber值0x 74 06 00 00都是日志事件记录清空前的值,系统并没有将其立即更新,而是等到再写入新事件记录时再更新。如果清空日志之前再产生一条记录的话,那么它的文件内偏移量将是0x f4 71 05 00记录号将是0x 74 06 00 00,即第1652个记录(0x674=1652)。
2.3日志事件记录结构分析
windows msdn中日志事件记录的结构体数据类型如下:
typedef struct _eventlogrecord {
dword length; //该记录的大小
dword reserved; //固定值,总是(0x654c664c)
dword recordnumber; //记录号,当前是第几条记录。
dword timegenerated;//时间代码,从1970年到现在的秒数
dword timewritten; //时间代码,从1970年到现在的秒数
dword eventid; //事件id号
word eventtype; //事件类型
word numstrings; //消息量,事件包含多少条消息。
word eventcategory; //事件种类