Hook Delete File操作
WriteProcessMemory
此函数能写入某一进程的内存区域。入口区必须可以访问,否则操作将失败。
BOOL类型
BOOL是微软定义的typedef int BOOL(在windef.h中)。与bool不同,它是一个三值逻辑, TRUE/FALSE/ERROR,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。
这里描述了Windows文件删除事件监控
https://michaelfirsov.wordpress.com/windows-audit-part-4-tracing-file-deletions-in-ms-powershell/
https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4660
需要学习:
IAT
IAT 的全称是 ImportAddress Table
。在可执行文件中使用其他 DLL 可执行文件的代码或数据,称为导入或者输入,当 PE 文件载入内存时,windows 加载器会定位所有导入的函数或数据将定位到的内容填写至可执行文件的某个位置供其使用,而这个操作是需要借助导入表来完成的。
1.OpenProcess;
2.LastError ;
在 Delphi 中,你可以使用 TFileStream 类和二进制读取方法来从文件中读取 log 文件的内容,然后当 log 文件被刷新时,你可以保存你最后读取的位置,并在下次读取时从该位置继续。
下面是一个简单的例子,说明如何实现这个功能:
-
首先,你需要在你的 Delphi 程序中包含以下单元:
uses | |
SysUtils, Classes; |
-
创建一个全局变量来保存你的最后读取位置:
var | |
LastReadPosition: Integer; |
-
创建一个函数来读取 log 文件内容:
function ReadLogFile(const FileName: string): string; | |
var | |
FileStream: TFileStream; | |
ReadPosition: Integer; | |
begin | |
Result := ''; | |
FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); | |
try | |
if FileStream.Size > LastReadPosition then | |
FileStream.Seek(LastReadPosition, soFromBeginning); | |
ReadPosition := FileStream.Position; | |
while FileStream.Position <> ReadPosition do | |
begin | |
ReadPosition := FileStream.Position; | |
if FileStream.Size > ReadPosition then | |
Result := Result + StringOfChar(#13#10, FileStream.Read(1, [Ord(' ')])); | |
end; | |
finally | |
FileStream.Free; | |
end; | |
end; |
-
当 log 文件被刷新时,你需要调用这个函数,并传递 log 文件的路径作为参数。你还需要更新 LastReadPosition 变量,以便下次可以从正确的位置开始读取:
procedure RefreshLogFile(const FileName: string); | |
var | |
NewContent: string; | |
begin | |
NewContent := ReadLogFile(FileName); | |
// 处理新的 log 内容... | |
LastReadPosition := 0; // 重置读取位置以便下次从文件开始处读取 | |
end; |
请注意,这个例子假设 log 文件的内容是纯文本,并且每行都以回车符(#13)和换行符(#10)结束。如果你的 log 文件的格式不同,你可能需要修改读取逻辑以适应你的需求。