从多个方面详细解析advapi

一、advapi介绍

Microsoft Windows系统中的安全、身份验证、对象权限以及密码和帐户管理功能都是由advapi32.dll动态连接库提供。它是Windows系统中的一个重要的库,是安全子系统和安全性应用程序的基础,使用C++编写,支持多线程应用程序,适用于32位和64位操作系统。

它是Windows API的一个子集并具有用户模式和内核模式支持。通过这个库,我们可以在Windows平台上编写安全性相关的应用程序。

二、使用advapi32.dll实现安全模块

相信大家都知道在Windows系统中涉及到账户权限管理时,需要使用“用户帐户控制”等功能。这里我们通过C++代码案例来实现添加或删除用户到本地组。

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 
#pragma comment(lib, "netapi32.lib") 

int main()
{
    //定义一些变量
    NET_API_STATUS status;           //netapi 返回状态
    LOCALGROUP_MEMBERS_INFO_3 lmi3; //用户信息
    LPTSTR lpszServerName = NULL;    //服务器名,默认为本地
    LPTSTR lpszGroupName = TEXT("Administrators"); //组名称

    //用户信息 
    lmi3.lgrmi3_domainandname = TEXT("test_user");

    //添加用户到本地组 
    status = NetLocalGroupAddMembers(lpszServerName, lpszGroupName, 3, (LPBYTE)&lmi3, 1);

    //删除用户到本地组 
    status = NetLocalGroupDelMembers(lpszServerName, lpszGroupName, 3, (LPBYTE)&lmi3, 1);

    _tprintf(_T("status %d\n"), status);
    getchar();

    return 0;
}

三、使用advapi实现加密和解密功能

在C++中,可以使用Crypt系列API实现对数据的加密和解密,advapi32.dll 提供了一个重要的函数:CryptAcquireContext,用于打开加密和数据保护接口。这里我们通过一个简单的例子代码来实现对字符串的加密和解密操作。

#include 
#include 
#include 

#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

