CEF加载FLASH插件时弹出CMD命令行窗口的问题

原创 2016年08月31日 15:13:24

问题

这个是flash插件的一个bug,CEF(chromium系列浏览器)关闭sandbox第一次加载flash插件就会跳出这样的一个提示,在Google官方也看到了chromium的issue: 

地址

这里写图片描述

解决方案

官方暂时未解决这问题,只能是自己修改代码,通过hook命令行启动函数来实现不让命令行启动,hook库有
微软的牛逼 Detours 但是要票票的,Esayhook 就是个不错的选择,32和64位都支持,开放源码使用简单。
MHOOK据说小而好用但不研究了。

代码

// HookFlash.cpp : 定义 DLL 应用程序的导出函数。
//



#include "stdafx.h"

using namespace std;

HOOK_TRACE_INFO hAHookTrackInfo = { NULL }; // keep track of our hook
HOOK_TRACE_INFO hWHookTrackInfo = { NULL }; // keep track of our hook

//注意调用约定 WINAPI,否则会出现堆栈异常

typedef BOOL(WINAPI *realCreateProcessWPtr)(LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCWSTR lpCurrentDirectory,
    LPSTARTUPINFOW lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
    );


typedef BOOL(WINAPI *realCreateProcessAPtr)(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment,
    LPCSTR lpCurrentDirectory, \
    LPSTARTUPINFOA lpStartupInfo, \
    LPPROCESS_INFORMATION lpProcessInformation);


realCreateProcessAPtr prealCreateProcessA;
realCreateProcessWPtr prealCreateProcessW;


BOOL WINAPI MYCreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCWSTR lpCurrentDirectory,
    LPSTARTUPINFOW lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
)
{
    std::wstring strCommandLine(lpCommandLine);

    //MessageBoxW(GetActiveWindow(), strCommandLine.c_str(), L"createproceW", MB_OK);

    if (string::npos != strCommandLine.find(L"echo NOT SANDBOXED"))
    {
        //MessageBoxW(GetActiveWindow(), strCommandLine.c_str(), L"createproceW", MB_OK);
        return TRUE;
    }
    else
    {
        return (prealCreateProcessW)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
    }

}

BOOL WINAPI MYCreateProcessA(
    LPCSTR lpApplicationName,
    LPSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCSTR lpCurrentDirectory,
    LPSTARTUPINFOA lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
)
{
    std::string strCommandLine = lpCommandLine;

    if (string::npos != strCommandLine.find("echo NOT SANDBOXED"))
    {
        //MessageBoxA(GetActiveWindow(), strCommandLine.c_str(), "createprocesA", MB_OK);
        return TRUE;
    }
    else
    {
        return (prealCreateProcessA)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
    }

}




void DoHook()
{

    HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");

    if (!(prealCreateProcessA = (realCreateProcessAPtr)GetProcAddress(hKernel32, "CreateProcessA")))
    {
        MessageBoxW(GetDesktopWindow(), L"GetProcAddress Err", L"CreateProcessA", MB_OK);
        return;
    }

    if (!(prealCreateProcessW = (realCreateProcessWPtr)GetProcAddress(hKernel32, "CreateProcessW")))
    {
        MessageBoxW(GetDesktopWindow(), L"GetProcAddress Err", L"CreateProcessW", MB_OK);
        return;
    }


    NTSTATUS resultA = LhInstallHook(prealCreateProcessA, MYCreateProcessA, NULL, &hAHookTrackInfo);
    NTSTATUS resultW = LhInstallHook(prealCreateProcessW, MYCreateProcessW, NULL, &hWHookTrackInfo);


    if (FAILED(resultA) || (FAILED(resultW)))
    {
        MessageBox(GetForegroundWindow(), _T("Hook Failed"), _T("Error"), MB_OK);
    }


    ULONG ACLEntriesA[1] = { 0 };
    ULONG ACLEntriesW[1] = { 0 };

    // If the threadId in the ACL is set to “ 0 ”,
    // then internally EasyHook uses GetCurrentThreadId()
    // Disable the hook for the provided threadIds, enable for all others
    LhSetExclusiveACL(ACLEntriesA, 0, &hAHookTrackInfo);
    LhSetExclusiveACL(ACLEntriesW, 0, &hWHookTrackInfo);

}


void UnHook()
{

    // this will also invalidate "hHook", because it is a traced handle...  
    LhUninstallAllHooks();

    // this will do nothing because the hook is already removed...  
    LhUninstallHook(&hAHookTrackInfo);
    LhUninstallHook(&hWHookTrackInfo);

    // even if the hook is removed, we need to wait for memory release  
    LhWaitForPendingRemovals();

}

源码下载

源码github地址

参考文章

http://blog.csdn.net/baggiowangyu/article/details/7675098
http://easyhook.github.io/tutorials/nativehook.html
http://blog.csdn.net/x356982611/article/details/52385394

版权声明:博客地址:blog.csdn.net/x356982611,未经允许不得转载。

#pragma 预处理指令详解

#pragma  预处理指令详解              在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令...

让Sublime Text 2运行程序时弹出命令行窗口

Sublime Text 2功能非常强大,但是使用Sublime Text 2编写和编译,然后运行程序时,运行结果直接显示在Sublime Text 2中,如果需要从命令行输入数据,将无能为力,而且会...
  • jzq526
  • jzq526
  • 2013年12月06日 18:41
  • 2140

C#操作cmd,启动命令行窗口

  • 2013年01月07日 11:06
  • 682B
  • 下载

制作NSIS命令行窗口输出插件

在上一篇中,介绍了如何让NSIS生成的安装包在静默安装时从命令行窗口输出安装信息,但是产生了很多问题,于是我们想换一个实现方法,毕竟静默安装时的输出信息并不需要那么多,多了反而让人眼花。静默安装时,只...
  • meiyuli
  • meiyuli
  • 2011年07月05日 19:18
  • 1074

python在Windows命令行窗口(cmd)实现utf8编码中文输入输出

执行以下函数后即可实现中文输入输出#-*- coding: utf-8 -*- def utf8writer_register(): import sys if sys.plat...

mac系统命令行窗口输入javac命令,输出中文乱码得问题

mac系统命令行窗口输入javac命令,输出中文乱码得问题 查了下,貌似是因为shell窗口使用得编码是utf-8,而javac使用gbk,所以产生乱码,解决方案包括这么一些: 1. 告诉ja...

在DOS命令行窗口中显示出用各种字符拼凑出来的各种图案的实现方法,如本人头像

在DOS命令行窗口中显示出用各种字符拼凑出来的各种图案的实现方法

install sheild 执行 launchappwait cmd的命令,需要加 /c 参数,否则会弹出命令窗口行。

md参数 2007年12月02日 星期日 下午 4:12 启动命令解释程序 Cmd.exe 的新范例。如果在不含参数的情况下使用,cmd 将显示操作系统的版本和版权信息。 ...
  • ftwfff
  • ftwfff
  • 2012年04月23日 11:19
  • 1132

恶意弹出1000个cmd命令窗口

  • 2010年01月06日 22:05
  • 13KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CEF加载FLASH插件时弹出CMD命令行窗口的问题
举报原因:
原因补充:

(最多只允许输入30个字)