需要帮助从 Minifilter 中的用户模式应用程序获得回复

如何解决需要帮助从 Minifilter 中的用户模式应用程序获得回复

我在从 kernel to user-mode. 通信时遇到问题 我的要求是在 postCreate 中将进程路径发送到用户模式并从用户模式应用程序获得回复。 处理路径并返回布尔值的用户模式进程。

系统在步骤 GetQueuedCompletionStatus() 挂起并重新启动。我不知道为什么,也想不通。

我也尝试过 scanner 示例,但在该示例中 GetQueuedCompletionStatus() 阻止执行并且不返回任何内容。

我完全迷失了,无法弄清楚系统挂起并重新启动的原因。

我已经使用 FltSendMessage 将路径发送到用户模式并超时。

请帮我让它工作。我会非常感谢你。

结构信息:

typedef struct _MINISPY_NOTIFICATION {
    
        BOOLEAN flag; 
        ULONG Reserved;             // for quad-word alignement of the Contents structure
        UCHAR ProcessPath[MINISPY_PROCESS_PATH_SIZE]; //TODO: 260?
        UCHAR filePath[MINISPY_PROCESS_PATH_SIZE]; //Drive FilePath 
    
    } MINISPY_NOTIFICATION,* PMINISPY_NOTIFICATION;
    


 typedef struct _MINISPY_REPLY {
        
            BOOLEAN res;     // if res is true then BLOCK otherwise ALLOW
        
        } MINISPY_REPLY,* PMINISPY_REPLY;

typedef struct _MINISPY_THREAD_CONTEXT {
    
        HANDLE Port;
        HANDLE Completion;
    
    } MINISPY_THREAD_CONTEXT,* PMINISPY_THREAD_CONTEXT;

typedef struct _MINISPY_MESSAGE {

    FILTER_MESSAGE_HEADER MessageHeader;

    MINISPY_NOTIFICATION Notification;

    OVERLAPPED Ovlp;

} MINISPY_MESSAGE,* PMINISPY_MESSAGE;

typedef struct _MINISPY_REPLY_MESSAGE {

    FILTER_REPLY_HEADER ReplyHeader;

    MINISPY_REPLY Reply;

} MINISPY_REPLY_MESSAGE,*PMINISPY_REPLY_MESSAGE;

用户模式代码:

