首页
社区
课程
招聘
[讨论]那些年搞驱动的那些坑_欢迎补充
发表于: 2014-4-17 23:31 20830

[讨论]那些年搞驱动的那些坑_欢迎补充

2014-4-17 23:31
20830
收藏
免费 0
支持
分享
最新回复 (61)
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
26
还是可以解决的 这里面还有一些其他坑 可能有人没注意到
比方说CR0 多核上面可是多套CR0
2014-4-18 10:51
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
27
简单写一下我的逻辑~
MDLOpen(HOOKADDR1);//MDL那套
LockCPU(CurCpu);//DPC插入其他u
VMXInit();//当前U初始化VMX
DoCpuid(HOOKADDR1,NEWADDR,&OLDFUNC,HOOKCMD);//CPUID引发VM-EXIT
VMXExit();//取消VMX
ReleaseCPU();//解锁其他U
MDLClose(HOOKADDR1);//MDL释放掉
//VM-EXIT里的处理很简单,根据参数直接写入需要的东西了。
2014-4-18 10:53
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
28
扣肉时代的很多笔记本如T6600是不支持VT技术的
T6670才支持 联想的Y450系列都是T6600+GT240M
很多U不支持VT也是坑啊
2014-4-18 10:55
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
29
是否存在多套CR0要看CPU而定~,这个不好说了~

EIP那个很难解决的说,除非你保证切换队列里的线程都不访问你inline的地方~这太难了~
2014-4-18 10:56
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
30
无VT就是另一种情况了~
2014-4-18 10:57
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
31
看看这坨代码是Hook的时候 内核稳定性多少用户量级的
KeRaiseIrql(HIGH_LEVEL, &OldIrql);
CliAndDisableWP();
InterlockedExchange();//或者RtlCopyMemory
EnableWPAndSti();
KeLowerIrql(OldIrql); 
2014-4-18 11:17
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
32
我用过这样的代码,结果就是一天100份以内的蓝屏的状态,我主要是inlinehook~~

用户数量级没超过300W(某韩国游戏在线用户)~~
2014-4-18 11:27
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
33
得A一下 看看某淫搞KiFastCallEnry  号称的10亿级别用户稳定性怎么写的啊 坑还是比较多啊
2014-4-18 11:29
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
34
蓝的时候报什么错误
2014-4-18 11:35
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
35
irql_not_less_or_equal 超经典~
关键蓝的不是我的代码,上线文一点关系都没有,全是什么disk和ntfs什么的~

我改成KeRaiseIrqlToDpcLevel 后,就少了很多,后来hold其他u核心后就没见过这个蓝屏报告了~

再后来遇到了access violation,不过因为dmp不多低于每天50份,所以就没再改了。
反正比np的蓝屏少了很多了~np是每日超过1000份的~
2014-4-18 12:29
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
36
Kifastcallentry和ssdt hook的稳定性都很高,关键是KiMoveApcState这样牛B的地方,inlinehook一下基本上没有不蓝的一脸(每日1000份以上dmp)
2014-4-18 12:34
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
37
    ......好吧  技巧2 先suspend起来 有什么再继续空当接龙  技巧3 技巧4  继续补充占坑
2014-4-18 12:55
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
38
suspend全系统?
2014-4-18 13:01
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
擦,太高深了,只能来顶贴!
2014-4-18 13:51
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
40
。。。Dpc之上的都是硬件中断了吧??阻塞cpu这块插Dpc这块的已经是极限了吧。。已经无解了把。。再想更稳定。。应该是想Hook的跳转方法和Hook点了吧。。
2014-4-18 14:03
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
41
多核心上DPC 对应的Dispatch_level可不够  单核心上OK
2014-4-18 14:44
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
42
KeIpiGenericCall
2014-4-18 15:52
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
43
嗯。必然是在一个核心。。做Hook,用DPC_LEVEL的空闲循环线程阻塞其他核心。
2014-4-18 16:18
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
利用vt来拦截api调用是不是就可以绕过pg了
360那个是咋实现的……似乎他没关掉pg
2014-4-18 16:58
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
45
XP上没有啊~~~
IPI-LEVEL也是要先提升到HIGH后再hold才行~
跟用DPC插入差不多,唯一区别是DPC有的核心会有插入失败的,ipi必然成功~
2014-4-18 21:36
0
雪    币: 284
活跃值: (3394)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
46
仔细看了看,问题简化为如下:

