利用BHO实现浏览器劫持

1.简介

BHO 全名: Browser Helper Object 即浏览器辅助对象

它是微软推出的作为浏览器对第3方程序开发的交互接口的标准. 通过这个接口就可以编写代码来拓展浏览器, 获取浏览器行为等.

因此同样给了恶意代码的可乘之机. 恶意代码可以通过注册插件等手段来对浏览器进行劫持.

借助BHO,可以写一个进程内的COM对象,这个对象在每次启动时都加载.

BHO对象依托于浏览器主窗口, BHO对象与浏览器实例生命周期是一致的

此外, BHO是个COM进程内服务, 注册于注册表某一键下. ie和explorer 将查询那个键并加载键下所有对象.

在于: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects

2. 枚举BHO

每个BHO对象会对应一个classid 简称为CLSID ,全局唯一的. 在HKEY_LOCAL_CLASSES_ROOT\CLSID\中包含了本系统所有的各种对象的classid和guid

如果该classid对应某个BHO对象, 将其展开将能得到它的详细信息:包括dll路径. 因此可以编写工具枚举BHO

// BHO.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <wchar.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL, "chs");
    /*
        复习注册表操作:
        打开子健: RegOpenKeyExW  参数传递句柄,返回执行情况
        枚举子健: RegEnumKeyExW  以某索引进行一一枚举,返回执行情况
        获取子健里的值的信息:RegQueryValueExW,一次调用获取信息大小,二次调用获取信息
    */
    HKEY hBHOMainKey = HKEY_LOCAL_MACHINE;
    HKEY hClsidMainKey = HKEY_CLASSES_ROOT;
    HKEY hBHOs;        //要枚举的键句柄
    HKEY hQueryBHO; //某注册的BHO的子健句柄

    DWORD result, valueType;
    DWORD keyNameSize = 128;
    DWORD keyInfoSize = 0;

    WCHAR keyName[128];
    WCHAR queryKeyName[256];
    BYTE *valueInfo;

    int i = 0;
    //打开存放BHO对象的子健
    result = RegOpenKeyExW(hBHOMainKey, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects", 0, KEY_ENUMERATE_SUB_KEYS, &hBHOs);

    if (result!=ERROR_SUCCESS)
    {
        wprintf(L"RegOpenKeyExW error code is %d\n", GetLastError());
        return result;
    }
    while (1)
    {
        //一一枚举其中子健名
        memset((PVOID)keyName, 0, 128 * sizeof(WCHAR));
        keyNameSize = 128;
        result = RegEnumKeyExW(hBHOs, i, keyName, &keyNameSize, 0, 0, 0, 0);
        if (result==ERROR_NO_MORE_ITEMS)
        {
            break;
        }
        wprintf(L"classid : %s\n", keyName);
        //构建查询子健名
        wsprintf(queryKeyName, L"CLSID\\%s\\InprocServer32", keyName);
        //打开该子健
        result = RegOpenKeyExW(hClsidMainKey, queryKeyName, 0, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &hQueryBHO);
        if (result != ERROR_SUCCESS)
        {
            i++;
            continue;
        }
        //一次调用获取数据大小
        result = RegQueryInfoKeyW(hQueryBHO, 0, 0, 0, 0, 0, 0, 0, 0, &keyInfoSize, 0, 0);
        if (result != ERROR_SUCCESS)
        {
            i++;
            RegCloseKey(hQueryBHO);
            continue;
        }
        valueInfo = (BYTE*)malloc(sizeof(BYTE)*keyInfoSize);
        //二次调用获取数据, 这里获取默认数据
        result = RegQueryValueExW(hQueryBHO, 0, 0, &valueType, valueInfo, &keyInfoSize);
        if (result != ERROR_SUCCESS)
        {
            free(valueInfo);
            i++;
            RegCloseKey(hQueryBHO);
            continue;
        }
        wprintf(L"数据: %s \n\n", valueInfo);
        free(valueInfo);
        RegCloseKey(hQueryBHO);
        i++;
    }
    RegCloseKey(hBHOs);
    return 0;
}

3.安装BHO

根据以上的介绍, 病毒要利用BHO需要生成一个dll文件,并在注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects下注册一个子健

然后在HKEY_CLASSES_ROOT\CLSID下注册一个CLSID子健并再建立一个名为InprocServer32的子健,设置默认值为dll的完整路径

DWORD installBHO(WCHAR* dllpath)
{
    DWORD result = 0;
    DWORD open = 0;
    GUID bhoUid;
    WCHAR sUid[50] = { 0 };
    WCHAR subPath[200] = { 0 };
    if (UuidCreate(&bhoUid)!=RPC_S_OK)
    {
        return result;
    }
    HKEY hBHOMainKey = HKEY_LOCAL_MACHINE;
    HKEY hClsidMainKey = HKEY_CLASSES_ROOT; //{7D886477 - D696 - 4de5 - 8CBB - 9975BDDCD33A}
    HKEY hBHOSubKey, hClsidSubKey;

    wsprintf(sUid, L"{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}",
        bhoUid.Data1, bhoUid.Data2, bhoUid.Data3, bhoUid.Data4[0], bhoUid.Data4[1], bhoUid.Data4[2],
        bhoUid.Data4[3], bhoUid.Data4[4], bhoUid.Data4[5], bhoUid.Data4[6], bhoUid.Data4[7]);
    wsprintf(subPath, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects\\%s", sUid);
    result = RegCreateKeyExW(hBHOMainKey, subPath, 0, 0, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, 0, &hBHOSubKey, &open);
    memset((LPVOID)subPath, 0, sizeof(WCHAR) * 200);
    if (result!=ERROR_SUCCESS)
    {
        wprintf(L"RegCreateKeyExW  hBHOMainKey error code is %d\n", GetLastError());
        return result;
    }
    RegCloseKey(hBHOSubKey);
    wsprintf(subPath, L"CLSID\\%s\\InprocServer32", sUid);
    result = RegCreateKeyExW(hClsidMainKey, subPath, 0, 0, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, 0, &hClsidSubKey, &open);
    if (result != ERROR_SUCCESS)
    {
        wprintf(L"RegCreateKeyExW hClsidMainKey error code is %d\n", GetLastError());
        return result;
    }
    result = RegSetValueExW(hClsidSubKey, 0, 0, REG_SZ, (BYTE*)dllpath, lstrlenW(dllpath)*sizeof(WCHAR)+2);
    if (result != ERROR_SUCCESS)
    {
        wprintf(L"RegSetValueExW hClsidSubKey error code is %d\n", GetLastError());
        return result;
    }
}

4.卸载BHO

根据传递的guid值来删除bho对象及其涉及的键, 值, 和对应的dll文件

时间: 2024-10-10 05:10:26

利用BHO实现浏览器劫持的相关文章

利用窗口引用漏洞和XSS漏洞实现浏览器劫持

==Ph4nt0m Security Team==                        Issue 0x03, Phile #0x05 of 0x07 |=---------------------------------------------------------------------------=||=---------------=[ 利用窗口引用漏洞和XSS漏洞实现浏览器劫持 ]=---------------=||=---------------------------

漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…

?? 随着互联网应用的快速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全,原因是程序员缺少仔细的安全检查导致的.作为程序员,此时我们应该更加关注程序的安全性才对,但现实情况是程序员关注的依然是程序功能的实现,仍然忽视了程序的安全性,以至于很多程序都存在安全漏洞.下面是传智播客C/C++学院仅仅学习了5个月C/C++语言的学生发现的部分软件漏洞:(更多软件漏洞将会持续发布...) 1.飞秋远程溢出漏

LSP“浏览器劫持概念

关于Winsock LSP“浏览器劫持”,中招者一直高居不下,由于其特殊性,直接删除而不恢复LSP的正常状态很可能会导致无法上网所以对其修复需慎重.   先说说什么是Winsock LSP“浏览器劫持”.Winsock LSP全称Windows Socket Layered Service Provider(分层服务提供商),它是Windows底层网络Socker通信需要经过的大门.一些流氓软件可以把自已加进去,就可以截取.访问.修改网络的数据包,可以随意添加广告,还能获取你的浏览习惯.这里加进

利用jQuery判断浏览器的版本和类型

利用jQuery判断浏览器的版本:现在各种版本的浏览器满天飞,不能说是一种坏事,因为版本多了就会出现竞争,能够提高产品的质量,给用户带来了好处,但是也给程序员带来了无穷的烦恼.由于不同版本的浏览器可能会对同样的代码有不同的解读,所以要根据不同的浏览器写不同的代码,所以就要对浏览器的版本和类型进行判断.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta

android 下 利用webview实现浏览器功能

android 下 利用webview实现浏览器功能: 1.界面添加WEBVIEW控件. 2.在界面.JAVA代码页面(protected void onCreate(Bundle savedInstanceState) 方法中)添加如下代码: //#region WebView wb=(WebView)findViewById(R.id.Wb_Main); //设置WebView属性,能够执行Javascript脚本 wb.getSettings().setJavaScriptEnabled(

android利用WebView实现浏览器的封装

android提供了封装浏览器的接口,可以让开发者利用自己的view显示网页内容.今天又实现研究了一下,利用WebView显示浏览器内容,还可以利用 WebViewClient显示自己需要的内容. 参考:http://developer.android.com/reference/android/webkit/WebView.html 效果如下: 上面两张图分别是首页的截图,当点击java时的截图.可以看到在浏览器上面已经没有地址栏了.这个是利用WebViewClient显示的内容.相关代码如下

【Android】检测是否处于Wifi环境,利用WebView实现浏览器app

由于安卓自带的WebView封装了很多方法,因此浏览器app实现起来算是比较简单的. 唯一的难处就是需要自己在补充加载进度条与一些按钮,同时判断用户输入的是否是网址, 如下图所示, 在打开的时候,如果不是处于Wifi环境给出警告 利用WebView实现了一个简易的浏览器,在用户没有输入网址的时候给出提示,具有前进.后退.刷新.停止.跳转的功能. 在加载网页的时候,有进度条.基本上就是一个简单的浏览器. 制作过程如下: 1.首先在res\values\strings.xml中设置各个组件的字符,a

C# 开发BHO IE浏览器辅助对象注册安装小结

C# 创建BHO浏览器插件,仅适用于IE浏览器(对于性能和效率更优的方式用C++) BHO插件是在IE启动进程的时候附加到IE中的Dll,在部署安装的时候用.NET FrameWork进行注册: 注册方式简单直接的为强签名: 使用regasm进行注册: regasm /codebase BHO路径(部署的dll的绝对路,如:'C:\\System32\\BHO.dll') 在.NET Framework4.0环境下用批处理注册示例: %SystemRoot%\Microsoft.NET\Fram

利用cookie实现浏览器中多个标签页之间的通信

原理: cookie是浏览器端的存储容器,而且它是多页面共享的,利用cookie多页面共享的特性,可以实现多个标签页的通信. 比如: 一个标签页发送消息(将发送的消息设置到cookie中),一个标签页接收消息(从cookie中获取消息) 例子:   01 发送消息的标签页(其实就是将要发送的消息设置到cookie中) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-