文件隐藏

技术原理:文件系统驱动过滤 File System Minifilter Drivers

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f62b2e02-3842-4fde-bfd4-ab57a9b99976/Untitled.png

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 实现进程隐藏

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ed02628d-227e-4747-b8c0-19f5e4329799/Untitled.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2c9c0336-152c-4d1f-8241-fda1be0cd88f/Untitled.png

操作进程的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;