跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

Windows XML事件日志(EVTX)单条日志清除(二)——程序实现删除evtx文件的单条日志记录

精选回复

发布于

0x00 前言

Windows XML事件日志(EVTX)单条日志清除系列文章的第二篇,介绍对指定evtx文件的单条日志删除方法,解决在程序设计上需要考虑的多个问题,开源实现代码。

0x01 简介

本文将要介绍以下内容:

对指定evtx文件单条日志的删除思路

程序实现细节

开源代码

0x02 对指定evtx文件单条日志的删除思路

在上篇文章《Windows XML Event Log (EVTX)单条日志清除(一)——删除思路与实例》 介绍了evtx日志文件中删除单条日志的原理和一个实例,采用修改日志长度的方法实现日志删除

实现思路如图

2-1.png

注:

图片来自https://博客。福克斯-它。com/2017/12/08/检测和恢复非国家行为者掩盖的踪迹/

这种方法在实现上相对简单,但是需要考虑多种不同的情况:

删除中间日志

删除最后一条日志

删除第一条日志

0x03 删除中间日志

方法如下:

文件标题中的下一个记录标识符值减一

重新计算文件标题中的校验和

重新计算前一日志长度,共2个位置(偏移四和当前日志的最后四字节)

后续日志的事件记录标识符依次减一

埃尔夫丘克中的最后事件记录号减一

埃尔夫丘克中的最后事件记录标识符减一

重新计算埃尔夫丘克中事件记录校验和

重新计算埃尔夫丘克中校验和

在程序实现上,具体细节如下:

1、File header中的Next record identifier值减1

读取日志文件内容

定义日志文件格式结构体,对日志文件格式进行解析

下一个记录标识符值减1:

文件头-下一记录标识符=文件头-下一记录标识符-1

2、重新计算File header中的Checksum

计算循环冗余检验校验和的c代码如下:

无符号整数CRC32[256];

静态void init_table()

{

int i,j;

无符号整数循环冗余码校验

for(I=0;i 256我)

{

CRC=I;

for(j=0;j 8;j)

{

中频(crc 1)

CRC=(CRC 1)^0x EDB 88320;

其他

CRC=CRC 1;

}

CRC32[I]=CRC;

}

}

无符号整型GetCRC32(无符号char *buf,int len)

{

无符号整数ret=0xFFFFFFFF

int I;

静态字符初始化=0;

如果(!初始化)

{

init_table()。

init=1;

}

for(I=0;我低输入联网(low-entry networking的缩写)我)

{

ret=crc32[((ret0x ff)^ buf[i])]^(ret 8);

}

ret=~ ret

返回浸水使柔软

}

计算文件标题前120字节的校验和

代码如下:

无符号字符*ChecksumBuf=新的无符号char[120];

memcpy(ChecksumBuf,(PBYTE)elfFilePtr,120);

crc32=GetCRC32(ChecksumBuf,120);

3、重新计算前一日志长度,共2个位置(偏移4和当前日志的最后4字节)

通过搜索魔法字符串0x2A0x2A0x000x00逐个定位事件记录

(1)定位待删除的日志电流记录

读取长度,即当前记录大小

(2) 定位前一日志预录

读取长度,即上一记录-大小

计算合并后的长度:

新大小=当前记录大小前一记录大小

更新长度:

PrevRecord-Size=NewSize

(3) 定位后一日志下一张唱片

使用新尺寸替换下一张唱片起始点前的四字节:

*(PULONG)((PBYTE)下一条记录-4)=新大小

4、后续日志的Event record identifier依次减1

遍历后续日志,事件记录标识符依次减一

需要修改两个位置:

当前记录-事件记录标识符=当前记录-事件记录标识符-1

当前记录-模板-事件记录标识符=当前记录-模板-事件记录标识符-1

5、ElfChuk中的Last event record number减1

elf chuk-LastEventRecordNumber=elf chuk-LastEventRecordNumber-1

6、 ElfChuk中的Last event record identifier减1

elf chuk-lasteventrecordentifier=elf chuk-lasteventrecordentifier-1

7、重新计算ElfChuk中Event records checksum

unsigned char * ChecksumBuf=new unsigned char[当前区块空闲空间偏移量-512];

memcpy(ChecksumBuf,(PBYTE)currentChunk 512,当前块空闲空间偏移量-512);

crc32=GetCRC32(ChecksumBuf,当前块空闲空间偏移量-512);

8、 重新计算ElfChuk中Checksum

无符号字符*ChecksumBuf=新的无符号char[504];

memcpy(ChecksumBuf,(PBYTE)currentChunk,120);

memcpy(ChecksumBuf 120,(PBYTE)currentChunk 128,384);

crc32=GetCRC32(ChecksumBuf,504);

0x04 删除最后一条日志

删除最后一条日志在上篇文章《Windows XML Event Log (EVTX)单条日志清除(一)——删除思路与实例》 做过实例演示,与删除中间日志的方法基本相同

区别如下:

后续日志的事件记录标识符不需要减1,因为没有后续日志

需要重新计算埃尔夫丘克中的最后事件记录数据偏移量

程序细节如下:

1.重新计算ElfChuk中的最后一个事件记录数据偏移量。

elf chuk-lasteventrecorddata offset=elf chuk-lasteventrecorddata offset-LastRecord-Size

0x05 删除第一条日志

修改日志长度的方法不适合删除第一个日志,因为没有以前的日志会覆盖当前日志。

如果你想仍然使用覆盖长度的方法,你需要进一步分析日志的文件格式。

我们知道,事件记录的内容是以二进制XML格式保存的。

二进制XML格式可以指:

https://github . com/libyal/libevtx/blob/master/documentation/Windows XML事件日志(evtx)。ascii doc # 4-二进制-xml

要通过修改二进制XML格式的内容来实现合并日志,需要修改以下内容:

书面日期和时间

模板定义数据大小

下一个模板定义偏移量

注:

这种方法也适用于修改中间日志和最后日志,所以只要了解日志格式,删除方法就不是唯一的。

其他实现细节见开源代码,地址如下:

https://github.com/3gstudent/Eventlogedit-evtx-进化/blob/master/deleterecordoffile . CPP

代码读取指定的日志文件c:\\test\\Setup.evtx,删除一个日志(EventRecordID=14),并将其保存为一个新的日志文件C: \ \ c:\\test\\SetupNew.evtx

注:

关于代码的实现细节,我参考了Snow上的演示代码,地址如下:

https://bbs.pediy.com/thread-219313.htm

0x06 小结

本文介绍了删除evtx文件中单个日志记录的思想、程序实现细节以及开源代码。删除单个日志记录的方法不是唯一的。接下来,将介绍删除当前系统的单个日志记录的几种方法。

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。