火绒安全软件

火绒安全软件
发新帖
打印 上一主题 下一主题

关于PotPlayer与火绒同时安装PotPlayer无法启动的说明

 关闭 [复制链接]
23120 17
楼主
发表于 2013-10-16 00:29:07 | 只看该作者 |倒序浏览 |阅读模式
跳转到指定楼层
近期很多用户反映,PotPlayer新版本与火绒同时安装时,PotPlayer无法启动。之前火绒反馈平台上我也给粗略回复了大致原因,昨天卡饭和火绒论坛又有不少朋友问起,所以特开贴说明:PotPlayer与火绒同时安装PotPlayer无法启动是PotPlayer自身BUG所致,与火绒无关。

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




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

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




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




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




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

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

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


回复

使用道具 举报

23120 17
沙发
发表于 2013-10-16 00:35:49 | 只看该作者
另外我想说明的一点是,火绒可以在后续版本中通过减少对DeviceIoControl(PotPlayer所有挂钩的API均存在这个BUG,只是目前火绒的拦截流程对DeviceIoControl的调用较频繁)尽量减少触发PotPlayer这个BUG的可能性,但解决问题的根本还是PotPlayer一方解决他们代码的BUG。
回复

使用道具 举报

23120 17
板凳
发表于 2013-10-16 00:48:26 | 只看该作者
官人辛苦,继续优化。
回复

使用道具 举报

23120 17
地板
发表于 2013-10-16 00:50:32 | 只看该作者
周周大半夜还不睡觉啊
回复

使用道具 举报

23120 17
5#
发表于 2013-10-16 00:56:48 | 只看该作者
只能说声 辛苦
回复

使用道具 举报

23120 17
6#
发表于 2013-10-16 01:21:03 | 只看该作者
幸苦额~大半夜的 还没休息!
回复

使用道具 举报

23120 17
7#
发表于 2013-10-16 01:29:32 | 只看该作者
神马都是浮云 发表于 2013-10-16 01:21
幸苦额~大半夜的 还没休息!

哈哈,大家内测提了很多建议与BUG。。我们必须对加快速度处理啊。
回复

使用道具 举报

23120 17
8#
发表于 2013-10-16 01:42:10 | 只看该作者
vtwo 发表于 2013-10-16 01:29
哈哈,大家内测提了很多建议与BUG。。我们必须对加快速度处理啊。

明天早起弄啊,比熬夜要好吧。
回复

使用道具 举报

23120 17
9#
发表于 2013-10-16 01:42:14 | 只看该作者
大半夜发帖辛苦,我会尽快反馈给potplayer的中国交流论坛
回复

使用道具 举报

23120 17
10#
发表于 2013-10-16 01:46:53 | 只看该作者
gly 发表于 2013-10-16 01:42
明天早起弄啊,比熬夜要好吧。

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

我一会也睡了
回复

使用道具 举报

23120 17
11#
发表于 2013-10-16 01:50:05 | 只看该作者
xzhlksh 发表于 2013-10-16 01:42
大半夜发帖辛苦,我会尽快反馈给potplayer的中国交流论坛

嗯,感谢~~
回复

使用道具 举报

23120 17
12#
发表于 2013-10-16 07:31:53 | 只看该作者
大神辛苦了
回复

使用道具 举报

23120 17
13#
发表于 2013-10-16 08:30:07 | 只看该作者
ahahlive@hanmail.net

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

回复

使用道具 举报

23120 17
14#
发表于 2013-10-16 10:01:05 | 只看该作者
顶周神的帖子,辛苦
回复

使用道具 举报

23120 17
15#
发表于 2013-10-16 11:21:55 | 只看该作者
本帖最后由 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的理由
在自己进程。自己没有进行调用。某种意义上说是安全操作。(个人觉得不符合一般流程)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

快速回复 返回顶部 返回列表