首页
社区
课程
招聘
[原创]关于USB管控的方案,某某USB管控逆向分析
发表于: 2022-9-7 19:58 16428

[原创]关于USB管控的方案,某某USB管控逆向分析

2022-9-7 19:58
16428

同志们好哇,好久不见,我再更新一些干货给你们,至于为什么要研究这个?肯定是自己做DLP产品,自己的产品能优化就要偷学一下别人的思路,我自己目前是二种思路,一种是内核层的管控(minifilter,附加过滤设备,KMDF)这种管控,我们想一想尽量能用应用层解决还是通过应用层进行解决,我们今天主要是讲一下应用层进行USB管控的思路。

这还用问吗,之前我也想通过驱动层,直接禁用设备之类的,可惜哇,怪我太菜了,各种驱动写完了,GITHUB上找了一堆代码都不行,妈的生气,看看市面上有什么USB的管控软件,没想到哇,还真就是找到了一个可以用的软件,也没有用什么驱动,直接打开我们的IDA分析一下。

我们如何找到分析的要点,我们首先就先了解一下,WINDOWS 设备相关操作的API,链接我也贴上来了微软链接,我们首先通过SetupDiGetClassDevsW这个函数来寻找一下调用,看看人家软件是怎么操作的,直接抄袭之就可以了,
图片描述
如图所示,就是函数的大概直接流程 获取设备的信息,由于是USB存储设备的管控,我们主要就是获取DISK信息, 然后枚举我们的设备信息,CM_Get_Device_IDW函数来获取USB存储的父对象,在通过CM_Get_DevNode_Status函数来获取USB存储设备的状态,如果状态是被禁用,就不进行下面的处理,
图片描述
最后通过这SetupDiSetClassInstallParamsW,SetupDiCallClassInstaller,来进行设备的禁用,可是我不太理解,它为什么用0X12这个DIF_ALLOWINSTALL,没有进行动态的分析,不太理解它设置了什么状态,因此我采用的是网上通用的禁用或者启动设备,链接在此

剩下来的就是完善代码,管控1394等设备端口的代码了,马上中秋了,祝大家中秋快乐,最后,让一切归于平静!

// ListDevice.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
 
#include <iostream>
#include<windows.h>
#include<setupapi.h>
#include<Devguid.h>
#include<cfgmgr32.h>
#pragma comment(lib,"SetupAPI.lib")
 
int enum_usb_device_info()
{
    int i = 0;
    int res = 0;
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData = { sizeof(DeviceInfoData) };
 
    // get device class information handle
    hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, 0, 0, DIGCF_PRESENT );
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        res = GetLastError();
        return res;
    }
 
    // enumerute device information
    DWORD required_size = 0;
    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
    {
        DWORD DataT;
        char friendly_name[2046] = { 0 };
        DWORD buffersize = 2046;
        DWORD req_bufsize = 0;
        char DeviceBuf[4096] = { 0 };
        char DeviceParent[4096] = { 0 };
        auto res=CM_Get_Device_IDA(DeviceInfoData.DevInst, DeviceBuf, 4096, 0);
        if (!res)
        {
            DEVNODE pdnDevInst = 0;
            CM_Get_Parent(&pdnDevInst, DeviceInfoData.DevInst, 0);
            CM_Get_Device_IDA(pdnDevInst, DeviceParent, 4096, 0);
            if (strstr(DeviceParent,"USB")!=nullptr)
            {
 
                ULONG    pulStatus = 0;
                ULONG    pulProblemNumber = 0;
                res = CM_Get_DevNode_Status(&pulStatus, &pulProblemNumber, pdnDevInst, 0);
                if(!res)
                {
                    SP_PROPCHANGE_PARAMS propChange = { sizeof(SP_CLASSINSTALL_HEADER) };
                    propChange.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
                    propChange.Scope = DICS_FLAG_GLOBAL;
                    propChange.StateChange = DICS_DISABLE;
 
                    res = SetupDiSetClassInstallParams
                    (
                        hDevInfo,
                        &DeviceInfoData,
                        (SP_CLASSINSTALL_HEADER*)&propChange,
                        sizeof(propChange)
                    );
 
 
                    SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData);
                }
            }
        }
        // get device description information
        if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_SERVICE, &DataT, (LPBYTE)friendly_name, buffersize, &req_bufsize))
        {
            res = GetLastError();
            continue;
        }
 
        char temp[512] = { 0 };
        sprintf_s(temp, 512, "USB device %d: %s", i, friendly_name);
        puts(temp);
    }
 
    return 0;
}
 
int main()
{
    enum_usb_device_info();
    std::cout << "Hello World!\n";
}
// ListDevice.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
 
#include <iostream>
#include<windows.h>
#include<setupapi.h>
#include<Devguid.h>
#include<cfgmgr32.h>
#pragma comment(lib,"SetupAPI.lib")
 
