c ++ - Reading .evt/.evtx filer direkte

Indlæg af Hanne Mølgaard Plasc

Problem



Hej ved nogen, hvordan man læser .evt/.evtx, som er Windows Event logfiler, der skal læses, uden at bruge forudsat api, jeg vil læse dem ved hjælp af FILE I/O apis i C/C++.


Eller hvordan man konverterer disse filer til .txt, jeg ved splunk gør dette, men ikke sikker på, hvordan de gør det her.

Bedste reference


Jeg kan være sent, men godt, det kunne hjælpe en fremtidig læser således:


For at læse en .evt -fil med standard lib (lad os sige i C ++), skal du være opmærksom på ELF\_LOGFILE\_HEADER struktur og EVENTLOGRECORD struktur. Herudover er logfilfilen til arrangementet.]] [10] [11]


Nu er alt enklere, hvad du skal gøre er:


Jeg. Erklære strukturer




  1. Loghovedstruktur


    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;  
    

  2. Log Record struktur


    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;
    



II Lad os læse!



Først erklæres en std::ifstream variabel for at åbne og læse filen (binær)


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('')){
            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('')){
            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<wstring> allStrings;
        //Reading all the strings
        for(int i=0; i< logRecord.NumStrings; i++) {
            file.read((char*)&buffData,sizeof(wchar\_t));
            while(buffData!=\_T('')){
                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);
    }
}


Ønske det kunne hjælpe nogen,