2017-11-02 8 views
0

Windowsにソフトウェアポリシーハッシュルールを追加するプロセスを自動化しようとしています。現在、有効なハッシュをレジストリに追加する際に問題が発生しています。このコードは、キーを作成し、レジストリにハッシュを追加します。ルールにレジストリキーを比較するときWindowsレジストリのREG_BINARYタイプに文字列を正しく追加します。

My hash rule

しかし:これは正常に動作して、レジストリにキーを追加します

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 
); 

あなたは非常に重要な違いを見ることができ、グループポリシーによって追加:

Windows added hash rule

「にItemData」値はそれらの間で異なっています。下の画像のItemData値が正しい出力です。プログラムをデバッグするとき、私ははっきりとは何

Visual Studio Debugging

.... MD5ダイジェストが正しい値を持っているので、問題はバイトまたは符号なし文字のにItemDataベクトルにMD5ダイジェスト文字列の変換であることがわかります私のコードの問題、なぜデータがレジストリに間違って入力されていますか?

+1

あなたは 'char_code( 'x')+ char_code( '3')+ char_code( 'D')= 0xEF'から間違ったベクトルを構築しているようですが、0x3Dが必要です。 –

+0

@JohnnyMoppどのようにベクトルを正しく構築するのですか? –

答えて

1

あなたは、その文字列を持っていますバイト配列に変換する必要があります。あなたは、BYTEに2つの文字を変換するためのヘルパー関数を書くことができます。

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は今@RbMmによって言及として、あなたはCryptStringToBinary、Windowsの機能を使用することができ、{0x3D, 0x65, 0xB8, 0xEB, 0xDD, 0x0E}

が含まれているか:

#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 
    ); 
+0

がこれを行うことができます、または[CryptStringToBinaryW](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380285(v=vs.85))を使用することができます。aspx)を 'CRYPT_STRING_HEX'フラグ – RbMm

+0

@RbMmありがとうございます。私はその機能を知らなかった。私は更新します。 –

+1

簡潔なコードとWinAPI同等の機能を参照するための答えとしてマークしてください。 –

1

'0x' 2文字の文字リテラルがmd5Digest[i - 1] + md5Digest[i]で合計され、​​にトランケートされています。これは、あなたがそれらから "0xFF"バイト値を構築しようとしていたようです。あなたは直接md5の文字列を格納する必要があります

const DWORD dataSize = static_cast<DWORD>(md5Digest.size()); 

::RegSetValueEx(
    m_hKey, 
    valueName.c_str(), 
    0, // reserved 
    REG_BINARY, 
    reinterpret_cast< BYTE const *>(md5Digest.data()), 
    dataSize 
); 

あなたが実際にMD5から16進数のバイナリ表現を格納する必要がある場合、あなたはこのようなバイトに変換する必要があります。

BYTE char_to_halfbyte(char const c) 
{ 
    if(('0' <= c) && (c <= '9')) 
    { 
     return(static_cast<BYTE>(c - `0`)); 
    } 
    else 
    { 
     assert(('A' <= c) && (c <= 'F')); 
     return(static_cast<BYTE>(10 + c - `A`)); 
    } 
} 

for(std::size_t i = 0; i < md5Digest.length(); i += 2) 
{ 
    assert((i + 1) < md5Digest.length()); 
    itemData.push_back 
    (
     (char_to_halfbyte(md5Digest[i ]) << 4) 
     | 
     (char_to_halfbyte(md5Digest[i + 1]) ) 
    ); 
} 
+0

「0x」部分を削除する必要がありますか? (編集)ちょうど試してみると、上記の2つの例とはまったく異なるものが生成されます –

+0

@AndrewLeFevreそれを直接保存することができます。 – VTT

+0

どうすればそれを直接保存できますか? –

関連する問題