[分享] 【官方声明】关于PotPlayer与火绒同时安装PotPlayer无法启动的说明
本帖最后由 潘中医 于 2013-10-16 09:42 编辑原帖地址:
http://bbs.huorong.cn/thread-198-1-1.html 作者:周军内容如下:近期很多用户反映,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! 那个什么汉化论坛的用户拿上你的节操,不要以为自己用一个小众软件就能刷优越感。笑,懂? 咱卡饭论坛的用户只懂技术 不知道什么叫优越感。非技术性代码口水自觉去 论道区顺便推荐一款纯本地视频播放器:
http://bbs.kafan.cn/thread-1471276-1-1.html 轻合金Light Alloy,如果不是及其专业的视频发烧者,这个纯本地无联网的播放器绝对是你的第一首选。我刚入手试用播放了几个电影和刚出的行尸走肉,色彩还原的饱和度特别漂亮。