能力值:
( LV2,RANK:10 )
|
-
-
51 楼
DPC里面cli就行了,hook以后再sti.
|
能力值:
( 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。
|
能力值:
( 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 处。
那么,这样的几条指令,你不能将其复制到别的地址执行,那样将引起最后跳转的地址的改变。
|
能力值:
( LV4,RANK:50 )
|
-
-
54 楼
SwapContext的handler仅是提供一个修正的机会,你说的例子需要handler内嵌一个小型binary
translator, 对所有受影响的分支指令分析,这个call,还有jmp都应该被识别并修正,这个对user mode hook也是适用的。
|
能力值:
( LV2,RANK:10 )
|
-
-
55 楼
hook swapcontext是可以解决那个代码问题的。实际操作起来有点囧,其实这个还是靠具体hook时的技巧了。
|
能力值:
( LV2,RANK:10 )
|
-
-
56 楼
可以看看新版的,稳定性,性能和构架都又回到领先地位。
|
能力值:
( LV3,RANK:20 )
|
-
-
57 楼
话说。看了一下有个小疑问?当线程的IRQL到达Dispatch_Level的时候。。一个没有设置亲和性的线程.在运行过程中会再被切换到到不同的cpu上运行么??如果没达到IRQL呢?会切换么?
在举例说一下我问的切换。
例如:
某线程的执行流程:
KfRaiseIrql(DISPATCH_LEVEL);
..
FuncA();
FUncB();
...
KfLoerIrql(PASSICE_LEVEL);
运行过程中一定都是在同一个cpu核心上运行的么??
|
能力值:
( LV2,RANK:10 )
|
-
-
58 楼
DISPATCH LEVEL就不会做线程切换了。这是由于负责线程切换,抢占的代码就是运行在 IRQL DISPATCH_LEVEL,而 IRQL 小于等于当前 IRQL 的中断不能发生。
所以当,irql 为 DISPATCH_LEVEL,根本就不会发生线程切换,线程抢占之类的事情。
|
能力值:
(RANK:50 )
|
-
-
59 楼
对于有线程的EIP正好指向hook位置中间处理方法的一点思路:
http://bbs.pediy.com/showthread.php?p=1282449#post1282449
|
能力值:
( LV2,RANK:10 )
|
-
-
60 楼
那万一其中一个U执行到你要hook的地址的第一条指令就被硬切换了,此时hook也得出事吧,为了避免这种情况,hold其他u的时候还得判断下eip是不是执行到要hook的地址了,是的话还得放行一下再hold
|
能力值:
( LV3,RANK:20 )
|
-
-
61 楼
原来如此。。thanks。。
|
能力值:
( LV6,RANK:80 )
|
-
-
62 楼
内敛hook。一个E8xxxxxxxx 5个字节就解决了。64位超过80000000h的call还有FF15xxxxxxxx 只要6字节。所以还是用lock锁住总线吧。
|
|
|