第一部分: C++开发BHO之HelloWorld

开发工具VS2010。

步骤如图:

生成的HelloWorldBHO.h的代码如下:

[cpp] view plain copy
  1. // HelloWorldBHO.h : CHelloWorldBHO 的声明
  2. #pragma once
  3. #include "resource.h"       // 主符号
  4. #include "HelloWorld_i.h"
  5. #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
  6. #error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
  7. #endif
  8. using namespace ATL;
  9. // CHelloWorldBHO
  10. class ATL_NO_VTABLE CHelloWorldBHO :
  11. public CComObjectRootEx<CComSingleThreadModel>,
  12. public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
  13. public IObjectWithSiteImpl<CHelloWorldBHO>,
  14. public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
  15. {
  16. public:
  17. CHelloWorldBHO()
  18. {
  19. }
  20. DECLARE_REGISTRY_RESOURCEID(IDR_HELLOWORLDBHO)
  21. DECLARE_NOT_AGGREGATABLE(CHelloWorldBHO)
  22. BEGIN_COM_MAP(CHelloWorldBHO)
  23. COM_INTERFACE_ENTRY(IHelloWorldBHO)
  24. COM_INTERFACE_ENTRY(IDispatch)
  25. COM_INTERFACE_ENTRY(IObjectWithSite)
  26. END_COM_MAP()
  27. DECLARE_PROTECT_FINAL_CONSTRUCT()
  28. HRESULT FinalConstruct()
  29. {
  30. return S_OK;
  31. }
  32. void FinalRelease()
  33. {
  34. }
  35. public:
  36. };
  37. OBJECT_ENTRY_AUTO(__uuidof(HelloWorldBHO), CHelloWorldBHO)

HelloWorldBHO.cpp的代码如下:

[cpp] view plain copy
  1. // HelloWorldBHO.cpp : CHelloWorldBHO 的实现
  2. #include "stdafx.h"
  3. #include "HelloWorldBHO.h"
  4. // CHelloWorldBHO

HelloWorld.cpp的代码如下:

[cpp] view plain copy
  1. // HelloWorld.cpp : DLL 导出的实现。
  2. #include "stdafx.h"
  3. #include "resource.h"
  4. #include "HelloWorld_i.h"
  5. #include "dllmain.h"
  6. // 用于确定 DLL 是否可由 OLE 卸载。
  7. STDAPI DllCanUnloadNow(void)
  8. {
  9. return _AtlModule.DllCanUnloadNow();
  10. }
  11. // 返回一个类工厂以创建所请求类型的对象。
  12. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  13. {
  14. return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
  15. }
  16. // DllRegisterServer - 在系统注册表中添加项。
  17. STDAPI DllRegisterServer(void)
  18. {
  19. // 注册对象、类型库和类型库中的所有接口
  20. HRESULT hr = _AtlModule.DllRegisterServer();
  21. return hr;
  22. }
  23. // DllUnregisterServer - 在系统注册表中移除项。
  24. STDAPI DllUnregisterServer(void)
  25. {
  26. HRESULT hr = _AtlModule.DllUnregisterServer();
  27. return hr;
  28. }
  29. // DllInstall - 按用户和计算机在系统注册表中逐一添加/移除项。
  30. STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine)
  31. {
  32. HRESULT hr = E_FAIL;
  33. static const wchar_t szUserSwitch[] = L"user";
  34. if (pszCmdLine != NULL)
  35. {
  36. if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
  37. {
  38. ATL::AtlSetPerUserRegistration(true);
  39. }
  40. }
  41. if (bInstall)
  42. {
  43. hr = DllRegisterServer();
  44. if (FAILED(hr))
  45. {
  46. DllUnregisterServer();
  47. }
  48. }
  49. else
  50. {
  51. hr = DllUnregisterServer();
  52. }
  53. return hr;
  54. }

dllmain.cpp的代码如下:

