bigpeon
驱动牛犊
驱动牛犊
  • 注册日期2010-05-15
  • 最后登录2010-05-23
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1768回复:2

请教双核下TDI-Hook蓝屏问题

楼主#
更多 发布于:2010-05-19 23:49
代码是找的一段tdi-hook框架,自己改了下,准备拦截 IRP_MJ_CREATE的分派函数。
在单核机器上没问题,但是在双核机器上总是能遇到奇怪现象:
正在收发数据的应用程序变得非常卡,貌似快要失去响应一样。过几秒钟就蓝屏重启。
恢复unhook操作也一样会出现问题。
自己先搜了一下,看到说多核下hook不能这么简单替换,需要用到分发DPC、开关中断等处理。

请问用 TDI-filter 过滤方式是否能在多核下安全呢(不需特殊处理)?
虽然有可能临时试不出来,但还是希望在理论上有个求证。
本人是驱动菜鸟,各位如能详细解答,非常感激。

NTSTATUS HookTDI(void)
{
    NTSTATUS Status;
    UNICODE_STRING usDriverName;
    PDRIVER_OBJECT DriverObjectToHookPtr;
    
    RtlInitUnicodeString(&usDriverName,L"\\Driver\\Tcpip");

    Status = ObReferenceObjectByName(&usDriverName,OBJ_CASE_INSENSITIVE,NULL,0,*IoDriverObjectType,KernelMode,NULL,&DriverObjectToHookPtr);
    if(Status != STATUS_SUCCESS) 
    {
        return Status;
    }
    
    /*
    RealTDIDriverObject.MajorFunction[IRP_MJ_CREATE] = DriverObjectToHookPtr->MajorFunction[IRP_MJ_CREATE];
    DriverObjectToHookPtr->MajorFunction[IRP_MJ_CREATE] = TDIDeviceDispatch;
    */
    
    gOrgDispatch = (PDRIVER_DISPATCH) InterlockedExchange( 
                                                    (PLONG)&DriverObjectToHookPtr->MajorFunction[IRP_MJ_CREATE], 
                                                    (LONG)&TDIDeviceDispatch);
    
    ObDereferenceObject(DriverObjectToHookPtr);
    
    //DbgPrint("HookTDI ok\n");
    return STATUS_SUCCESS;
}
bigpeon
驱动牛犊
驱动牛犊
  • 注册日期2010-05-15
  • 最后登录2010-05-23
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-05-20 01:08
发现了自己 UnHook() 函数里的一个笔误,把函数指针的地址赋过去了,不蓝就怪了

改正以后,InterlockedExchange 已经能保证不出蓝屏。
bigpeon
驱动牛犊
驱动牛犊
  • 注册日期2010-05-15
  • 最后登录2010-05-23
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-05-20 01:12
多核下hook安全,是否只是针对 inline hook?
游客

返回顶部