2019-2020-2 20165325 李东骏 毕业设计 第四周总结

2019-2020-2 20165325 李东骏 毕业设计 第四周总结

目录

本周任务&每日完成情况

任务进展&已经解决的问题

待解决的问题&下周计划

代码托管情况


本周任务&每日完成情况

返回目录

周一 周二 周三 周四 周五 周六 周天
解决单独的evtx读取问题
完成数据库日志文件读取核心程序
解决单独的evtx读取问题
解决单独的evtx读取问题
翻译论文
解决单独的evtx读取问题
总结
撰写博客
托管代码

任务进展&已经解决的问题

返回目录

解决单独的evtx读取问题

能否读取指定的evtx文件是能否完成操作系统日志读取的关键。之前已经介绍过,由于是跨机读取,我的设计思路是向日志服务器共享本业务服务器的日志文件,日志服务器读取这个共享的日志文件,将数据写入设置在日志服务器的数据中心中,最后在Web前端向审计人员展示。

因此,本模块核心程序的应该封装为:输入待读取的日志文件的路径&文件名,输出日志文件的信息(诸如eventId、RecordNumber、EventType、EventTime、EventCategory等等)。

经过实践,发现java很难解决这个问题。因为java基本上没有留下这方面的接口,综合参考网上的资料,发现java调用Advapi32Util只能完成读取本机日志文件的功能,其输入为日志文件的种类:Application或Security或System;

Advapi32Util.EventLogIterator iter = new Advapi32Util.EventLogIterator("Application");      //或Security或System

调用方法如上,其执行效果是读取本机的日志文件,不能指定文件路径读取(比如说指定C:\Users\24771\Desktop\test4.evtx);可能有人尝试用这样读取:

Advapi32Util.EventLogIterator iter = new Advapi32Util.EventLogIterator("C:\\Users\\24771\\Desktop\\test4.evtx");

但是这是!不!行!的!不!行!的!不!行!的!

程序确确实实会读取出来东西,但是你仔细对照日志文件内容你会发现文件内容对应不上;仔细观察你会发现:程序读取的是Application的日志内容!

各位小伙伴各位看官,我可能水平有限。如果Advapi32Util能解决这个问题,请一定一定给我留言!谢谢!!!!

--------------------------分割线--------------------------

在多次失败之后,我请教了某赵姓大佬。我了解到可以使用Python解决这个问题,代码:

import mmap
import contextlib
import re

from Evtx.Evtx import FileHeader
from Evtx.Views import evtx_file_xml_view

def MyFun():
    longlat_list = []
    with open('route.txt', 'r', encoding='utf-8-sig') as f:
        for eachline in f:
            if eachline != '' and eachline != '\n':
                longlat = eachline.split('\t')[0].split()[0]
                longlat_list.append(longlat)
        f.close()
    EvtxPath = str(longlat_list[0]) #日志文件的路径

    with open(EvtxPath,'r') as f:
        with contextlib.closing(mmap.mmap(f.fileno(),0,access=mmap.ACCESS_READ)) as buf:
            fh = FileHeader(buf,0)
            # 构建一个xml文件,根元素是Events
            print ("")
            print ("")
            # 遍历事件
            for xml, record in evtx_file_xml_view(fh):
                print (xml)
                with open(str(longlat_list[1]), 'a', encoding='utf-8') as f:
                    f.write(str(xml))
                    f.write('\n')

            print ("")

if __name__ == '__main__':
    MyFun()

程序编译为一个exe,他读取和自己同路径的route.txt文件,该文件内含evtx文件的输入路径和程序最终的输出txt路径,这个exe文件将指定的日志文件内容写入txt,以xml的格式。

下面是其中一条日志的输出效果:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"><System><Provider Name="Microsoft-Windows-LoadPerf" Guid="{122ee297-bb47-41ae-b265-1ca8d1886d40}"></Provider>
<EventID Qualifiers="">1001</EventID>
<Version>0</Version>
<Level>4</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2020-02-23 09:40:28.540165"></TimeCreated>
<EventRecordID>267</EventRecordID>
<Correlation ActivityID="" RelatedActivityID=""></Correlation>
<Execution ProcessID="1400" ThreadID="1676"></Execution>
<Channel>Application</Channel>
<Computer>WIN-9GT205KDAUT</Computer>
<Security UserID="S-1-5-18"></Security>
</System>
<UserData><EventXML xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="LoadPerf"><param1>WmiApRpl</param1>
<param2>WmiApRpl</param2>
<binaryDataSize>12</binaryDataSize>
<binaryData>fhUAAH8VAAA0BwAA</binaryData>
</EventXML>
</UserData>
</Event>

最后用java修改route.txt文件并且启动exe即可得到上述数据,下一步需要做的就是提取、处理其中有用的信息。

完成数据库日志文件读取核心程序

所谓这个模块的核心程序,就是能把数据库服务器的GeneralLog、ErrorLog、SlowQueryLog采集&处理&读取到日志服务器的数据库中;

因为每次刷新日志都是从头读取同一个日志文件,为了避免写入重复,我设置了计算了一条日志的SM3算法Hash作为主键;详情如图:

翻译论文

已翻译论文:


待解决的问题&下周计划

返回目录

待解决的问题

weblogic环境崩了,一夜回到解放前。

evtx文件读取已经可以做到了,还没处理数据。

下周主要任务

  • evtx文件读取并且处理数据
  • 调试weblogic环境

代码托管情况

返回目录

代码文档提交过程&代码量截图

码云链接

https://gitee.com/maxeyscodes/bishe_logcheck

posted @ 2020-03-22 23:41  Maxeys  阅读(239)  评论(0编辑  收藏  举报