DWORD
RetrieveMsgAndReplyToKernel(
    _In_ LPVOID lpParameter
) {
   
    PMINISPY_THREAD_CONTEXT context = (PMINISPY_THREAD_CONTEXT)lpParameter;

    MINISPY_REPLY_MESSAGE response;

    MINISPY_MESSAGE notificatioBuffer;
    PMINISPY_MESSAGE notification;

    RtlZeroMemory(&notificatioBuffer.Ovlp,sizeof(OVERLAPPED));
    notification = &notificatioBuffer;

    HRESULT hr;
    BOOL resultBool;

    while (TRUE) {
        NTSTATUS status;
        BOOL success;
        DWORD outSize;
        ULONG_PTR key;
        LPOVERLAPPED overlapped;
        UCHAR responseFlags;
       
        UINT errorCode;

        printf("\nWaiting to get msg from kernel...");
        hr = FilterGetMessage(
            context->Port,&notification->MessageHeader,FIELD_OFFSET(MINISPY_MESSAGE,Ovlp),&notification->Ovlp);

        if (hr != HRESULT_FROM_WIN32(ERROR_IO_PENDING))
            break;

        printf("\nWaiting to get GetQueuedCompletionStatus success...\n");
        printf("\nInThreadFunc,Minispy: Port = 0x%p Completion = 0x%p\n",context->Port,context->Completion);



       //TODO: SYSTEM HANGS here AND RESTARTED!



        success = GetQueuedCompletionStatus(
            context->Completion,&outSize,&key,&overlapped,INFINITE);

        if (!success)
            break;

        // Obtain the notification. Note that this notification may not be
        // the same as message buffer,since there are multiple threads.

     
        printf("GetQueuedCompletionStatus Success!");

        notification = CONTAINING_RECORD(overlapped,MINISPY_MESSAGE,Ovlp);

        //TODO: process processPath


        //printf("\nReceived messageId: %llu\n",notification->MessageHeader.MessageId);
        //TODO: process processPath and fileName and update the result
        //resultBool = strstr(notification->Notification.ProcessPath,"firefox") != NULL ? TRUE : FALSE;
       

        response.ReplyHeader.Status = 0;
        response.ReplyHeader.MessageId = notification->MessageHeader.MessageId;
        response.Reply.res = resultBool;
        printf("\nReplying message,Res bool: %d\n",response.Reply.res);

        hr = FilterReplyMessage(context->Port,&response.ReplyHeader,sizeof(notification->MessageHeader.ReplyLength));

        if (SUCCEEDED(hr)) {
            printf("\nsuccessfully Replied message!\n");
        }
        else {
            printf("\nMINISPY: Error replying message. Error = 0x%X\n",hr);
        }
    }

    if (!SUCCEEDED(hr)) {

        if (hr == HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE)) {

            //
            //  MINISPY port disconncted.
            //

            printf("\nMINISPY: Port is disconnected,probably due to MINISPY filter unloading.\n");

        }
        else {

            printf("\nMINISPY: Unknown error occured. Error = 0x%X\n",hr);
        }
    }

    return hr;
}




    int _cdecl
    main (
        _In_ int argc,_In_reads_(argc) char *argv[]
        )
   
    {
        HANDLE port = INVALID_HANDLE_VALUE;
        HRESULT hResult = S_OK;
        DWORD result;
        ULONG threadId2;
        HANDLE thread2 = NULL;
        MINISPY_THREAD_CONTEXT context2; //to reply to kernel
        UINT threadCount = 1; // number of thread to reply to kernel
        CHAR inputChar;
        HANDLE completion = INVALID_HANDLE_VALUE;
    
        printf( "Connecting to filter's port...\n" );
    
        hResult = FilterConnectCommunicationPort( MINISPY_PORT_NAME,// fully name of port to connect
                                                  0,NULL,&port // receives a handle for the newly created connection port if the call to FilterConnectCommunicationPort succeeds
                                                );
    
        if (IS_ERROR( hResult )) {
    
            printf( "Could not connect to filter: 0x%08x\n",hResult );
            DisplayError( hResult );
            goto Main_Exit;
        }
    
        completion = CreateIoCompletionPort(port,threadCount);
    
        if (completion == NULL) {
    
            printf("ERROR: Creating completion port: %d\n",GetLastError());
            CloseHandle(port);
            return 3;
        }
    
        printf("Minispy: Port = 0x%p Completion = 0x%p\n",port,completion);
    
        context2.Port = port;
        context2.Completion = completion;
    
        //
       // Create the thread to read msg from kernel and reply bool to kernel
       // by MiniSpy.sys.
       //
        thread2 = CreateThread(NULL,RetrieveMsgAndReplyToKernel,(LPVOID)&context2,&threadId2);
    
        if (!thread2) {
    
            result = GetLastError();
            printf("Could not create MsgReplying thread: %d\n",result);
            DisplayError(result);
            goto Main_Exit;
        }
         
         //Waiting here for the thread to return 
          
      }

内核代码:

    // In PreRead 
 try {

                        PMINISPY_NOTIFICATION notification = ExAllocatePoolWithTag(NonPagedPool,sizeof(MINISPY_NOTIFICATION),SPY_TAG);

                        if (notification != NULL) {
                            seconds_to_wait = 5;
                            timeOut.QuadPart = -((LONGLONG)seconds_to_wait * 10 * 1000 * 1000);
                            replyLength = sizeof(MINISPY_REPLY);

                            //TODO: send processName to userMode app and wait for the reply
                            DbgPrint("\nMiniPreRead: kernelToUserMode: Waiting for usermode reply...");
                            status = FltSendMessage(MiniSpyData.Filter,&MiniSpyData.ClientPort,notification,replyBuffer,&replyLength,&timeOut);

                            if (STATUS_SUCCESS == status) {
                                blockOrAllowFlag = ((PMINISPY_REPLY)replyBuffer)->res;
                                DbgPrint("\nMiniPreRead: kernelToUserMode: Reply blockOrAllowFlag: %d",blockOrAllowFlag);
                            }
                            else if (STATUS_TIMEOUT == status) {
                                DbgPrint("\nMiniPreRead: kernelToUserMode: timeout occured!");
                            }
                            else {
                                //  Couldn't send message. This sample will let the i/o through. 
                                DbgPrint("\nMiniPreRead: kernelToUserMode: --- couldn't send message to user-mode to processpath,status 0x%X\n",status);
                            }
                        }
                    }
                    finally {
                        if (notification != NULL) {
                            ExFreePoolWithTag(notification,SPY_TAG);
                        }
                    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res