#include "Minifilter.h"
#define CF_MEM_TAG 'cfct'
PFLT_FILTER gFilterHandle;
ULONG gTraceFlags = 0;
PFLT_PORT gServerPort;
PFLT_PORT gClientPort;
NPMINI_COMMAND gCommand = ENUM_PASS;
PWCHAR prefixName = L"HideDir";//要隐藏的文件夹名字的前缀
#define PT_DBG_PRINT( _dbgLevel, _string ) \
(FlagOn(gTraceFlags,(_dbgLevel)) ? \
DbgPrint _string : \
((void)0))
BOOLEAN NPUnicodeStringToChar(PUNICODE_STRING UniName, char Name[])
{
ANSI_STRING AnsiName;
NTSTATUS ntstatus;
char* nameptr;
__try
{
ntstatus = RtlUnicodeStringToAnsiString(&AnsiName, UniName, TRUE);
if (AnsiName.Length < 260)
{
nameptr = (PCHAR)AnsiName.Buffer;
//Convert into upper case and copy to buffer
strcpy(Name, _strupr(nameptr));
//DbgPrint("NPUnicodeStringToChar : %s\n", Name);
}
RtlFreeAnsiString(&AnsiName);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
//DbgPrint("NPUnicodeStringToChar EXCEPTION_EXECUTE_HANDLER\n");
return FALSE;
}
return TRUE;
}
// 在create之前的时候,获得完整的路径。
ULONG
cfFileFullPathPreCreate(
PFILE_OBJECT file,
PUNICODE_STRING path
)
{
NTSTATUS status;
POBJECT_NAME_INFORMATION obj_name_info = NULL;
WCHAR buf[64] = { 0 };
void *obj_ptr;
ULONG length = 0;
BOOLEAN need_split = FALSE;
ASSERT( file != NULL );
if(file == NULL)
return 0;
if(file->FileName.Buffer == NULL)
return 0;
obj_name_info = (POBJECT_NAME_INFORMATION)buf;
do {
// 获取FileName前面的部分(设备路径或者根目录路径)
if(file->RelatedFileObject != NULL)
obj_ptr = (void *)file->RelatedFileObject;
else
obj_ptr= (void *)file->DeviceObject;
status = ObQueryNameString(obj_ptr,obj_name_info,64*sizeof(WCHAR),&length);
if(status == STATUS_INFO_LENGTH_MISMATCH)
{
obj_name_info = ExAllocatePoolWithTag(NonPagedPool,length,CF_MEM_TAG);
if(obj_name_info == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
RtlZeroMemory(obj_name_info,length);
status = ObQueryNameString(obj_ptr,obj_name_info,length,&length);
}
// 失败了就直接跳出即可
if(!NT_SUCCESS(status))
break;
// 判断二者之间是否需要多一个斜杠。这需要两个条件:
// FileName第一个字符不是斜杠。obj_name_info最后一个
// 字符不是斜杠。
if( file->FileName.Length > 2 &&
file->FileName.Buffer[ 0 ] != L'\\' &&
obj_name_info->Name.Buffer[ obj_name_info->Name.Length / sizeof(WCHAR) - 1 ] != L'\\' )
need_split = TRUE;
// 获总体名字的长度。如果长度不足,也直接返回。
length = obj_name_info->Name.Length + file->FileName.Length;
if(need_split)
length += sizeof(WCHAR);
if(path->MaximumLength < length)
break;
// 先把设备名拷贝进去。
RtlCopyUnicodeString(path,&obj_name_info->Name);
if(need_split)
// 追加一个斜杠
RtlAppendUnicodeToString(path,L"\\");
// 然后追加FileName
RtlAppendUnicodeStringToString(path,&file->FileName);
} while(0);
// 如果分配过空间就释放掉。
if((void *)obj_name_info != (void *)buf)
ExFreePool(obj_name_info);
return length;
}
// 用IoCreateFileSpecifyDeviceObjectHint来打开文件。
// 这个文件打开之后不进入加密链表,所以可以直接
// Read和Write,不会被加密。
HANDLE cfCreateFileAccordingIrp(
IN PDEVICE_OBJECT dev,
IN PUNICODE_STRING file_full_path,
__inout PFLT_CALLBACK_DATA Data,
OUT NTSTATUS *status,
OUT PFILE_OBJECT *file,
OUT PULONG information)
{
HANDLE file_h = NULL;
IO_STATUS_BLOCK io_status;
ULONG desired_access;
ULONG disposition;
ULONG create_options;
ULONG share_access;
ULONG file_attri;
OBJECT_ATTRIBUTES obj_attri;
ASSERT(Data->Iopb->MajorFunction == IRP_MJ_CREATE);
*information = 0;
// 填写object attribute
InitializeObjectAttributes(
&obj_attri,
file_full_path,
OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
NULL,
NULL);
// 获得IRP中的参数。
desired_access = Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess;
disposition = Data->Iopb->Parameters.Create.Options>>24;
create_options = (Data->Iopb->Parameters.Create.Options & 0x00ffffff);
share_access = Data->Iopb->Parameters.Create.ShareAccess;
file_attri = Data->Iopb->Parameters.Create.FileAttributes;
// 调用IoCreateFileSpecifyDeviceObjectHint打开文件。
*status = IoCreateFileSpecifyDeviceObjectHint(
&file_h,
desired_access,
&obj_attri,
&io_status,
NULL,
file_attri,
share_access,
disposition,
create_options,
NULL,
0,
CreateFileTypeNone,
NULL,
0,
dev);
if(!NT_SUCCESS(*status))
return file_h;
// 记住information,便于外面使用。
*information = io_status.Information;
// 从句柄得到一个fileobject便于后面的操作。记得一定要解除
// 引用。
*status = ObReferenceObjectByHandle(
file_h,
0,
*IoFileObjectType,
KernelMode,
file,
NULL);
// 如果失败了就关闭,假设没打开文件。但是这个实际上是不
// 应该出现的。
if(!NT_SUCCESS(*status))
{
ASSERT(FALSE);
ZwClose(file_h);
}
return file_h;
}
NTSTATUS
NPInstanceSetup (
__in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_SETUP_FLAGS Flags,
__in DEVICE_TYPE VolumeDeviceType,
__in FLT_FILESYSTEM_TYPE VolumeFilesystemType
)
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
UNREFERENCED_PARAMETER( VolumeDeviceType );
UNREFERENCED_PARAMETER( VolumeFilesystemType );
PAGED_CODE();
PT_DBG_PRINT( PTDBG_TRACE_ROUTINES,
("NPminifilter!NPInstanceSetup: Entered\n") );
return STATUS_SUCCESS;
}
NTSTATUS
NPInstanceQueryTeardown (
__in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
)
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
PT_DBG_PRINT( PTDBG_TRACE_ROUTINES,
("NPminifilter!NPInstanceQueryTeardown: Entered\n") );
return STATUS_SUCCESS;
}
VOID
NPInstanceTeardownStart (
__in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_TEARDOWN_FLAGS Flags
)
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
PT_DBG_PRINT( PTDBG_TRACE_ROUTINES,
("NPminifilter!NPInstanceTeardownStart: Entered\n") );
}
VOID
NPInstanceTeardownComplete (
__in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_TEARDOWN_FLAGS Flags
)
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
PT_DBG_PRINT( PTDBG_TRACE_ROUTINES,
("NPminifilter!NPInstanceTeardownComplete: Entered\n") );
}
VOID
CleanupContext(
__in PFLT_CONTEXT Context,
__in FLT_CONTEXT_TYPE ContextType
)
{
PSTREAM_CONTEXT streamCtx = NULL ;
//PAGED_CODE();
switch (ContextType)
{
case FLT_STREAM_CONTEXT:
{
streamCtx = (PSTREAM_CONTEXT)Context ;
if (streamCtx == NULL)
break ;
if (NULL != streamCtx->Resource)
{
ExDeleteResourceLite(streamCtx->Resource) ;
ExFreePoolWithTag(streamCtx->Resource, RESOURCE_TAG) ;
}
break ;
}
default :
break ;
}
}
NTSTATUS
DriverEntry (
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
PSECURITY_DESCRIPTOR sd;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uniString; //for communication port name
UNREFERENCED_PARAMETER( RegistryPath );
DbgPrint("begin driverentry...\n");
cfCurProcNameInit();
//prefixName =(PWCHAR)ExAllocatePoolWithTag( NonPagedPool,
// 512 *sizeof(WCHAR),
// 'yPsF' );
//memset(prefixName,0,512 *sizeof(WCHAR));
//prefixName = L"HideDir";
//注册微型过滤器
status = FltRegisterFilter( DriverObject,
&FilterRegistration,
&gFilterHandle );
ASSERT( NT_SUCCESS( status ) );
if (NT_SUCCESS( status ))
{
//
// Start filtering i/o
//
//
status = FltStartFiltering( gFilterHandle );
if (!NT_SUCCESS( status ))
{
FltUnregisterFilter( gFilterHandle );
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
文件夹隐藏利用驱动实现文件的隐藏
共23个文件
h:5个
c:4个
vcxproj:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 193 浏览量
2023-08-18
11:13:06
上传
评论
收藏 35KB RAR 举报
温馨提示
文件夹隐藏利用驱动实现文件的隐藏主要是在IRP_MJ_DIRECTORY_CONTROL的后操作回调函数中处理其输入参数FLT_CALLBACK_DATA结构中的缓冲区数据。该缓冲地址的获取是重点.rar
资源推荐
资源详情
资源评论
收起资源包目录
文件夹隐藏利用驱动实现文件的隐藏主要是在IRP_MJ_DIRECTORY_CONTROL的后操作回调函数中处理其输入参数FLT_CALLBACK_DATA结构中的缓冲区数据。该缓冲地址的获取是重点.rar (23个子文件)
minifilter
Minifilter.dsw 543B
Minifilter.c 40KB
makefile 374B
Minifilter.vcxproj 6KB
S_File.c 13KB
Minifilter.vcxproj.filters 2KB
NPminifilter.inf 2KB
buildchk_wnet_x86.wrn 2KB
Minifilter.opt 48KB
cf_proc.h 970B
buildchk_wnet_x86.log 7KB
Minifilter.h 7KB
S_Ctx.c 5KB
Minifilter.vcxproj.user 143B
Minifilter.dsp 5KB
S_Ctx.h 1KB
sources 202B
S_Common.h 1KB
S_File.h 2KB
Minifilter.plg 2KB
Minifilter.sln 886B
Minifilter.suo 26KB
cf_proc.c 3KB
共 23 条
- 1
资源评论
- weixin_393019642023-11-22资源很实用,对我启发很大,有很好的参考价值,内容详细。
处处清欢
- 粉丝: 154
- 资源: 2505
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功