您的位置:

从多个方面详细解析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应用程序。