多核cpu
一段代码(或者SSDT中一个指针) x----x

当x----x小于等于8个字节的时候,可以用Interlocked系函数保证原子替换掉 x----x,这里貌似无需dpc,vm什么的,
但是,如果修改 x----x 前,某一核上等待的线程正好执行到 x----x 中间,它再度被唤醒的时候发现面包被换了就会蓝屏。
这个几乎没法避免,如果要分别检查每个核心上的等待线程的eip,是不值当的。
2014-4-19 00:31
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
能不能先用调试寄存器hook玩再在处理函数里inline hook
最好恢复调试寄存器呢?
这样只影响1个字节
2014-4-19 00:34
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
48
实际上就是这么回事多核同步的时候 DPC 对应的dispatch_level 无法hold住其他CPU
lock指令显然对多核和多CPU都OK  但是一次只有8个字节  
自旋锁又是一个核上的那个线程的一厢情愿
由于其他CPU都是可调度的 即使是lock 指令将你修改的那个内存地址不允许别人来窜门了 inline的时候  但是别的CPU 的EIP可能 指向或者说执行到你刚写完E9

1. inline hook 一般是 5 个字节, 总之一般不超过 8 个字节, 我们可以找一条能够一次操作 64bit 的指令. 问题是, 真的存在这样的指令吗? (lock xxx, movq xxx, mmx) 不知道 cpu 执行它的时候, 是一次完成的呢, 还是用了一段微程序分步完成. (我们的 cpu 是 32bit 的~) 即使存在这样的指令, 也不安全. 假设被 hook 的指令是这样的:
mov edi, edi
push ebp
mov ebp, esp
这是一个典型的函数开头. 我们假设 cpu0 执行到 push ebp 这一条指令 (eip = $+0x2). 这个时候 cpu1 执行传说中的 move_qword 指令:
movq [$+0x0], mm0
其中 mm0 中包含这样的指令: jmp 12345678, 其机器码是 E9 AABBCCDD.
问题出现了. 当 cpu1 执行完这一条指令的时候, cpu0 的 eip 指向如下字节流: BB CC DD XX XX XX. 结果显然是系统崩溃.
这两个帖子归在一块好了
http://bbs.pediy.com/showthread.php?t=78099
2014-4-19 02:48
0
雪    币: 284
活跃值: (3394)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
49
LZ为什么认为:DPC 无法hold住其他CPU?

应该可以的,请看这段hook流程:

“ HOOK KiFastCallEntry的时候,多核的话向每个CPU投递DPC,参数是一个SpinLock,在DeferredRoutine里增加一个计数,然后就参与到争夺该SpinLock的行动中。

该SpinLock在HOOK KiFastCallEntry的线程里已经被KfAcquireSpinLock了,也就是说除了执行这个线程的核心,其他核心是得不到SpinLock的。执行HOOK的线程等上面那个计数达到(总核心数-1)的时候,也就是说其他核心都被挂到树上时,它就HOOK,然后扔掉SpinLock。其他核心得到该SpinLock,一看是个烂苹果也就扔掉了,DeferredRoutine就执行结束了。”
2014-4-19 14:02
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
50
理解可能有点偏颇 我说的是RaiseIrql 到dispatch_ level 甚至是 high_level  不是说每个核都给投递一个DPC  
我的意思是IRQL的概念 解决不了多核心上的同步  IRQL只与当前核相关 一厢情愿的提高IRQL  对其他核是没用的
2014-4-19 14:13
0
游客
登录 | 注册 方可回帖
返回
//