山东001在线

 找回密码
 立即注册
搜索
查看: 196|回复: 0

[美女] 研究发现:摘微过滤驱动回调的研究2023/3/31 14:07:17

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-22 14:51
  • 签到天数: 341 天

    [LV.8]以坛为家I

    发表于 2023-3-31 14:07:50 | 显示全部楼层 |阅读模式

    摘微过滤驱动回调的研究游戏基址的最新消息可以到我们平台网站了解一下,也可以咨询客服人员进行详细的解答!

    常用命令
    下面是通过进行文件过滤驱动加载的常用命令。







    1


    2




    DP


    DP





    问题
    写过MFI驱动的都知道FUF用于注销回调。





    但是MSDN中有这样一段话:





    AFUF,





    意思就是驱动应该自身去调用这个函数,而不是使用其他微过滤驱动去调用。





    为此我写了一个驱动去验,发现再调用后驱动就在调用FUF后一去不复返了。


    PCH
    在对这个函数进行下断后,发现PCH在调用移除过滤器后确会调用FUF。


    调试分析
    上双机调试环境,把IDA拖入,启动,W和-联调。







    1


    2


    3




    F:\\
    -
    \_\\64\R\


    !


    !FUF





    先追踪一去不复返的原因。











    经过调试发现EWFRPR导致了函数的限等待。





    找到了这个原因,让我们看看MSDN,根据R可知,需要通过调用来释放保护,这个函数才能返回。





    再次调试,看看这个对象的引用计数是怎样的。











    在调用R之后,我们断在函数FUF处:







    1


    2


    3


    4


    5


    6


    7


    8


    9






















    1
    :


    B
    0



    !FUF:


    880`
    0
    4884
    ,


    1
    :



    =
    0000000000000000

    =
    8
    =
    884



    =
    880
    =
    842
    =
    880



    =
    8800
    =
    8801
    =
    8800



    8
    =
    8809
    =
    0000000000000000

    =
    88000



    =
    84
    =
    0000000000000000

    =
    00000000000000



    =
    00000000000000

    =
    880



    =
    0




    =
    00

    =


    =
    0

    =
    0

    =
    03

    =
    0

    =
    00


    !FUF:


    880`
    0
    4884
    ,





    首个参数即是_FLT_FILTER的指针







    1


    2


    3


    4


    5


    6


    7


    8


    9



































































    1
    :!_FLT_FILTER@



    +
    0000
    B:_FLT_OBJECT



    +
    00
    F:
    0
    `
    60
    _FLTP_FRAME



    +

    N:_UNICODE_STRING
    "DP"



    +

    DA:_UNICODE_STRING
    "3451"



    +

    F:
    2
    (FLTFL_FILTERING_INITIATED)



    +
    00
    DO:
    0
    `
    60
    _DRIVER_OBJECT



    +

    IL:_FLT_RESOURCE_LIST_HEAD



    +
    0
    VE:()



    +
    000
    VFL:_LIST_ENTRY[
    000000000
    `
    00000000
    -
    000000000
    `
    00000000
    ]



    +
    000
    FU:
    80
    `
    60

    DP!DPU
    +
    0



    +
    0
    IS:
    80
    `
    6000

    DP!DPIS
    +
    0



    +
    00
    IQT:
    80
    `
    6

    DP!DPIQT
    +
    0



    +

    ITS:
    80
    `
    60
    DP!DPITS
    +
    0



    +

    ITC:
    80
    `
    600
    DP!DPITC
    +
    0



    +

    SCLH:()



    +

    SC:[
    6
    ]()



    +
    50
    PVM:()



    +
    58
    PVM:()



    +
    60
    GFN:()



    +
    68
    NNC:()



    +
    70
    NNCE:()



    +
    78
    NCC:()



    +
    80
    KN:()



    +
    88
    O:
    0
    `
    6860
    _FLT_OPERATION_REGISTRATION



    +
    90
    ODU:()



    +
    98
    AO:_FLT_MUTEX_LIST_HEAD



    +
    8
    CL:_FLT_MUTEX_LIST_HEAD



    +
    38
    PL:_FLT_MUTEX_LIST_HEAD



    +
    88
    PL:_EX_PUSH_LOCK





    接下来我们看看相关的计数







    1


    2


    3


    4




    1
    :??((!_FLT_FILTER
    *
    )(@))
    -
    BRR


    _EX_RUNDOWN_REF



    +
    0000
    C:
    0



    +
    0000
    P:
    000000000
    `
    0000000
    V





    可以看到再我们卸载时这个C为0C。





    在调用EWFRPR之前,我们再看一次计数







    1


    2


    3


    4




    1
    :??((!_FLT_FILTER
    *
    )(
    84
    ))
    -
    BRR


    _EX_RUNDOWN_REF



    +
    0000
    C:
    2



    +
    0000
    P:
    000000000
    `
    000000
    V





    可以看到此时的计数是2。





    那么我们接下来测试PCH。











    再调用移除过滤器后我们也成功断在了入口处。







    1


    2


    3


    4


    5


    6


    7


    8


    9






















    1
    :


    B
    0



    !FUF:


    880`
    0
    4884
    ,


    0
    :



    =
    8800
    =
    807
    =
    83500



    =
    83500
    =
    810
    =
    83500



    =
    8800
    =
    880
    =
    00000000000000



    8
    =
    0000000000000000
    9
    =
    0000000000000000

    =
    00000000000000



    =
    843553
    =
    835
    =
    8805550



    =
    0000000000000000

    =
    800060



    =
    0




    =
    00

    =


    =
    0

    =
    0

    =
    03

    =
    0

    =
    0006


    !FUF:


    880`
    0
    4884
    ,





    我们看一下引用计数,现在是0。







    1


    2


    3


    4




    0
    :??((!_FLT_FILTER
    *
    )(@))
    -
    BRR


    _EX_RUNDOWN_REF



    +
    0000
    C:
    0



    +
    0000
    P:
    000000000
    `
    0000000
    V





    放过去,运行到调用EWFRPR之前,发现引用计数变为了0。







    1


    2


    3


    4




    1
    :??((!_FLT_FILTER
    *
    )(
    3500
    ))
    -
    BRR


    _EX_RUNDOWN_REF



    +
    0000
    C:
    0



    +
    0000
    P:()





    因此PCH肯定是调用了ERRP去释放运行时保护。





    L’!





    关键代码如下:







    1


    2


    3




    PEX_RUNDOWN_REFRR
    =
    (PEX_RUNDOWN_REF)((
    *
    )FL[]
    +
    );


    ERRP(RR);


    FUF(FL[]);





    重新编译驱动,下断。







    1


    2




    !FUF


    !FUF
    +
    0





    首次断下记录







    1


    2


    3


    4


    5


    6


    7




    0
    :



    =
    0000000000000000

    =
    895
    =
    8890



    =
    000000000000000

    =
    8
    =
    8805694



    =
    8800
    =
    8805698
    =
    88056960



    8
    =
    88989
    =
    0000000000000000

    =
    80



    =
    82
    =
    0000000000000000

    =
    00000000000000



    =
    00000000000000

    =
    8





    第二次断下查看计数,O!效果和PCH一样了。







    1


    2


    3


    4




    1
    :??((!_FLT_FILTER
    *
    )(
    890
    ))
    -
    BRR


    _EX_RUNDOWN_REF



    +
    0000
    C:
    0



    +
    0000
    P:()





    然后就成功移除掉了。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Archiver|山东001在线 ( ICP11027147 )

    GMT+8, 2026-4-4 21:05 , Processed in 0.037898 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表