内核呓语系列7 —— DPC与APC

2014-2-15 Nie.Meining Coding

今天接着讲中断后端。前面已经说过了,中断处理例程的优先级太高,有很多限制,尤其是不能让出处理器影响机器响应能力,因此,为了让中断例程处理尽可能少的的工作,Linux和Windows都采用了一些方法把次要工作延后到中断处理例程之外的中断后端去处理。Windows采用的方式是插入DPC,Linux中常用的方式有以下几种:
1. BH接口:最古老的方式。系统中总共只能有32个BH(用一个32位变量做mark),每个BH都是全局同步的(即使在多核环境中),因此很不灵活且效率很低,已经被取缔了;
2. task queues:内核定义了一堆task queue,驱动可以在合适的queue中注册他们的中断后端。依然不灵活、性能低,已取缔;
3. softirq: 一组静态定义(编译时静态分配)的中断后端,能在不同的处理器上并行执行(即使是两个相同类型的softirq),因此常用于对性能要求很高的情况。softirq不会被另一个softirq抢占,但会被中断处理例程抢占;
4. tasklet: 动态添加的中断后端,在softirq的基础上实现,能在不同的处理器上并行执行,但两个相同类型的tasklet不能并行执行。因此虽然性能略低于softirq,但性价比最高,是最常用的中断后端方式;
5. work queues:将任务排队到进程上下文中执行,每个cpu有一个event/n内核线程worker threads,复制处理排队的任务。这个跟Windows的work item机制(ExQueueWorkItem)很像。Windows系统中的System进程中有一个系统辅助线程池,池中的系统辅助线程专门处理排队的work item。因此有时候IRQL过高时,可以将任务以work item的形式排队给系统辅助线程在PASSIVE_LEVEL上执行。

阅读全文>>

评论(0) 浏览(1886)

三个nop的玄机

2014-2-10 Nie.Meining Debug

最近百度卫士宣传力度挺大,春节在家闲来无事下载了一个看看。第一印象感觉界面简约,功能干净不臃肿,是我喜欢的风格。首先在x86环境下看看hook点:

1.png

跟360、金山卫士、QQ管家等其它主动防御一样,hook点选择了系统调用的分发函数KiSystemServiceRepeat。而且hook方式跟QQ管家很像,将mov edi, esp; cmp esi, xxx; 这两条指令替换成了三个nop和一个jmp,但是他们之间的区别是,QQ管家是先nop再jmp,百度卫士是先jmp再nop。其实这个顺序是有玄机的!(以前逆向过QQ管家,感谢sysnap大牛点拨)

阅读全文>>

评论(547) 浏览(213564)

Powered by emlog