首页
社区
课程
招聘
FltUnregisterFilter( gFilterHandle )卸载卡死是什么原因
发表于: 2017-9-25 15:07 5399

FltUnregisterFilter( gFilterHandle )卸载卡死是什么原因

2017-9-25 15:07
5399
minifilter中FltUnregisterFilter( gFilterHandle )卸载卡死是什么原因

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 256
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
可能。还有  Port  没关闭。
2017-9-25 16:06
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
port我全关了
2017-9-25 17:29
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
#pragma    LOCKEDCODE
NTSTATUS
FilterUnload  (
                           __in  FLT_FILTER_UNLOAD_FLAGS  Flags
                           )
{

       UNREFERENCED_PARAMETER(  Flags  );
       NTSTATUS  status;

       KdPrint(("卸载    !  \n    "));
       ExDeleteNPagedLookasideList(  &Pre2PostContextList  );
       FreeStrategy(key_word_header);        
       FltCloseCommunicationPort(serverPort);
       KdPrint(("1\n"));

       FltUnregisterFilter(  gFilterHandle  );
       KdPrint(("卸载完成  !  \n    "));
       
       return  STATUS_SUCCESS;
}


//关闭回调
VOID
MyDisconnectCallback  (
                                           __in_opt  PVOID  ConnectionCookie
                                           )
{

       PAGED_CODE();
       UNREFERENCED_PARAMETER(ConnectionCookie);
       KdPrint(("Disconnect\n"));
       //关闭通信连接
       FltCloseClientPort(gFilterHandle  ,  &gClientPort);
}
2017-9-25 17:31
0
雪    币: 58
活跃值: (1360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
整个系统卡死?  搞个dump分析下/。
2017-9-25 21:52
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
就是还不该怎么分析呀,      看不懂windbg对dump分析的信息
2017-9-26 09:23
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
就是还不该怎么分析呀,      看不懂windbg对dump分析的信息
2017-9-26 09:23
0
雪    币: 0
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
上传dump链接
2017-9-26 09:49
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
卡死的时候不蓝屏,没有dump文件呀!  后来我把PostCreate注释掉就可以正常卸载

PostCreate代码如下,我在precreate中只是简单的返回了FLT_PREOP_SUCCESS_WITH_CALLBACK
#pragma    LOCKEDCODE
FLT_POSTOP_CALLBACK_STATUS
MyPostCreate(
                         __inout  PFLT_CALLBACK_DATA  Data,
                         __in  PCFLT_RELATED_OBJECTS  FltObjects,
                         __in  PVOID  CompletionContext,
                         __in  FLT_POST_OPERATION_FLAGS  Flags
                         )
{
       FLT_POSTOP_CALLBACK_STATUS  retValue  =  FLT_POSTOP_FINISHED_PROCESSING;
       PSTREAM_HANDLE_CONTEXT  streamCtx  =  NULL;
       NTSTATUS  status;
       __try{

               //初始化流临时上下文
               STREAM_HANDLE_CONTEX  temCtx;
               temCtx.isEncyptFile  =  IS_NOT_ENCRYPT_FILE;  //初始化是不加密文件
               temCtx.isEncypted  =  IS_NOT_ENCRYPTED;  //文件没有加密
               temCtx.keyWord  =  NULL;    //文件类型为空


               //获取文件的加密信息,判断文件是不是已经加密
               status  =  GetFileEncryptInfoToCtx(Data,FltObjects,&temCtx,key_word_header);
               if(!NT_SUCCESS(status))
               {
                       return  retValue;
               }

               //如果不是加密类型,直接放过
               if  (temCtx.isEncyptFile!=IS_ENCRYPT_FILE)
               {
                       return  retValue;
               }

               //清除缓冲
               cfFileCacheClear(FltObjects->FileObject);

               //检查开关
               if(!IS_SYSTEM_OPEN)
               {
                       return  retValue;
               }
               status=FltGetStreamHandleContext(FltObjects->Instance,
                                               FltObjects->FileObject,
                                               (PFLT_CONTEXT  *)&streamCtx);//接收上下文返回的地址

               if  (!NT_SUCCESS(status))
               {
                       //创建流上下文,分配一个上下文结构体
                       status  =  FltAllocateContext(  FltObjects->Filter,  //过滤器
                                                       FLT_STREAMHANDLE_CONTEXT,      //上下文类型
                                                       sizeof(STREAM_HANDLE_CONTEX),  //上下文大小
                                                       NonPagedPool,//池子类型
                                                       (PFLT_CONTEXT  *)(&streamCtx));  //返回的上下文

                               if  (!NT_SUCCESS(status)) 
                               {
                                       return  retValue;
                               }
                       PFLT_CONTEXT  oldCtx;
                       //设置文件流句柄上下文
                       status=FltSetStreamHandleContext(FltObjects->Instance, 
                                                       FltObjects->FileObject,
                                                       FLT_SET_CONTEXT_KEEP_IF_EXISTS,    //操作类型
                                                       streamCtx,  //新的上下文
                                                       &oldCtx);    //以前存在的旧的上下文

                       if  (oldCtx!=NULL)
                       {
                               streamCtx=(PSTREAM_HANDLE_CONTEXT)oldCtx;
                       }

                       if  (!NT_SUCCESS(status))
                       {

                               return  retValue;
                       }
               }

               //复制streamCtx
               streamCtx->isEncypted=temCtx.isEncypted;
               streamCtx->isEncyptFile=temCtx.isEncyptFile;
               streamCtx->keyWord=temCtx.keyWord;


               if  (streamCtx->isEncypted  ==  IS_NOT_ENCRYPTED)
               {
                       //在是加密类型的基础上并且没有加密,如果是机密进程,打开就加密
                       //获取进程名称
                       PCHAR  procName=GetCurrentProcessName(ProcessNameOffset);

                       //如果是机密进程则加密文件
                       if  (IsSecretProcess(streamCtx->keyWord,procName))
                       {
                               //加密文件
                               status=EncryptFile(Data,FltObjects,key);
                               if(NT_SUCCESS(status))
                               {

                                       streamCtx->isEncypted=IS_ENCRYPTED;
                                       DbgPrint("文件加密完成  \n");
                               }
                               else
                               {
                                       //DbgPrint("encrypt  a  file  fail");
                               }

                       }

               }
               //获取文件的信息
               status=FltQueryInformationFile(FltObjects->Instance,
                               Data->Iopb->TargetFileObject,
                               &(streamCtx->fileInfo),        //接收文件信息
                               sizeof(FILE_STANDARD_INFORMATION),
                               FileStandardInformation,
                               NULL);
                               //清除缓冲
               cfFileCacheClear(FltObjects->FileObject);

               KdPrint(("FltReleaseContext  \n"));
               if  (streamCtx!=NULL)
               {
                       FltReleaseContext(streamCtx);
               }

       }

       __except(EXCEPTION_EXECUTE_HANDLER)
       {
               DbgPrint("a  exception  happened  in  postCreate");
               if  (streamCtx!=NULL)
               {
                       FltReleaseContext(streamCtx);
               }
       }

       return  retValue;
}

2017-9-26 10:29
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
走过路过的能给分析一下么
2017-9-26 11:45
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
752K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8S2L8W2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8U0q4T1M7r3@1K6g2U0t1K6
dump连接如下
2017-9-26 17:01
0
雪    币: 145
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
开Verifier.
2017-10-8 17:25
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
时隔一个月终于弄好了,就是get句柄后,在后面的判断语句中return之前没有释放上下文,要仔细喽!
2017-10-25 16:34
0
游客
登录 | 注册 方可回帖
返回