关于安全安定举行内核hook的几个小常识[网络技术]
本文“关于安全安定举行内核hook的几个小常识[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
文章作者:asm
网上很多hook代码,特别是Obxxxxxx系列函数,它们很险恶,一旦hook得好,可如入无人之境,这点我深有领会啊,但是同时它们调用频繁,比方ObReferenceObjectByxxxxxx,基本上windows的每一个操作,城市调用它.比方就简单的一个双击一下记事本,ObReferenceObjectByxxxxxx已经被调用了,所以在举行hook的时刻,假如功力不深,就简单造成BSOD.
普通假如是我在动这些蛋糕的时刻,我城市注意以下几个方面:
1,一个强盛的汇编引擎,一个强盛的引擎必不可少
2,#pragma LOCKEDCODE
3,
CurrentIRQL = KeGetCurrentIrql();
if(CurrentIRQL>APC_LEVEL)
{
return Status;
}
4,在你的Fake_XXXXX内部,假如是指针类的变量,用最好先if下吧
此中最主要的还是IRQL问题,假如在Fake_XXXXX内部没有判断,而又调用_strcmpi等之类函数来做符合条件的判断的话,BSOD是必定的,这些函数是无法在>=DISPATCH_LEVEL的级别上运行.所以假如当前IRQL>=DISPATCH_LEVEL的话,乖乖返回吧,我就吃过这样的亏,搞了几天,后经高人指导 ^.^
我记得mj说过的一句话:hook的最高境地是,即便自己失利,也不要让别人崩溃!跪拜下~
另附一个不错的注意事项:
1. 一定不要在没有标注 I/O 恳求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情形下通过调度例程返回 STATUS_PENDING.
2. 一定不要通过中止服务例程 (ISR) 调用 KeSynchronizeExecution. 它会使系统死锁.
3. 一定不要将 DeviceObject->Flags 设置为 DO_BUFFERED_IO 和 DO_DIRECT_IO. 它会扰乱系统并终究招致致命错误. 并且,一定不要在 DeviceObject->Flags 中设置 METHOD_BUFFERED、METHOD_NEITHER、METHOD_IN_DIRECT 或 METHOD_OUT_DIRECT,因为这些值只在定义 IOCTL 时利用.
4. 一定不要通过页面缓冲池分配调度程序对象. 假如这样做,将会无意招致系统弊端检测 (Bugcheck).
5. 当运行于 IRQL >= DISPATCH_LEVEL 时,一定不要通过页面缓冲池分配内存,或拜候页面缓冲池中的内存. 这是一个致命错误.
6. 一定不要在 IRQL >= DISPATCH_LEVEL 上等候核心调度程序对象呈现非零隔断. 这是一个致命错误.
7. 在 IRQL >= DISPATCH_LEVEL 上履行时,一定不要调用任何招致调用线程发生直接或间接等候的函数. 这是一个致命错误.
8. 一定不要把中止恳求级别 (IRQL) 降低到低于您的顶级例程被调用的级别.
9. 假如没有调用过 KeRaiseIrql(),则一定不要调用 KeLowerIrql().
10. 一定不要使处理器 (KeStallExecutionProcessor) 终止运转的时间超越 50 微秒.
11. 一定不要使旋转锁 (Spin Lock) 保持锁定状况的时间超越您的需求. 要使系统得到更好的总体性能,请不要使任何系统范围内有效的旋转锁的锁按时间超越 25 微秒.
12. 当 IRQL 大于 DISPATCH_LEVEL 时,一定不要调用 KeAcquireSpinLock 和 KeReleaseSpinLock,或 KeAcquireSpinLockAtDpcLevel 和 KeReleaseSpinLockFromDpcLevel.
13. 一定不要通过调用 KeReleaseSpinLockFromDpcLevel 来释放 KeAcquireSpinLock 所获得的旋转锁,因为这会使原始 IRQL 无法被复原.
14. 一定不要在 ISR 或 SynchCritSection 例程中调用 KeAcquireSpinLock 和 KeReleaseSpinLock 大概别的任何利用可履行旋转锁的例程.
15. 当您在例程中而不是在 DriverEntry 中成立设备对象时,一定不要忘掉排除 DO_DEVICE_INITIALIZING 标志.
16. 一定不要同时在差别处理器的多个线程中将延时历程调用 (DPC) 对象增添到行列中(利用 KeInsertQueueDpc). 这会招致致命错误.
17. 一定不要通过 CutomerTimerDPC 例程释放周期按时器. 您可以通过 DPC 例程释放非周期按时器.
18. 一定不要将相同的 DPC 指针传送给 KeSetTimer,大概 KeSetTimerEx (CustomTimerDpc) 和 KeInsertQueueDpc (CustomDpc),因为这将招致竞争.
19. 旋转锁锁按时,一定不要调用 IoStartNextPacket. 这将使系统死锁.
20. 旋转锁锁按时,一定不要调用 IoCompleteRequest. 这将使系统死锁.
21. 假如您的驱动程序设置了完成例程,那么一定不要在没有把完成例程设置为 NULL 的情形下调用 IoCompleteRequest.
22. 调用 IoCompleteRequest 之前,一定不要忘掉设置 IRP 中的 I/O 状况区.
23. 在将 IRP 增添到行列中或将它发送到另一个驱动程序 (IoCallDriver) 之后,一定不要调用 IoMarkPending. 在驱动程序调用 IoMarkPending 之前,IRP 大概已经完成,由此大概发生弊端检测. 关于包含完成例程的驱动程序,假如设置了 Irp->PendingReturned,则完成例程必须调用 IoMarkPending.
24. 一定不要在已经对某个 IRP 调用 IoCompleteRequest 之后再去拜候该 IRP.
25. 一定不要对不属于您的驱动程序的 IRP 调用 IoCancelIrp,除非您知道该 IRP 还没有完成.
26. 在您的调度例程返回到调用者之前,一定不要对您的调度例程正在处理的 IRP 调用 IoCancelIrp.
27. 一定不要从中间驱动程序
以上是“关于安全安定举行内核hook的几个小常识[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |