c++ - 正确地将字符串添加到 Windows 注册表中的 REG_BINARY 类型

标签 c++ windows hash registry group-policy

我正在尝试自动执行将软件策略哈希规则添加到 Windows 的过程,但目前在将有效哈希添加到注册表时遇到问题。此代码创建一个 key 并将散列添加到注册表:

HKEY* m_hKey;
string md5Digest;
string valueName = "ItemData";
vector<BYTE> itemData;

/*
use Crypto++ to get file hash
*/

//convert string to format that can be loaded into registry
for (int i = 1; i < md5Digest.length(); i += 2)
    itemData.push_back('0x' + md5Digest[i - 1] + md5Digest[i]);

// Total data size, in bytes
const DWORD dataSize = static_cast<DWORD>(itemData.size());

::RegSetValueEx(
    m_hKey,
    valueName.c_str(),
    0, // reserved
    REG_BINARY,
    &itemData[0],
    dataSize
);

这工作正常,并将 key 添加到注册表:

My hash rule

但是当将注册表项与组策略添加的规则进行比较时,您会发现一个非常重要的区别:

Windows added hash rule

它们之间的“ItemData”值不同。底部图片的 ItemData 值是正确的输出。在调试程序时,我可以清楚地看到 md5Digest 具有正确的值,所以问题出在 md5Digest 字符串到 BYTE 或 unsigned chars 的 ItemData vector 的转换....

Visual Studio Debugging

我的代码有什么问题,为什么向注册表输入的数据不正确?

最佳答案

您有一个要转换为字节数组的字符串。您可以编写一个辅助函数将 2 个字符转换为 BYTE:

using BYTE = unsigned char;

BYTE convert(char a, char b)
{
    // Convert hex char to byte
    // Needs fixin for lower case
    if (a >= '0' && a <= '9') a -= '0';
    else a -= 55;  // 55 = 'A' - 10
    if (b >= '0' && b <= '9') b -= '0';
    else b -= 55;

    return (a << 4) | b;
}
....
vector<BYTE> v;
string s = "3D65B8EBDD0E";
for (int i = 0; i < s.length(); i+=2) {
    v.push_back(convert(s[i], s[i+1]));
}

v 现在包含 {0x3D, 0x65, 0xB8, 0xEB, 0xDD, 0x0E}

或者,如@RbMm 所述,您可以使用 CryptStringToBinary窗口函数:

#include <wincrypt.h>
...
std::string s = "3D65B8EBDD0E";
DWORD hex_len = s.length() / 2;
BYTE *buffer = new BYTE[hex_len];
CryptStringToBinary(s.c_str(),
    s.length(),
    CRYPT_STRING_HEX,
    buffer, 
    &hex_len,
    NULL,
    NULL
    );

关于c++ - 正确地将字符串添加到 Windows 注册表中的 REG_BINARY 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47082613/

相关文章:

c++ - 为什么堆上的分配比栈上的分配快?

c++ - 使用 hashed_unique_index boost 多索引会产生编译器错误

Perl - 如何将哈希转换为查询字符串?

c++ - C++ 中的覆盖和重载是怎么回事?

c++ - 用函数替换宏

c++ - 如何使用模板正确定义函数

windows - 纯数据 : use library on windows

python - cv2.imshow 图像窗口放置在可视屏幕之外

javascript - Windows 小工具 - javascript 更改 CSS

perl - 钩子(Hook)为 Perl 中的每个哈希查找提供一个值