首页
社区
课程
招聘
[讨论]对ssdt hook(32)是否需要同步的问题探讨
发表于: 2013-5-3 12:50 8699

[讨论]对ssdt hook(32)是否需要同步的问题探讨

2013-5-3 12:50
8699
现在,很多程序员,跟本不知道线程同步那点事,需要同步的地方,偏不同步。。。
还有程序员,知道同步的事太多了,不需要同步的地方,确弄个同步。

问:ssdt hook需要多线程同步不?

答案1:需要同步,因为多cpu,多线程环境下,访问同一变量,不同步容易出错,网上这么讲的,而且基本上所有代码都同步了,没见不同步的人。

答案2:不需要同步,因为ssdt 表是一定是8字节对齐,而读写ssdt表是以四字节为单位,在32位cpu下,每次对ssdt表项的读写,其实是锁定的,这个跟cpu和内存读写方式有关,写ssdt表项的时候,因为是ssdt表项一定是4字节对齐,且每项大小为4字节,cpu正在读入到一个寄存器里面,有的电脑数据位宽为64位,有的是32位,无论哪种(只要不是16)位,一次写入时,4个字节会全部写入,不存在先写入一部分,被其它线程打断的情况,这意味着,这个ssdt表项写入过程不可能被打断,所以不需要程序员处理同步问题。

你觉得上面的答案哪个对?

请大牛们各抒己见

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 256
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我感觉有必要屏蔽中断下!
2013-5-3 12:59
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
所谓同步,要人家跟你一起抢一个东西。。。那才叫同步

人家干自己的事情,都不和你玩,你同步个毛线啊

不是不需要同步,是无法同步
2013-5-3 13:39
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
貌似人家说的貌似是读写同步,不是执行同步

我选第二个,写SSDT时,不需要同步.
2013-5-3 13:50
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
是可以同步的,因为inline hook时,必须同步
同步方法为:主要是对各个cpu进行同步,并提高lrql,
1.提高irql,避免线程切换
2.给每个CPU(除当前代码cpu)插入dpc,dpc就是一个循环,占用cpu时间,不让执行其它代码
3.在cpu占用期间,执行hook代码。
2013-5-3 15:13
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
现在的人语文都没学好还是咋的,自己问人家SSDT,人家 说SSDT不需要同步,你现在就在说inline hook要同步,不知道inline hook和ssdt hook是不一样的吗?

另外,我觉得平时说 的ssdt hook应该叫sdt hook, win32k那套函数才叫ssdt hook.但现在大家都叫混了。
2013-5-3 15:30
0
雪    币: 256
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
win32k那些系统服务叫ShadowSSDT,所以还是叫ShadowSSDT Hook好,而且大家都是这么叫的吧!
sdt服务描述符表,ssdt 系统服务描述符表,加上系统表达得很清晰,毕竟是系统的服务。
2013-5-3 15:49
0
雪    币: 256
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
首先同步保护机制依赖IRQL,所以为了没有被其他线程打断,有必要提高IRQL,在这里可以采取屏蔽中断,也就是平时你经常看到的cli指令!
2013-5-3 15:56
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
好吧,叫法就没必要纠结。
2013-5-3 16:25
0
雪    币: 1839
活跃值: (4065)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
CPU通过不停的切换线程实现抢占式多线程,理论上说,同一个时刻只有1个线程在执行,因为切换的快感觉同时在执行。
SSDT HOOH "时",是否需要同步?
如果多个线程同时hook一个函数,需要同步(闲的?同时写数据),否则,不需要同步。
2013-5-3 17:07
0
雪    币: 256
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼上说的是单核情况,现在基本都是多核处理器了!
2013-5-3 17:56
0
雪    币: 256
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不是纠结,是纠正你的错误!因为你说大家都叫混了,大家没有叫混,是你混了。
2013-5-3 17:57
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
嗯,搞混了....
2013-5-3 18:14
0
雪    币: 535
活跃值: (245)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
14
ssdt hook, 8字节以内的inline hook 都没有必要提升irql, 没必要断中断, InterlockedExchange + ExInterlockedCompareExchange64 就足够了
因为都是原子操作, 不会存在多线程竞争的问题
2013-5-3 18:35
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
先搞清楚什么叫同步好不?
所谓同步,仅仅存在于多任务系统……然后,姑且看做所有线程是同时执行的……再然后,当多个线程访问同一资源时,其中一个线程占有了这个资源,其他线程就只能等待他释放掉资源时,才可以访问,实现这个效果的手段就叫同步……你有办法让一个不受你控制的线程在完整访问某段内存前(独占然后释放),不被你你的线程打断?你怎么知道这时人家用完了那段内存,你可以随便改了?举例来说,某段10字节内存必须要作为一个整体访问的(就假设某数据类型有10字节长吧),线程1刚读了4个字节出来,然后你来个提升中断级,把人家中断了,然后这10个字节被你改了……然后中断级恢复,然后线程1继续运行……这时线程1读出来的10个字节,实际是旧的前4个字节和被你改过的后六个字节的组合……程序能不挂?
2013-5-3 18:59
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
真正的同步的意义是,在我完整读写或执行一段代码或内存前,其他任何线程不可以对这段数据做任何意外的操作,这才叫同步……要实现这点,就必须是需要资源同步的线程间抢同一个资源,谁先抢到谁用,其他人必须等下一次机会去抢……提升个中断级禁止其他线程运行,就叫同步了?
2013-5-3 19:05
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
你这么做仅仅实现了你进行资源访问期间,没人和你抢……但是,你不能保证你在抢到手之前,被抢的那个人做完了他要做的事,人家可能做了一半,然后资源被你抢走了……等他再次拿到资源时,已经不是原来的资源了,但他自己是不知道的,继续按照旧有的逻辑处理资源,能不出问题?

同步就是必须满足两个条件:一是我抢别人的时候,人家已经做完了要做的事,那一瞬间已经不需要那个资源了。二是,我抢到手后,在我释放前,别人不可以用这段资源
2013-5-3 19:14
0
雪    币: 284
活跃值: (3624)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
18
特意查了一下资料,关注到两个指令,lock cmpxchg8b,自己的理解和LZ交流一下
lock指令能保证单指令的原子操作(即使是多核),cmpxchg8b可以替换64位,但要保证内存对齐。
所以在管家hook的帖子里的3个nop的作用就明了了,是用来对齐内存的,当然有人指出来了,但当时没明白。

那么结论是,sti和投DPC都是多此一举?
2013-5-3 20:05
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
19
好像不是这样吧。这里的核心不是对齐,最核心的应该是位置。
2013-5-3 21:29
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
互锁操作是可以做到同步的效果,但是,第一,互锁操作能保护的资源长度是有限的(4或者8字节),对于不是这两种长度的资源,没法保。第二,互锁操作是硬件实现的,与具体硬件相关(支持这条指令的cpu专门有个引脚是用来锁地址线的),这里讨论同步,不涉及硬件相关内容。

至于关中断,提升中断级这些,也不是完全没用,至少,可以降低出问题的几率……只不过,你不要以为你做了这些,就完事大吉了,对于挂钩来说,不存在绝对不会出问题的做法,就看你运气
2013-5-3 22:36
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
21
v大,在开培训班,希望大家给支持一下
我正在邀请他来为本帖子作一个总结与扩展,期待中。。。
2013-5-5 15:29
0
游客
登录 | 注册 方可回帖
返回
//