2017-11-02 24 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 값이 올바른 출력입니다. 나는 문제가 바이트 부호없는 문자의 정보 ItemData 벡터에 md5Digest 문자열의 변환에 놓여 있도록 md5Digest가 올바른 값이 있는지 분명히 알 수있는 프로그램 ....

Visual Studio Debugging

을 디버깅 할 때 무엇이다 내 코드의 문제점, 왜 데이터가 레지스트리에 잘못 입력 되었습니까?

+1

'char_code ('x') + char_code ('3') + char_code ('D') = 0xEF' 이후에 잘못된 벡터를 만드는 것처럼 보이지만 0x3D가 필요합니다. –

+0

@ JohnnyMopp 어떻게 올바르게 벡터를 만들 수 있습니까? –

답변

1

을 당신은 문자열을 가질 수 바이트 배열로 변환하려고합니다. 당신은 BYTE 2 개 문자로 변환하는 도우미 함수 작성할 수 있습니다

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

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에 의해 언급으로, {0x3D, 0x65, 0xB8, 0xEB, 0xDD, 0x0E}

을 포함 또는, 당신은 CryptStringToBinary 윈도우 기능을 사용할 수 있습니다

+0

이 작업을 수행하거나 [CryptStringToBinaryW] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa380285(v=vs.85))를 사용할 수 있습니다.aspx)와 함께 'CRYPT_STRING_HEX' 플래그 – RbMm

+0

@ RBM 감사합니다. 나는 그 기능을 몰랐다. 나는 갱신 할 것이다. –

+1

간결한 코드 및 WinAPI에 해당하는 기능을 참조하기위한 대답으로 표시. –

1

'0x' 2 글자 char 리터럴을 md5Digest[i - 1] + md5Digest[i]으로 합친 다음 BYTE으로 트렁크됩니다. 이것은 당신이 그들 중 "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 문자열을 저장해야

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'부분을 제거해야합니까? (편집) 그냥 시도하고 위의 두 예제와 완전히 다른 것을 생산합니다 –

+0

@AndrewLeFevre 직접 저장할 수 있습니다. – VTT

+0

어떻게 직접 저장할 수 있습니까? –