win7产生大量evtx文件_c++ 直接读取.evt/.evtx文件

本文介绍了如何使用C++直接读取Windows EVTX日志文件,包括解析EVENTLOGHEADER和EVENTLOGRECORD结构,以及提取源名称、计算机名、用户SID和字符串数据等信息。
摘要由CSDN通过智能技术生成

我可能会迟到但很好,它可以帮助未来的读者:

现在一切都变得简单了,你要做的是:

I.宣布结构

>日志标题结构

typedef unsigned long ULONG;

typedef struct _EVENTLOGHEADER {

ULONG HeaderSize;

ULONG Signature;

ULONG MajorVersion;

ULONG MinorVersion;

ULONG StartOffset;

ULONG EndOffset;

ULONG CurrentRecordNumber;

ULONG OldestRecordNumber;

ULONG MaxSize;

ULONG Flags;

ULONG Retention;

ULONG EndHeaderSize;

} EVENTLOGHEADER, *PEVENTLOGHEADER;

>日志记录结构

typedef unsigned long DWORD;

typedef unsigned short WORD;

typedef struct _EVENTLOGRECORD {

DWORD Length;

DWORD Reserved;

DWORD RecordNumber;

DWORD TimeGenerated;

DWORD TimeWritten;

DWORD EventID;

WORD EventType;

WORD NumStrings;

WORD EventCategory;

WORD ReservedFlags;

DWORD ClosingRecordNumber;

DWORD StringOffset;

DWORD UserSidLength;

DWORD UserSidOffset;

DWORD DataLength;

DWORD DataOffset;

} EVENTLOGRECORD, *PEVENTLOGRECORD;

我们看了!

首先声明一个std :: ifstream变量来打开并读取文件(二进制)

using namespace std;

ifstream file;

file.open(fileName,ios::in|ios::binary);

if(file.is_open()){

_EVENTLOGHEADER logheader;

_EVENTLOGRECORD logRecord;

//Reading the header

file.read((char*)&logheader,sizeof(_EVENTLOGHEADER));

int startOfLog;

//Loop on every record

for(unsigned int numberFile=0;numberFile < logheader.CurrentRecordNumber -1;numberFile++){

//Save the position

startOfLog = file.tellg();

//Read log record

file.read((char*)&logRecord,sizeof(_EVENTLOGRECORD));

/*******************************************************

Here are the other information (section 'Remarks' on the 'EVENTLOGRECORD structure' link

********************************************************/

//Reading sourcename

wchar_t buffData;

wstring SourceName;

file.read((char*)&buffData,sizeof(wchar_t));

while(buffData!=_T('\0')){

SourceName.push_back(buffData);

file.read((char*)&buffData,sizeof(wchar_t));

}

//Reading computer name

wstring ComputerName;

file.read((char*)&buffData,sizeof(wchar_t));

while(buffData!=_T('\0')){

ComputerName.push_back(buffData);

file.read((char*)&buffData,sizeof(wchar_t));

}

//Sets the position to the SID offset

int readCursor = startOfLog + logRecord.UserSidOffset;

file.seekg(readCursor);

char * userSid = NULL;

if(logRecord.UserSidLength != 0)

{

userSid = (PCHAR)malloc(logRecord.UserSidLength);

file.read(userSid,logRecord.UserSidLength); //Reading the sid

//Here you can work on the SiD (but you need win32 API).If you need it, I could show you how i deal with this sid

free(userSid);

}

//Sets the position to the Strings offset

readCursor = startOfLog + logRecord.StringOffset;

file.seekg(readCursor);

wstring buffString;

vector allStrings;

//Reading all the strings

for(int i=0; i< logRecord.NumStrings; i++) {

file.read((char*)&buffData,sizeof(wchar_t));

while(buffData!=_T('\0')){

buffString.push_back(buffData);

file.read((char*)&buffData,sizeof(wchar_t));

}

allStrings.push_back(buffString);

buffString.clear();

}

//Sets the position to the Data offset

readCursor = startOfLog + logRecord.DataOffset;

file.seekg(readCursor);

unsigned char *Data = (unsigned char *)malloc(logRecord.DataLength*sizeof(unsigned char));

file.read((char*)Data,logRecord.DataLength); //Lecture des données

//Sets the position to the end of log offset

readCursor = startOfLog + logRecord.Length - sizeof(DWORD) ;

file.seekg(readCursor);

DWORD length;

file.read((char*)&length,sizeof(DWORD));

//Do what you want with the log record

//Clean before reading next log

ComputerName.clear();

SourceName.clear();

allStrings.clear();

free(Data);

}

}

希望它可以帮助某人,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值