CEF加载PeperFlash闪现控制台问题

背景

在CEF应用中启用peper flash插件,当第一次访问需要加载flash的页面时会闪现控制台界面(黑框),其原因是render进程在加载peper flash插件时,如果没有启用sandbox, peper flash插件会执行system("echo NOT SANDBOX"), 由于render进程本身是一个GUI应用,并没有附加控制台,当执行上述语句时,系统会给render进程附加一个控制台(console),并输出NOT SANDBOX,执行完后关闭,所以会看到黑框闪现的情况。CEF论坛中已经有人提出了解决方案,这里做一个记录。

方法一

使用二进制查看工具打开peper flash插件,可以找到echo NO SANDBOX文本,再用binary-file工具.writeString函数将其区间设置为空格,修改完后调用.close()保存。
该方法可以解决问题,但不可取。因为peper flash的二进制已经被修改了,官方发布的版本是经过了数字签名的,更改二进制后可能会被安全软件拦截。

方法二

system("echo NOT SANDBOX")的内部实现会调用CreateProcess创建一个控制台进程,其中echo NOT SANDBOXED作为命令行参数传入,可以使用HOOK技术,拦截CreateProcessA和CreateProcessW(注意并不存在CreateProcess API),在HOOK函数中处理当命令行参数为echo NOT SANDBOXED时,不做任何处理,直接返回,已经有网友给出了具体代码,请参考这里。

方法三

最后一种方法参考了这里, 该方法使用了一些技巧,也是最简单的一种方法。正常情况下当启动一个控制台进程时,是执行的环境变量ComSpec中指定控制台程序,默认是C:\Windows\system32\cmd.exe,如:

如果我们在render进程中使用SetEnvironmentVariable修改进程的ComSpec环境变量, 将其路径设置为一个的控制台进程(如新建一个文本文件,命名为cmd.exe),当附加控制台进程时就会失败,自然不会出现黑框闪现的情况了。

更多参考

  1. http://magpcss.org/ceforum/viewtopic.php?f=6&t=13094&sid=9481fc01ad6e57c1ecb2d80524972a3c
  2. https://bugs.chromium.org/p/chromium/issues/detail?id=508002
  3. https://blog.csdn.net/zhuhongshu/article/details/77482985
  4. http://easyhook.github.io/tutorials/nativehook.html

你可能感兴趣的:(CEF加载PeperFlash闪现控制台问题)