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

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

2014-4-17 23:31
20830
收藏
免费 0
支持
分享
最新回复 (61)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
51
DPC里面cli就行了,hook以后再sti.
2014-4-19 15:01
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
52
这个问题其实可以划分为3个问题
a,同步对目标地址的写入
b,修正中断嵌套的代码路径落入目标地址范围
c,修正正常线程的代码路径落入目标地址范围

1, cpu0获得SwapContext()的地址,  PsCreateSystemThread()贴到cpu1~cpuN,
    KeAcquireSpinLock(MasterLock),cli ,反复检测cpu1-cpuN是否全部设置自己的完成位

2,cpu1-cpuN (each thread created in step 1) KeRaiseIrql(DISPATCH_LEVEL),cli
   设置自己的完成位, KeAcquireSpinLock(MasterLock), KeReleaseSpinLock(MasterLock), sti, KeLowerIrql, return

3, cpu0 拦截SwapContext,设置handler
4, cpu0 拦截目标函数,设置handler
5, cpu0 KeReleaseSpinLock(MasterLock), sti

6, SwapContext handler 检查newthread的trapframe保存的ip是否落在目标地址范围,
   如果是,redirect到stub中,stub中保留原来代码的备份,尾部添加跳转

没有实现过,只是一点想法,可能有不周之处。

cpu0-cpuN都要先进入一个“理想"的状态, 每个cpu上无未完成中断,也就不用处理中断产生的trapframe。
2014-4-19 19:06
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
53
6, SwapContext handler 检查newthread的trapframe保存的ip是否落在目标地址范围,
   如果是,redirect到stub中,stub中保留原来代码的备份,尾部添加跳转

关于第6条,似乎不可行,如果代码和当前ip有关,你不能将代码复制到stub中。如果代码和当前ip无关,那样你才可以讲代码复制到stub中。
关于代码和当前ip有关的例子,举例如下:
call 当前ip+5 ;跳转到pop eax处执行,并将pop eax处的 eip压入堆栈
pop eax ;将pop eax处的eip 弹出到 eax寄存器
add eax,某个数值;将 eax表示的eip增加某个数值,使之指向下一条指令。
jmp eax;跳转到eax 处。
那么,这样的几条指令,你不能将其复制到别的地址执行,那样将引起最后跳转的地址的改变。
2014-5-2 08:04
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
54
SwapContext的handler仅是提供一个修正的机会,你说的例子需要handler内嵌一个小型binary
translator, 对所有受影响的分支指令分析,这个call,还有jmp都应该被识别并修正,这个对user mode hook也是适用的。
2014-5-2 13:53
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
hook swapcontext是可以解决那个代码问题的。实际操作起来有点囧,其实这个还是靠具体hook时的技巧了。
2014-5-2 14:24
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
56
可以看看新版的,稳定性,性能和构架都又回到领先地位。
2014-5-2 14:28
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
57
话说。看了一下有个小疑问?当线程的IRQL到达Dispatch_Level的时候。。一个没有设置亲和性的线程.在运行过程中会再被切换到到不同的cpu上运行么??如果没达到IRQL呢?会切换么?
在举例说一下我问的切换。
例如:
某线程的执行流程:
KfRaiseIrql(DISPATCH_LEVEL);
..
FuncA();
FUncB();
...
KfLoerIrql(PASSICE_LEVEL);

运行过程中一定都是在同一个cpu核心上运行的么??
2014-5-8 23:00
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
58
DISPATCH LEVEL就不会做线程切换了。这是由于负责线程切换,抢占的代码就是运行在 IRQL DISPATCH_LEVEL,而 IRQL 小于等于当前 IRQL 的中断不能发生。

所以当,irql 为 DISPATCH_LEVEL,根本就不会发生线程切换,线程抢占之类的事情。
2014-5-8 23:40
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
59
对于有线程的EIP正好指向hook位置中间处理方法的一点思路:
http://bbs.pediy.com/showthread.php?p=1282449#post1282449
2014-5-9 01:17
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
60
那万一其中一个U执行到你要hook的地址的第一条指令就被硬切换了,此时hook也得出事吧,为了避免这种情况,hold其他u的时候还得判断下eip是不是执行到要hook的地址了,是的话还得放行一下再hold
2014-5-9 01:53
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
61
原来如此。。thanks。。
2014-5-9 21:18
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
62
内敛hook。一个E8xxxxxxxx 5个字节就解决了。64位超过80000000h的call还有FF15xxxxxxxx 只要6字节。所以还是用lock锁住总线吧。
2014-7-30 01:05
0
游客
登录 | 注册 方可回帖
返回
//