zoukankan      html  css  js  c++  java
  • 编写安全的驱动程序之输入输出检查

    编写安全的驱动程序之输入输出检查

    输入输出检查是指对不可信的输入输出地址及数据长度进行合法性检查的过程。这种方法在Windows内核API中应用的十分广泛。

    例如,在NtReadFile函数中,如果PreviousMode不是KernelMode,即NtReadFile函数是从用户态被调用的,可以使用ProbeForWrite函数检测输入输出缓冲区是否可写,参见ReactOS中的代码如下:

    NTSTATUS NTAPI NtReadFile(IN HANDLE FileHandle,

               IN HANDLE Event OPTIONAL,

               IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

               IN PVOID ApcContext OPTIONAL,

               OUT PIO_STATUS_BLOCK IoStatusBlock,

               OUT PVOID Buffer,

               IN ULONG Length,

               IN PLARGE_INTEGER ByteOffset OPTIONAL,

               IN PULONG Key OPTIONAL)

    {

        KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();

        //省略部分代码......

        /* Validate User-Mode Buffers */

        if (PreviousMode != KernelMode)

        {

            _SEH2_TRY

            {

                /* Probe the status block */

                ProbeForWriteIoStatusBlock(IoStatusBlock);

                /* Probe the read buffer */

                ProbeForWrite(Buffer, Length, 1);

        //省略部分代码......

    类似地,在NtWriteFile函数中当发现PreviousMode不是KernelMode时,即从用户态调用过来的,可以使用ProbeForRead函数进行检测。

    此外,在IoControl中如果IoControlCode指定的MthodMETHOD_NEITHER时,也应当对输入和输出地址使用ProbeForReadProbeForWrite函数进行检验。

     

    本文节选自《0day安全:软件漏洞分析技术(第2版)》一书。

    图书详细信息:http://www.cnblogs.com/broadview/archive/2011/07/11/2103329.html

  • 相关阅读:
    上传图片预览--图片上传后显示在某个模块中
    商品规格选择--添加背景色,并显示已选规格
    jquery选项卡
    swiper轮播图--兼容IE8
    点击图片查看大图--以弹框的形式显示在屏幕正中间
    百度地图API首页 -- 鼠标经过:类似翻页效果和 类似锚点链接效果
    别踩白块
    Jersey(1.19.1)
    Table of Contents
    Jersey(1.19.1)
  • 原文地址:https://www.cnblogs.com/broadview/p/2103341.html
Copyright © 2011-2022 走看看