int enum_usb_device_info()
{
    int i = 0;
    int res = 0;
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData = { sizeof(DeviceInfoData) };
 
    // get device class information handle
    hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, 0, 0, DIGCF_PRESENT );
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        res = GetLastError();
        return res;
    }
 
    // enumerute device information
    DWORD required_size = 0;
    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
    {
        DWORD DataT;
        char friendly_name[2046] = { 0 };
        DWORD buffersize = 2046;
        DWORD req_bufsize = 0;
        char DeviceBuf[4096] = { 0 };
        char DeviceParent[4096] = { 0 };
        auto res=CM_Get_Device_IDA(DeviceInfoData.DevInst, DeviceBuf, 4096, 0);
        if (!res)
        {
            DEVNODE pdnDevInst = 0;
            CM_Get_Parent(&pdnDevInst, DeviceInfoData.DevInst, 0);
            CM_Get_Device_IDA(pdnDevInst, DeviceParent, 4096, 0);
            if (strstr(DeviceParent,"USB")!=nullptr)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-9-7 20:21 被lwl编辑 ,原因:
收藏
免费 12
支持
分享
最新回复 (20)
雪    币: 444
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
向大佬学习
2022-9-7 20:32
0
雪    币: 3776
活跃值: (5569)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
3
2022-9-7 20:56
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2022-9-9 14:43
0
雪    币: 210
活跃值: (1847)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我教你个更骚操作的usb管控 ,在注册表的usb磁盘过滤驱动上构造一个根本不存在的lowerfilter,然后构建设备树的时候这个设备回应魏这个不存在的lowerfilter过滤驱动导致根本无法正常工作,然后usb就不能正常用了,大概就是这个思路三年前我在某个安全公司要实现这个管控功能的时候就这么做的,因为当时不止usb还要1394,pnp各种巴拉巴拉的设备管控,一个个写过滤驱动太麻烦了公司就我一个人搞这个,还要一周搞完投标,就找了市面上某个知名准入系统的方案来逆向抄过来的这个思路,当然1394 ,串口这些用了这个方法,usb我还是用minifilter单独重写的
2022-9-9 14:53
1
雪    币: 3007
活跃值: (2630)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果仅仅想禁用U盘,可以直接通过修改注册表实现的
2022-9-13 15:17
0
雪    币: 1372
活跃值: (5378)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
7
现在还做DLP 不担心49年入了国军吗?
2022-9-13 16:01
0
雪    币: 0
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
wx_0xC05StackOver 我教你个更骚操作的usb管控 ,在注册表的usb磁盘过滤驱动上构造一个根本不存在的lowerfilter,然后构建设备树的时候这个设备回应魏这个不存在的lowerfilter过滤驱动导致根本无法正常工 ...
朴实无华
2022-9-13 16:19
0
雪    币: 7176
活跃值: (3103)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
优盘 做弹出比禁用成功率更高,场景中打磨出来的
2022-9-13 17:05
0
雪    币: 660
活跃值: (1495)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lwl
10
wx_0xC05StackOver 我教你个更骚操作的usb管控 ,在注册表的usb磁盘过滤驱动上构造一个根本不存在的lowerfilter,然后构建设备树的时候这个设备回应魏这个不存在的lowerfilter过滤驱动导致根本无法正常工 ...
学到了学到了
2022-9-14 09:58
0
雪    币: 660
活跃值: (1495)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lwl
11
caocaofff 如果仅仅想禁用U盘,可以直接通过修改注册表实现的
有的WIN10系统注册表无效
2022-9-14 09:58
0
雪    币: 210
活跃值: (1847)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
IamHuskar 现在还做DLP 不担心49年入了国军吗?
数据安全法实施之后 dlp和透明加解密已经迎来了第二春
2022-9-14 10:45
0
雪    币: 6254
活跃值: (5690)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
13
感谢分享!
2022-9-14 10:47
0
雪    币: 1478
活跃值: (4022)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
发现优盘插入,直接弹出
2022-9-14 13:05
0
雪    币: 319
活跃值: (347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了,谢谢大佬
2022-9-14 17:26
0
雪    币: 3785
活跃值: (3947)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
感谢分享!
2022-9-15 12:24
0
雪    币: 3785
活跃值: (3947)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17

朴实无华!

最后于 2022-9-15 12:31 被fengyunabc编辑 ,原因:
2022-9-15 12:30
0
雪    币: 231
活跃值: (640)
能力值: ( LV4,RANK:41 )
在线值:
发帖
回帖
粉丝
18
害,我就是用的sfilter驱动做的u盘禁用\读写控制。
代码贼多不说,还有各种系统兼容问题,调完了,特么的还得解决证书问题。
2022-9-23 09:28
0
雪    币: 192
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
启动盘进pe后是不是就无法管控了?
2022-9-23 10:01
0
雪    币: 660
活跃值: (1495)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lwl
20
jkydhe 启动盘进pe后是不是就无法管控了?
还有全盘加密哇
2022-9-23 10:36
0
雪    币: 137
活跃值: (1548)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21

我之前的公司也是用的setupapi来禁用U盘, 禁用失败就弹出, 出现了一次事故,客户的移动硬盘被弹出后不能用了, 最后改成移动硬盘失败就让他失败不做弹出操作

最后于 2023-1-30 16:50 被wumnkx编辑 ,原因:
2023-1-30 16:49
0
游客
登录 | 注册 方可回帖
返回
//