阅读:1234回复:1
请问这里为什么要这样做?
以前看监控注册表的驱动,在下钩时只是找到函数服务地址把自己的函数赋给他就行了,而现在看NDIS钩住NdisDeregisterProtocol等这些函数却要这样(没看懂下面的一段,请指点一下):
addr是在NDIS模块存放要钩住函数偏移量的地址,value为自己的函数地址相对于NDIS基指的偏移量 为什么不能直接把value这个值直接赋给addr所在地址(或者直接把NDIS基指+*addr=我的函数地址)???而要像下面这样? BOOLEAN replace_value_safe(ULONG *addr, ULONG value)//在这里下钩 { MDL *mdl; ULONG *virt_addr; mdl = IoAllocateMdl(addr, sizeof(value), FALSE, FALSE, NULL); if (mdl == NULL) return FALSE; __try { MmProbeAndLockPages(mdl, KernelMode, IoModifyAccess);//在内存中锁定MDL描述的页 } __except(EXCEPTION_EXECUTE_HANDLER) { KdPrint(("[ndis_hk] replace_value_safe: MmProbeAndLockPages!\n")); return FALSE; } //将锁定的物理页映射到系统空间 virt_addr = (ULONG *)MmGetSystemAddressForMdlSafe(mdl,NormalPagePriority); *(ULONG *)virt_addr = value; MmUnlockPages(mdl); IoFreeMdl(mdl); return TRUE; } |
|
沙发#
发布于:2008-10-20 14:55
个人猜想,你要放钩子的协议驱动程序有没有可能被卸载(网络协议不同于其它有些常驻内存的内核驱动,是有可能被用户卸载的)。
感觉这段code是为了保证更加安全的处理方式,MmProbeAndLockPages(),找到地址所在的物理页并将其锁定,即在进行地址替换的时候,该地址所在页不可能由于被交换出物理页面而变得无效。 |
|