文件隐藏
技术原理:文件系统驱动过滤 File System Minifilter Drivers
1) 创建过滤驱动的文件系统控制设备作为和外界的通信接口
2) 设置IRP分发函数与快速IO分发函数
3) 注册系统变动回调函数,在其中创建过滤控制设备对象绑定到激活的文件系统控制设备上
4) 处理IRP_MJ_FILE_SYSTEM_CONTROL的子IRP,在有卷设备挂载完成时对其绑定。
Minifilter框架的封装程度较高,在源代码里面直接调用相关函数,或者解注释即可实现相关的功能。当用户进行相关的操作后,系统就会发出相应的IRP请求,驱动就可以将其截获,然后就可以调用回调函数对其判断
windows 遍历文件需要使用ZwQueryDirectoryFile,返回由给定文件句柄指定的目录中有关文件的各种信息。
NTSYSAPI NTSTATUS ZwQueryDirectoryFile(
HANDLE FileHandle,
HANDLE Event,
PIO_APC_ROUTINE ApcRoutine,
PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock,
PVOID FileInformation,
ULONG Length,
FILE_INFORMATION_CLASS FileInformationClass,
BOOLEAN ReturnSingleEntry,
PUNICODE_STRING FileName,
BOOLEAN RestartScan
);
FILE_BOTH_DIR_INFORMATION结构用于查询目录中文件的详细信息。
typedef struct _FILE_BOTH_DIR_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaSize;
CCHAR ShortNameLength;
WCHAR ShortName[12];
WCHAR FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
遍历信息链表,逐个对比FileName是否符合要求,如果符合,将前驱直接指向下一个节点,将该节点从链表中删除,达到隐藏文件得目的
进程隐藏
技术:DKOM 实现进程隐藏
操作进程的EPROCESS结构与线程的ETHREAD结构、链表,要实现进程的隐藏只需要将某个进程中的信息,在系统EPROCESS链表中摘除即可实现进程隐藏。
要实现进程的隐藏需要关注结构中的 ActiveProcessLinks 该指针把每个进程的EPROCESS结构体连接成了双向链表,可以使用 ZwQuerySystemInformation 这个函数来遍历出所有的进程信息。要实现进程的隐藏,只需要将某个进程的EPROCESS从结构体中摘除,那么通过ZwQuerySystemInformation函数就无法遍历出被摘链的进程了,从而实现了进程的隐藏。
驱动模块隐藏
遍历驱动模块信息,其中节点为结构体_KLDR_DATA_TABLE_ENTRY,对指定节点从链表中摘除,从而隐藏驱动模块。
typedef struct_KLDR_DATA_TABLE_ENTRY
{
LIST_ENTRY InLoadOrderLinks;
PVOID ExceptionTable;
ULONG ExceptionTableSize;
PVOID GpValue;
PNON_PAGED_DEBUG_INFO NonPagedDebugInfo;
PVOID DllBase; / / Indicates the driver's load base address
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName; // indicates the full path of the driver module file
UNICODE_STRING BaseDllName; // indicates the name of the driver module
ULONG Flags;
USHORT LoadCount;
USHORT __Unused5;
PVOID SectionPointer;
ULONG CheckSum;
PVOID LoadedImports;
PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;