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环境