火绒安全软件

标题: 关于PotPlayer与火绒同时安装PotPlayer无法启动的说明 [打印本页]

作者: vardyh    时间: 2013-10-16 00:29
标题: 关于PotPlayer与火绒同时安装PotPlayer无法启动的说明
近期很多用户反映,PotPlayer新版本与火绒同时安装时,PotPlayer无法启动。之前火绒反馈平台上我也给粗略回复了大致原因,昨天卡饭和火绒论坛又有不少朋友问起,所以特开贴说明:PotPlayer与火绒同时安装PotPlayer无法启动是PotPlayer自身BUG所致,与火绒无关。

具体说明下~~本文分析的版本见下图:

QQ20131016-6.png


新版本PotPlayer会挂钩自身的多个API,其中包括kernel32!DeviceIoControl等,而PotPlayer挂钩的流程上存在严重缺陷,导致在火绒的拦截上下文中,当火绒代码调用被PotPlayer挂钩的API是产生环绕最终栈溢出导致PotPlayer崩溃。下面以kernel32!DeviceIoControl钩子为例进行说明:

下图是PotPlayer为了实现DVD区码欺骗挂钩了kernel32!DeviceIoControl,具体实现见下图:

QQ20131015-2.png


这段代码中的 DeviceIoControl_0 在程序初始化时被设置成 DeviceIoControl 函数的入口地址,如图所示:

QQ20131016-5.png


然而,PotPlayer在挂钩时会首先修改被挂钩API(kernel32!DeviceIoControl)的入口代码(相当于完成了挂钩),之后才会把 DeviceIoControl_0 处所填地址修正为trampoline代码(从被挂钩API入口复制出的原始入口代码,inline hook需要原始入口代码才能完成对原始API的调用)。实现代码见下图:

QQ20131015-4.png


这样的顺序显然是错误的,考虑如下场景:

1. PotPlayer挂钩线程把入口代码修改为 jmp DeviceIoControl_hook;
2. 火绒拦截上下文调用 DeviceIoControl,由于DeviceIoControl入口代码已经被挂钩,所以会调用到DeviceIoControl_hook;
3. 由于 DeviceIoControl_0 位置所存地址还没有被修正,仍然指向原始 DeviceIoControl 函数入口,所以又会 call 进DeviceIoControl_hook,导致死循环;

显然,PotPlayer钩子设计者缺乏经验导致实现流程错误,才导致了崩溃的产生,任何有用户层拦截的安全软件均有可能触发PotPlayer的BUG!



作者: vardyh    时间: 2013-10-16 00:35
另外我想说明的一点是,火绒可以在后续版本中通过减少对DeviceIoControl(PotPlayer所有挂钩的API均存在这个BUG,只是目前火绒的拦截流程对DeviceIoControl的调用较频繁)尽量减少触发PotPlayer这个BUG的可能性,但解决问题的根本还是PotPlayer一方解决他们代码的BUG。
作者: wifexiao2009    时间: 2013-10-16 00:48
官人辛苦,继续优化。
作者: 潘中医    时间: 2013-10-16 00:50
周周大半夜还不睡觉啊
作者: samsul    时间: 2013-10-16 00:56
只能说声 辛苦
作者: 神马都是浮云    时间: 2013-10-16 01:21
幸苦额~大半夜的 还没休息!
作者: vtwo    时间: 2013-10-16 01:29
神马都是浮云 发表于 2013-10-16 01:21
幸苦额~大半夜的 还没休息!

哈哈,大家内测提了很多建议与BUG。。我们必须对加快速度处理啊。
作者: gly    时间: 2013-10-16 01:42
vtwo 发表于 2013-10-16 01:29
哈哈,大家内测提了很多建议与BUG。。我们必须对加快速度处理啊。

明天早起弄啊,比熬夜要好吧。
作者: xzhlksh    时间: 2013-10-16 01:42
大半夜发帖辛苦,我会尽快反馈给potplayer的中国交流论坛
作者: vtwo    时间: 2013-10-16 01:46
gly 发表于 2013-10-16 01:42
明天早起弄啊,比熬夜要好吧。

嗯~~周老师回去休息了。

我一会也睡了
作者: vtwo    时间: 2013-10-16 01:50
xzhlksh 发表于 2013-10-16 01:42
大半夜发帖辛苦,我会尽快反馈给potplayer的中国交流论坛

嗯,感谢~~
作者: windsnowinsky    时间: 2013-10-16 07:31
大神辛苦了
作者: available    时间: 2013-10-16 08:30
ahahlive@hanmail.net

用英文发到这个邮箱即可,记得千万不要写的深奥,一定要图文并茂,浅显易懂的方式,因为看邮件回邮件的不是姜龙喜本人,是个管理员而已,而且他的英文非常的差,所以你们一定要记得图文并茂,浅显易懂,让对方这个小毛孩能一下子就看懂你在说什么,切记。


作者: Hay    时间: 2013-10-16 10:01
顶周神的帖子,辛苦
作者: zdl    时间: 2013-10-16 11:21
本帖最后由 zdl 于 2013-10-16 11:24 编辑

转个帖子:http://bbs.kafan.cn/thread-1640810-1-1.html
原帖正文:

PotPlayer流程如下:
1.修改API代码为jmp
2.填充回跳代码
3.完成hook

火绒流程如下:
1.检测到API调用
2.通知驱动(这步其实没理解为啥)
3.调用到了回跳代码
4.因为回跳代码在当时还没有正确填充
5.死循环(或跳到未知地址)
6.栈溢出or失效指针引用


火绒的问题
1.调用API前没有进行恢复操作(可以看出都没有判断,一般3环的都不应该去信任,尤其是关键API)
2.在对方进程上下文中调用驱动。可能存在验证问题(个人不知道他在驱动怎么验证的。。)

火绒的问题我的看法
1.一般不是dll通知某常驻进程。然后进程通知驱动么?
2.亲你随便在别人进程上下文与驱动交互。不怕出现驱动被利用的问题么?

利用举例:
1.从dll中提取协议
2.hook DeviceIoControl
3.修改为自己构造好的参数
4.内核代码执行

pot的问题
如果在内核的话。从流程上看。应该先填充代码再HOOK(期间进行防中断等操作)
pot的理由
在自己进程。自己没有进行调用。某种意义上说是安全操作。(个人觉得不符合一般流程)
作者: 清茗微漾    时间: 2013-10-16 11:23
:Q我重装系统了,以为系统的原因。
作者: vardyh    时间: 2013-10-16 11:26
zdl 发表于 2013-10-16 11:21
转个帖子:http://bbs.kafan.cn/thread-1640810-1-1.html
原帖正文:

卡饭我给回帖了,不回复了,没意思~~问题说明清楚就行了。
作者: jone_jys    时间: 2013-10-16 11:47
:):loveliness:




欢迎光临 火绒安全软件 (https://bbs.huorong.cn/) Powered by Discuz! X3.4