int _tmain(int argc, _TCHAR* argv[])
{
    HCRYPTPROV hCryptProv;   // 证书提供者句柄
    HCRYPTHASH hHash;   // 哈希对象句柄
    HCRYPTKEY cryptKey; // 密钥处理对象句柄
    DWORD dwLength; // 加密前字符串长度
    BYTE * pbHash; // 哈希对象pbData值
    BYTE * pbData; // 加密前数据
    BYTE * pbBuffer; // 加密后数据
    DWORD cbBuffer; // Buffer长度
    LPTSTR originalString = TEXT("This is an encryption test!"); //待加密的字符串
   
    dwLength = lstrlen(originalString);
    pbData = (BYTE *)originalString; //将originalString转化为unsigned char
    pbBuffer = NULL;
    cbBuffer = dwLength + 1;

    // 在指定的证书提供者上获取一个句柄 (通过传递 PROV_RSA_FULL 可获得标准RSA加密) 

    if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0))
    {
        // 创建哈希对象
        if(CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
        {
            // 添加数据到哈希对象
            if(CryptHashData(hHash, pbData, dwLength,0))
            {
                // 确定Hash的长度
                if(CryptGetHashParam(hHash, HP_HASHVAL, NULL, &dwLength, 0))
                {
                    pbHash = (BYTE *)malloc(dwLength); // 动态分配存储区域
                    CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &dwLength, 0);
                    std::cout << "Hash Data:" << std::endl;
                    // 输出哈希值
                    for(int i = 0; i < dwLength; i++)
                    {
                        printf("%2.2x ", pbHash[i]);
                    }
                    printf("\n");
                    // 根据哈希数据的句柄和密钥处理的句柄,创建新的句柄。
                    if(CryptDeriveKey(hCryptProv, CALG_RC4, hHash, 0, &cryptKey))
                    {
                        // 获得缓冲区大小
                        if(CryptEncrypt(cryptKey, 0, TRUE, 0, NULL, &cbBuffer, 0))
                        {
                            pbBuffer = (BYTE *)malloc(cbBuffer);
                            CopyMemory(pbBuffer, pbData, dwLength);
                            // 实际加密函数
                            if(CryptEncrypt(cryptKey, 0, TRUE, 0, pbBuffer, &dwLength, cbBuffer))
                            {
                                pbBuffer[dwLength] = '\0';
                                std::cout << "Encrypted Data:" << pbBuffer << std::endl;
                                // 得到加密前数据大小
                                dwLength = (lstrlen((LPCTSTR)pbBuffer) + 1) * sizeof(TCHAR);
                                // 解密
                                if(CryptDecrypt(cryptKey, 0, TRUE, 0, pbBuffer, &dwLength))
                                {
                                    pbBuffer[dwLength] = '\0';
                                    std::cout << "Decrypted Data:" << pbBuffer << std::endl;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    // 关闭句柄以及释放分配的空间
    if (hHash)
        CryptDestroyHash(hHash);
    if (cryptKey)
        CryptDestroyKey(cryptKey);
    if (pbHash)
        free(pbHash);
    if (pbBuffer)
        free(pbBuffer);
    if (hCryptProv)
        CryptReleaseContext(hCryptProv, 0);

    return 0;
}

四、使用advapi实现注册表操作

在Windows系统中,注册表是一个十分重要的组件,我们通过advapi32.dll库的RegOpenKeyEx、RegEnumKey和RegCloseKey三个函数来实现在注册表中创建、添加、修改和删除键值。

#include 
#include 
#include 

int _tmain(int argc, _TCHAR* argv[])
{
    HKEY hKey;
    DWORD dwDisposition;

    //创建新的键值
    if (RegCreateKeyEx(HKEY_CURRENT_USER,
        TEXT("Software\\MyCompany\\MyApp"),
        0,
        NULL,
        REG_OPTION_NON_VOLATILE,
        KEY_ALL_ACCESS,
        NULL,
        &hKey,
        &dwDisposition) == ERROR_SUCCESS)
    {
        _tprintf(_T("Key Created.\n"));
        RegCloseKey(hKey);
    }

    //修改已有的键值
    if (RegOpenKeyEx(HKEY_CURRENT_USER,
        TEXT("Software\\MyCompany\\MyApp"),
        0,
        KEY_ALL_ACCESS,
        &hKey) == ERROR_SUCCESS)
    {
        if (RegSetValueEx(hKey,
            TEXT("MySetting"),
            0,
            REG_SZ,
            (BYTE*)TEXT("MyValue"),
            lstrlen(TEXT("MyValue")) + 1) == ERROR_SUCCESS)
        {
            _tprintf(_T("Key Updated.\n"));
        }
        RegCloseKey(hKey);
    }

    //查询键值
    if (RegOpenKeyEx(HKEY_CURRENT_USER,
        TEXT("Software\\MyCompany\\MyApp"),
        0,
        KEY_READ,
        &hKey) == ERROR_SUCCESS)
    {
        DWORD dwType = REG_SZ;
        TCHAR szValue[255];
        DWORD dwSize = 255;
        if (RegQueryValueEx(hKey,
            TEXT("MySetting"),
            NULL,
            &dwType,
            (BYTE*)szValue,
            &dwSize) == ERROR_SUCCESS)
        {
            _tprintf(_T("MySetting=%s\n"), szValue);
        }
        RegCloseKey(hKey);
    }

    //删除键值
    if (RegOpenKeyEx(HKEY_CURRENT_USER,
        TEXT("Software\\MyCompany\\MyApp"),
        0,
        KEY_ALL_ACCESS,
        &hKey) == ERROR_SUCCESS)
    {
        if (RegDeleteValue(hKey, TEXT("MySetting")) == ERROR_SUCCESS)
        {
            _tprintf(_T("Key Deleted.\n"));
        }
        RegCloseKey(hKey);
    }

    //删除整个键值
    RegDeleteKey(HKEY_CURRENT_USER, TEXT("Software\\MyCompany\\MyApp"));

    return 0;
}

五、结语

advapi32.dll可以有效地提高Windows系统的安全性,为应用程序提供保护和支持,具有开发者友好的API,可以使应用程序更加安全可靠。在今天的许多应用程序中,大量的安全实用程序是使用advapi编写的,所以我们需要深入了解和掌握advapi库的相关知识,才能编写出高质量且安全可靠的Windows应用程序。

原创文章,作者:SWVG,如若转载,请注明出处:https://www.506064.com/n/136509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SWVGSWVG
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相关推荐

  • 为什么Python不能编译?——从多个方面浅析原因和解决方法

    Python作为很多开发人员、数据科学家和计算机学习者的首选编程语言之一,受到了广泛关注和应用。但与之伴随的问题之一是Python不能编译,这给基于编译的开发和部署方式带来不少麻烦…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • 从多个方面用法介绍yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授权过程中,需要进行确认和配置级别控制的全能编程开发工程师。 一、授权确…

    编程 2025-04-29
  • 从多个方面zmjui

    zmjui是一个轻量级的前端UI框架,它实现了丰富的UI组件和实用的JS插件,让前端开发更加快速和高效。本文将从多个方面对zmjui做详细阐述,帮助读者深入了解zmjui,以便更好…

    编程 2025-04-28
  • 学Python用什么编辑器?——从多个方面评估各种Python编辑器

    选择一个适合自己的 Python 编辑器并不容易。除了我们开发的应用程序类型、我们面临的软件架构以及我们的编码技能之外,选择编辑器可能也是我们编写代码时最重要的决定之一。随着许多不…

    编程 2025-04-28
  • 使用easypoi创建多个动态表头

    本文将详细介绍如何使用easypoi创建多个动态表头,让表格更加灵活和具有可读性。 一、创建单个动态表头 easypoi是一个基于POI操作Excel的Java框架,支持通过注解的…

    编程 2025-04-28
  • 创建列表的多个方面

    本文将从多个方面对创建列表进行详细阐述。 一、列表基本概念 列表是一种数据结构,其中元素以线性方式组织,并且具有特殊的序列位置。该位置可以通过索引或一些其他方式进行访问。在编程中,…

    编程 2025-04-28
  • Python多个sheet表合并用法介绍

    本文将从多个方面对Python多个sheet表合并进行详细的阐述。 一、xlrd与xlwt模块的基础知识 xlrd与xlwt是Python中处理Excel文件的重要模块。xlrd模…

    编程 2025-04-27
  • 从多个角度用法介绍lower down

    lower down是一个常用于编程开发中的操作。它可以对某个值或变量进行降低精度的处理,非常适合于一些需要精度不高但速度快的场景。那么,在本文中,我们将从多个角度解析lower …

    编程 2025-04-27

发表回复

登录后才能评论