能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我感觉有必要屏蔽中断下!
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
所谓同步,要人家跟你一起抢一个东西。。。那才叫同步
人家干自己的事情,都不和你玩,你同步个毛线啊
不是不需要同步,是无法同步
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
貌似人家说的貌似是读写同步,不是执行同步
我选第二个,写SSDT时,不需要同步.
|
能力值:
( LV8,RANK:130 )
|
-
-
5 楼
是可以同步的,因为inline hook时,必须同步
同步方法为:主要是对各个cpu进行同步,并提高lrql,
1.提高irql,避免线程切换
2.给每个CPU(除当前代码cpu)插入dpc,dpc就是一个循环,占用cpu时间,不让执行其它代码
3.在cpu占用期间,执行hook代码。
|
能力值:
( LV8,RANK:120 )
|
-
-
6 楼
现在的人语文都没学好还是咋的,自己问人家SSDT,人家 说SSDT不需要同步,你现在就在说inline hook要同步,不知道inline hook和ssdt hook是不一样的吗?
另外,我觉得平时说 的ssdt hook应该叫sdt hook, win32k那套函数才叫ssdt hook.但现在大家都叫混了。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
win32k那些系统服务叫ShadowSSDT,所以还是叫ShadowSSDT Hook好,而且大家都是这么叫的吧!
sdt服务描述符表,ssdt 系统服务描述符表,加上系统表达得很清晰,毕竟是系统的服务。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
首先同步保护机制依赖IRQL,所以为了没有被其他线程打断,有必要提高IRQL,在这里可以采取屏蔽中断,也就是平时你经常看到的cli指令!
|
能力值:
( LV8,RANK:120 )
|
-
-
9 楼
好吧,叫法就没必要纠结。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
CPU通过不停的切换线程实现抢占式多线程,理论上说,同一个时刻只有1个线程在执行,因为切换的快感觉同时在执行。
SSDT HOOH "时",是否需要同步?
如果多个线程同时hook一个函数,需要同步(闲的?同时写数据),否则,不需要同步。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
楼上说的是单核情况,现在基本都是多核处理器了!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
不是纠结,是纠正你的错误!因为你说大家都叫混了,大家没有叫混,是你混了。
|
能力值:
( LV8,RANK:120 )
|
-
-
13 楼
嗯,搞混了....
|
能力值:
( LV12,RANK:400 )
|
-
-
14 楼
ssdt hook, 8字节以内的inline hook 都没有必要提升irql, 没必要断中断, InterlockedExchange + ExInterlockedCompareExchange64 就足够了
因为都是原子操作, 不会存在多线程竞争的问题
|
能力值:
( LV3,RANK:30 )
|
-
-
15 楼
先搞清楚什么叫同步好不?
所谓同步,仅仅存在于多任务系统……然后,姑且看做所有线程是同时执行的……再然后,当多个线程访问同一资源时,其中一个线程占有了这个资源,其他线程就只能等待他释放掉资源时,才可以访问,实现这个效果的手段就叫同步……你有办法让一个不受你控制的线程在完整访问某段内存前(独占然后释放),不被你你的线程打断?你怎么知道这时人家用完了那段内存,你可以随便改了?举例来说,某段10字节内存必须要作为一个整体访问的(就假设某数据类型有10字节长吧),线程1刚读了4个字节出来,然后你来个提升中断级,把人家中断了,然后这10个字节被你改了……然后中断级恢复,然后线程1继续运行……这时线程1读出来的10个字节,实际是旧的前4个字节和被你改过的后六个字节的组合……程序能不挂?
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
真正的同步的意义是,在我完整读写或执行一段代码或内存前,其他任何线程不可以对这段数据做任何意外的操作,这才叫同步……要实现这点,就必须是需要资源同步的线程间抢同一个资源,谁先抢到谁用,其他人必须等下一次机会去抢……提升个中断级禁止其他线程运行,就叫同步了?
|
能力值:
( LV3,RANK:30 )
|
-
-
17 楼
你这么做仅仅实现了你进行资源访问期间,没人和你抢……但是,你不能保证你在抢到手之前,被抢的那个人做完了他要做的事,人家可能做了一半,然后资源被你抢走了……等他再次拿到资源时,已经不是原来的资源了,但他自己是不知道的,继续按照旧有的逻辑处理资源,能不出问题?
同步就是必须满足两个条件:一是我抢别人的时候,人家已经做完了要做的事,那一瞬间已经不需要那个资源了。二是,我抢到手后,在我释放前,别人不可以用这段资源
|
能力值:
( LV5,RANK:75 )
|
-
-
18 楼
特意查了一下资料,关注到两个指令,lock cmpxchg8b,自己的理解和LZ交流一下
lock指令能保证单指令的原子操作(即使是多核),cmpxchg8b可以替换64位,但要保证内存对齐。
所以在管家hook的帖子里的3个nop的作用就明了了,是用来对齐内存的,当然有人指出来了,但当时没明白。
那么结论是,sti和投DPC都是多此一举?
|
能力值:
( LV8,RANK:120 )
|
-
-
19 楼
好像不是这样吧。这里的核心不是对齐,最核心的应该是位置。
|
能力值:
( LV3,RANK:30 )
|
-
-
20 楼
互锁操作是可以做到同步的效果,但是,第一,互锁操作能保护的资源长度是有限的(4或者8字节),对于不是这两种长度的资源,没法保。第二,互锁操作是硬件实现的,与具体硬件相关(支持这条指令的cpu专门有个引脚是用来锁地址线的),这里讨论同步,不涉及硬件相关内容。
至于关中断,提升中断级这些,也不是完全没用,至少,可以降低出问题的几率……只不过,你不要以为你做了这些,就完事大吉了,对于挂钩来说,不存在绝对不会出问题的做法,就看你运气
|
能力值:
( LV8,RANK:130 )
|
-
-
21 楼
v大,在开培训班,希望大家给支持一下
我正在邀请他来为本帖子作一个总结与扩展,期待中。。。
|
|
|