[cpp] view plain copy
  1. // dllmain.cpp : DllMain 的实现。
  2. #include "stdafx.h"
  3. #include "resource.h"
  4. #include "HelloWorld_i.h"
  5. #include "dllmain.h"
  6. CHelloWorldModule _AtlModule;
  7. // DLL 入口点
  8. extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  9. {
  10. hInstance;
  11. return _AtlModule.DllMain(dwReason, lpReserved);
  12. }

HelloWorld.rgs的内容如下:

[plain] view plain copy
  1. HKCR
  2. {
  3. }

HelloWorldBHO.rgs的内容如下:

[plain] view plain copy
  1. HKCR
  2. {
  3. NoRemove CLSID
  4. {
  5. ForceRemove {22024CC8-9043-49C7-AC80-A803A2912BF6} = s 'HelloWorldBHO Class'
  6. {
  7. ForceRemove Programmable
  8. InprocServer32 = s '%MODULE%'
  9. {
  10. val ThreadingModel = s 'Apartment'
  11. }
  12. TypeLib = s '{D05D8B0F-8126-4FE2-BC3D-D5A5248E7025}'
  13. Version = s '1.0'
  14. }
  15. }
  16. }

HelloWorld.idl的内容:

[plain] view plain copy
  1. // HelloWorld.idl : HelloWorld 的 IDL 源
  2. //
  3. // 此文件将由 MIDL 工具处理以
  4. // 产生类型库(HelloWorld.tlb)和封送处理代码。
  5. import "oaidl.idl";
  6. import "ocidl.idl";
  7. [
  8. object,
  9. uuid(9C44C518-EEBE-4126-B368-5B901F840255),
  10. dual,
  11. nonextensible,
  12. pointer_default(unique)
  13. ]
  14. interface IHelloWorldBHO : IDispatch{
  15. };
  16. [
  17. uuid(D05D8B0F-8126-4FE2-BC3D-D5A5248E7025),
  18. version(1.0),
  19. ]
  20. library HelloWorldLib
  21. {
  22. importlib("stdole2.tlb");
  23. [
  24. uuid(22024CC8-9043-49C7-AC80-A803A2912BF6)
  25. ]
  26. coclass HelloWorldBHO
  27. {
  28. [default] interface IHelloWorldBHO;
  29. };
  30. };

HelloWorld.idl中的CLSID是22024CC8-9043-49C7-AC80-A803A2912BF6

其他的文件,暂时不重要。

修改HelloWorldBHO.h:

1、增加头文件

[cpp] view plain copy
  1. #include <shlguid.h>
  2. #include <exdispid.h>

2、增加一个公有的SetSite方法:

[cpp] view plain copy
  1. public:
  2. STDMETHOD(SetSite)(IUnknown *pUnkSite);

3、增加私有的成员变量:

[cpp] view plain copy
  1. private:
  2. CComPtr<IWebBrowser2>  m_spWebBrowser;
  3. BOOL m_fAdvised;

4、多继承一个类:

[cpp] view plain copy
  1. public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

5、增加公有的方法OnDocumentComplete:

[cpp] view plain copy
  1. BEGIN_SINK_MAP(CHelloWorldBHO)
  2. SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
  3. END_SINK_MAP()
  4. // DWebBrowserEvents2
  5. void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);

修改HelloWorldBHO.cpp,实现那两个方法:

