背景
在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
),当附加假控制台进程时就会失败,自然不会出现黑框闪现的情况了。