无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 501|回复: 14
打印 上一主题 下一主题

[原创] C++判断指定盘符是否开启了BITLOCK加密

[复制链接]
跳转到指定楼层
1#
发表于 前天 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hanlu 于 2025-6-30 15:26 编辑


// ConsoleApplication8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <windows.h>
#include <strsafe.h>
#include <winioctl.h>  
#include <ntddstor.h>  
BOOL IsBitlockerPartition(IN LPCWSTR lpDiskName, ULONGLONG ullOffset);


typedef struct _BOOT_SECTOR_BITLOCKER {
        BYTE        jump[3];
        BYTE        oemID[8];
        WORD        bytePerSector;
        BYTE        sectorPerCluster;
        WORD        reserved0;
        BYTE                fatCount;
        WORD                rootMaxEntries;
        WORD                totalSectorsSmall;
        BYTE                mediaType;
        WORD                sectorsPerFatSmall;
        WORD                sectorsPerTrack;
        WORD                headCount;
        DWORD                fsOffset;
        DWORD                totalSectors;
        DWORD                sectorsPerFat;
        WORD                fatFlags;
        WORD                version;
        DWORD                rootCluster;
        WORD                fsInfoSector;
        WORD                backupSector;
        ULONG32                reserved1[3];
        BYTE                driveNumber;
        BYTE                reserved2;
        BYTE                extSig;
        ULONG32                serial;
        CHAR                label[11];
        CHAR                fsName[8];
        CHAR            bootCode[70];
        GUID                partitionGUID;
        DWORD64                fveBlockOffset[3];
        CHAR            bootCode2[307];
        BYTE                stringOffsets[3];
        BYTE                endMarker[2];
} BOOT_SECTOR_BITLOCKER, * PBOOT_SECTOR_BITLOCKER;


static BOOL IsBitlocker(WCHAR Volume)
{
        WCHAR szVolumeDosName[50] = {};
        ::StringCchPrintfW(szVolumeDosName, ARRAYSIZE(szVolumeDosName), L"\\\\.\\%c:", Volume);
        HANDLE hFile = ::CreateFile(szVolumeDosName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
        if (INVALID_HANDLE_VALUE == hFile)
                return FALSE;

        BOOL bRet = FALSE;
        do
        {
                BYTE bBuffer[sizeof(VOLUME_DISK_EXTENTS) + 5 * sizeof(DISK_EXTENT)] = {};

                ULONG ulReturnedLength = 0;
                if (!::DeviceIoControl(hFile, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &bBuffer, sizeof(bBuffer), &ulReturnedLength, NULL))
                        break;

                PVOLUME_DISK_EXTENTS pVolumeDiskExt = (PVOLUME_DISK_EXTENTS)bBuffer;
                if (1 == pVolumeDiskExt->NumberOfDiskExtents)
                {
                        WCHAR szPhysicalDiskName[100] = {};
                        ::StringCchPrintfW(szPhysicalDiskName, ARRAYSIZE(szPhysicalDiskName), L"\\\\.\\PhysicalDrive%d",
                                pVolumeDiskExt->Extents[0].DiskNumber);

                        bRet = IsBitlockerPartition(szPhysicalDiskName, pVolumeDiskExt->Extents[0].StartingOffset.QuadPart);
                }
        } while (FALSE);

        ::CloseHandle(hFile);

        return bRet;
}

BOOL IsBitlockerPartition(IN LPCWSTR lpDiskName, ULONGLONG ullOffset)
{
        BOOL bRet = FALSE;
        HANDLE hFile = INVALID_HANDLE_VALUE;
        do
        {
                hFile = CreateFileW(lpDiskName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
                if (INVALID_HANDLE_VALUE == hFile)
                        break;
                LARGE_INTEGER liOffset = {};
                liOffset.QuadPart = ullOffset;
                LARGE_INTEGER NewFilePointer = {};
                if (0 == ::SetFilePointerEx(hFile, liOffset, &NewFilePointer, FILE_BEGIN))
                        break;

                BYTE bDbr[512] = {};
                DWORD dwRead = 0;
                if (!::ReadFile(hFile, bDbr, sizeof(bDbr), &dwRead, NULL))
                        break;
                PBOOT_SECTOR_BITLOCKER pBitlockerBootSector = (PBOOT_SECTOR_BITLOCKER)bDbr;
                bRet = (0 == _strnicmp((char*)pBitlockerBootSector->oemID, "-FVE-FS-", 8));
        } while (FALSE);

        if (INVALID_HANDLE_VALUE != hFile)
                ::CloseHandle(hFile);
        return bRet;
}



int main()
{
        if (IsBitlocker('C')) {
                //开启
                std::cout << "true" << std::endl;
        }
        else {
                //未开启
                std::cout << "false" << std::endl;
        }
}










是代码,可以直接编译的  不会用的暂时不要下载啦 调用的官网方法判断


2#
发表于 前天 15:34 | 只看该作者
感谢分享
回复

使用道具 举报

3#
发表于 前天 15:35 | 只看该作者
感谢分享,我还以为顺便给解了
回复

使用道具 举报

4#
发表于 前天 16:01 来自手机 | 只看该作者
前几日,我也查了API文档,想着用NSIS写一个查询哪个盘加密,然后揭秘的小工具,感觉太复杂了,于是用批处理写了一个……

点评

怎么没有分享  详情 回复 发表于 前天 22:10
回复

使用道具 举报

5#
发表于 前天 16:04 | 只看该作者

感谢分享
回复

使用道具 举报

6#
发表于 前天 16:14 | 只看该作者
感谢分享!
回复

使用道具 举报

7#
发表于 前天 16:49 | 只看该作者
多谢分享!!!
回复

使用道具 举报

8#
发表于 前天 17:10 | 只看该作者
nttwqz 发表于 2025-6-30 16:01
前几日,我也查了API文档,想着用NSIS写一个查询哪个盘加密,然后揭秘的小工具,感觉太复杂了,于是用批处 ...

贡献出来
回复

使用道具 举报

9#
发表于 前天 20:19 | 只看该作者
感谢分享
回复

使用道具 举报

10#
发表于 前天 22:10 | 只看该作者
nttwqz 发表于 2025-6-30 02:01
前几日,我也查了API文档,想着用NSIS写一个查询哪个盘加密,然后揭秘的小工具,感觉太复杂了,于是用批处 ...

怎么没有分享
回复

使用道具 举报

11#
发表于 昨天 02:48 | 只看该作者
有大佬分享成品吗
回复

使用道具 举报

12#
发表于 昨天 06:06 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

13#
发表于 昨天 08:28 | 只看该作者
感谢分享
回复

使用道具 举报

14#
发表于 昨天 20:44 | 只看该作者
感谢分享
回复

使用道具 举报

15#
发表于 6 小时前 | 只看该作者
谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-7-2 14:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表