[cpp] view plain copy
  1. STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
  2. {
  3. if (pUnkSite != NULL)
  4. {
  5. // Cache the pointer to IWebBrowser2.
  6. HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
  7. if (SUCCEEDED(hr))
  8. {
  9. // Register to sink events from DWebBrowserEvents2.
  10. hr = DispEventAdvise(m_spWebBrowser);
  11. if (SUCCEEDED(hr))
  12. {
  13. m_fAdvised = TRUE;
  14. }
  15. }
  16. }
  17. else
  18. {
  19. // Unregister event sink.
  20. if (m_fAdvised)
  21. {
  22. DispEventUnadvise(m_spWebBrowser);
  23. m_fAdvised = FALSE;
  24. }
  25. // Release cached pointers and other resources here.
  26. m_spWebBrowser.Release();
  27. }
  28. // Call base class implementation.
  29. return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
  30. }
  31. void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
  32. {
  33. // Retrieve the top-level window from the site.
  34. HWND hwnd;
  35. HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
  36. if (SUCCEEDED(hr))
  37. {
  38. // Output a message box when page is loaded.
  39. MessageBox(hwnd, L"Hello World!", L"BHO", MB_OK);
  40. }
  41. }

dllmain.cpp的DllMain修改成:

[cpp] view plain copy
  1. extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  2. {
  3. if (dwReason == DLL_PROCESS_ATTACH)
  4. {
  5. DisableThreadLibraryCalls(hInstance);
  6. }
  7. return _AtlModule.DllMain(dwReason, lpReserved);
  8. }

修改HelloWorld.rgs:

修改成:

[plain] view plain copy
  1. HKLM {
  2. NoRemove SOFTWARE {
  3. NoRemove Microsoft {
  4. NoRemove Windows {
  5. NoRemove CurrentVersion {
  6. NoRemove Explorer {
  7. NoRemove 'Browser Helper Objects' {
  8. ForceRemove '{D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77}' = s 'HelloWorldBHO' {
  9. val 'NoExplorer' = d '1'
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

其中的{D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77},需要改成HelloWorld.idl中的CLSID,当前文件的CLSID是

{22024CC8-9043-49C7-AC80-A803A2912BF6}

修改完后:

HelloWorldBHO.h:

[cpp] view plain copy
  1. // HelloWorldBHO.h : CHelloWorldBHO 的声明
  2. #pragma once
  3. #include "resource.h"       // 主符号
  4. #include <shlguid.h>
  5. #include <exdispid.h>
  6. #include "HelloWorld_i.h"
  7. #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
  8. #error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
  9. #endif
  10. using namespace ATL;
  11. // CHelloWorldBHO
  12. class ATL_NO_VTABLE CHelloWorldBHO :
  13. public CComObjectRootEx<CComSingleThreadModel>,
  14. public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
  15. public IObjectWithSiteImpl<CHelloWorldBHO>,
  16. public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
  17. public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
  18. {
  19. public:
  20. CHelloWorldBHO()
  21. {
  22. }
  23. DECLARE_REGISTRY_RESOURCEID(IDR_HELLOWORLDBHO)
  24. DECLARE_NOT_AGGREGATABLE(CHelloWorldBHO)
  25. BEGIN_COM_MAP(CHelloWorldBHO)
  26. COM_INTERFACE_ENTRY(IHelloWorldBHO)
  27. COM_INTERFACE_ENTRY(IDispatch)
  28. COM_INTERFACE_ENTRY(IObjectWithSite)
  29. END_COM_MAP()
  30. DECLARE_PROTECT_FINAL_CONSTRUCT()
  31. HRESULT FinalConstruct()
  32. {
  33. return S_OK;
  34. }
  35. void FinalRelease()
  36. {
  37. }
  38. public:
  39. STDMETHOD(SetSite)(IUnknown *pUnkSite);
  40. BEGIN_SINK_MAP(CHelloWorldBHO)
  41. SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
  42. END_SINK_MAP()
  43. // DWebBrowserEvents2
  44. void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);
  45. private:
  46. CComPtr<IWebBrowser2>  m_spWebBrowser;
  47. BOOL m_fAdvised;
  48. };
  49. OBJECT_ENTRY_AUTO(__uuidof(HelloWorldBHO), CHelloWorldBHO)

HelloWorldBHO.cpp:

[cpp] view plain copy
  1. // HelloWorldBHO.cpp : CHelloWorldBHO 的实现
  2. #include "stdafx.h"
  3. #include "HelloWorldBHO.h"
  4. // CHelloWorldBHO
  5. STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
  6. {
  7. if (pUnkSite != NULL)
  8. {
  9. // Cache the pointer to IWebBrowser2.
  10. HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
  11. if (SUCCEEDED(hr))
  12. {
  13. // Register to sink events from DWebBrowserEvents2.
  14. hr = DispEventAdvise(m_spWebBrowser);
  15. if (SUCCEEDED(hr))
  16. {
  17. m_fAdvised = TRUE;
  18. }
  19. }
  20. }
  21. else
  22. {
  23. // Unregister event sink.
  24. if (m_fAdvised)
  25. {
  26. DispEventUnadvise(m_spWebBrowser);
  27. m_fAdvised = FALSE;
  28. }
  29. // Release cached pointers and other resources here.
  30. m_spWebBrowser.Release();
  31. }
  32. // Call base class implementation.
  33. return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
  34. }
  35. void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
  36. {
  37. // Retrieve the top-level window from the site.
  38. HWND hwnd;
  39. HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
  40. if (SUCCEEDED(hr))
  41. {
  42. // Output a message box when page is loaded.
  43. MessageBox(hwnd, L"Hello World!", L"BHO", MB_OK);
  44. }
  45. }

dllmain.cpp:

[cpp] view plain copy
  1. // dllmain.cpp : DllMain 的实现。
  2. #include "stdafx.h"
  3. #include "resource.h"
  4. #include "HelloWorld_i.h"
  5. #include "dllmain.h"
  6. CHelloWorldModule _AtlModule;
  7. // DLL 入口点
  8. extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  9. {
  10. if (dwReason == DLL_PROCESS_ATTACH)
  11. {
  12. DisableThreadLibraryCalls(hInstance);
  13. }
  14. return _AtlModule.DllMain(dwReason, lpReserved);
  15. }

HelloWorld.rgs:

[plain] view plain copy
  1. HKLM {
  2. NoRemove SOFTWARE {
  3. NoRemove Microsoft {
  4. NoRemove Windows {
  5. NoRemove CurrentVersion {
  6. NoRemove Explorer {
  7. NoRemove 'Browser Helper Objects' {
  8. ForceRemove '{22024CC8-9043-49C7-AC80-A803A2912BF6}' = s 'HelloWorldBHO' {
  9. val 'NoExplorer' = d '1'
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

目前要修改的也就那么几个文件,然后关闭安全软件,进行build,生成的dll会自动注册到注册表里去,如图:

before:

after:

然后打开IE,如图:

也可以在IE的管理加载项中看到,工具-管理加载项:

可以启用或者禁用BHO。

这样,就完成了HelloWorld版本的BHO的开发。

但是,这样注册的BHO, 在IE管理加载项里面显示“未验证”,解决这也问题,

请看下一篇博文《BHO劫持数字证书验证与DLL后门通道(二)》

BHO证书劫持及DLL通道(一)相关推荐

  1. C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)

    目录 劫持 detours 实现劫持 步骤: 1. 安装Detours 2. 编译Detours工程 3. 把静态库和头文件引入工程 4. 函数指针与函数的定义 5.拦截 劫持QQ 实现劫持syste ...

  2. vmware证书劫持网页解决方案

    vmware证书劫持网页解决方案 问题起因 最近,经常听说有人在访问网页的时候,发现证书报错访问不了,而证书上显示的却是vmware,似乎是因为vmware的原因,一个不对应的证书劫持了网页,以至于浏 ...

  3. MSXML2.ServerXMLHTTP HTTPS 证书过期 — msxml3.dll '80072f05'

    昨天测试一个几天前写的一个应用,时不时的报错: msxml3.dll  '80072f05' The date in the certificate is invalid or has expired ...

  4. [DLL劫持] 3 DLL劫持之实践 例子

    该系列文章是依据本人平时对动态链接库的学习,归纳总结,所做的学习笔记.如有错误或待改善之处,请留下您宝贵的意见或建议.   先说说DLL劫持的原理吧,以下这段来自百度百科对DLL劫持原理的说明: 由于 ...

  5. 【转】IE劫持原理 BHO

    为什么"浏览器劫持"能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如"我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启 ...

  6. 老树开新花:DLL劫持漏洞新玩法

      DLL劫持漏洞已经是一个老生常谈,毫无新鲜感的话题了.DLL劫持技术也已经是黑客们杀人越货,打家劫舍必备的武器.那么,随着Win10的诞生,微软是否已经修复了此漏洞?同时在当前的安全环境下,DLL ...

  7. 使用AheadLib生成DLL劫持代码

    程序加载DLL会有一个优先级顺序,其中,最先加载的是同一目录下的DLL,DLL劫持的原理是在程序的同目录下放一个自己写的DLL,让程序将我们伪造的DLL加载进去,然后在我们的DLL里调用真正DLL的函 ...

  8. c++ dll继续使用然后强制删除dll文件_Windows 10系统安全风险,近300个系统执行文件容易遭受劫持攻击...

    一个简单的VBScript足以让用户获得管理权限并完全绕过Windows 10上的UAC. 在普华永道英国安全研究人员Wietze Beukema的最新报告中,我们了解到将近300个Windows 1 ...

  9. NTA告警引发的dll劫持思考(溯源)

    目录 溯源 DLL DLL Hijacking Vulnerability(DLL劫持漏洞) DLL劫持攻击 转发式劫持 DLL劫持防御 某天在客户局点巡检时,NTA设备发现了CS的告警:定位了被入侵 ...

最新文章

  1. pix2pix tensorflow试验(GAN之图像转图像的操作)
  2. 【实战】tensorflow 花卉识别
  3. 微信小程序开发工具 清除授权缓存/文件缓存/登录缓存等等
  4. 二叉排序树 -- 增删查改
  5. TeaPot 用webgl画茶壶(3) 环境纹理和skybox
  6. matlab中统计数组中各数字(元素)出现的次数
  7. 荣耀Magic3相机界面公布:提供专业“电影”功能
  8. 英特尔加入 GPU 战局,终用上 6nm 工艺?
  9. 使用jQuery Mobile设计移动设备网站
  10. spring对redis的操作
  11. 蓝牙激光雕刻机android,一种基于蓝牙微型激光雕刻机及其操作方法专利_专利查询 - 天眼查...
  12. java加密 js解密_前后端API交互加密解密(js、Java)
  13. flex布局文字溢出显示省略号失效的解决方法
  14. PCAT 点云标注软件
  15. Aquaculture Equipment 水产养殖设备谷歌Google搜索量和海外市场竞争度分析
  16. FOFA是什么(白帽汇推出的一款网络空间资产搜索引擎)
  17. 【小5聊】纯javascript实现图片放大镜效果
  18. NBA得分后卫阅兵:科比榜首麦蒂第9 小AI获至高赞誉
  19. SpringBoot 整合 Elasticsearch
  20. 当梦想照进现实--Steve Nash

热门文章

  1. Android 广播+服务+AIDL一起实现手机号码拦截
  2. 外贸网站推广怎么做?网站优化步骤有哪些?
  3. 公司计算机系统忘记用户密码怎么办,win10系统重置修改已经忘记的登录密码的解决步骤...
  4. 移植linux-xlnx到Zedboard(一)
  5. 微机原理微型计算机组成,微机原理知识点
  6. 知其所以然--解说Solder Mask和Paste Mask的一些文章集锦
  7. 流计算过程中对于窗口的处理方式
  8. Netfilter数据包流向图
  9. 蓝桥杯国信长天单片机--独立按键和矩阵键盘模块(七)
  10. 喜欢和什么样的人在一起?