#include #include "wudetect.h" // a small utility to convert hexadecimal digits to numeric values in dec static inline int hexa( TCHAR c ) { if( c >= '0' && c <='9' ) { return (c - '0'); } else if( c >= 'a' && c <= 'f' ) { return (10 + (c - 'a') ); } else if( c >= 'A' && c <= 'F' ) { return (10 + (c - 'A') ); } return -1; } static void StringToBin( LPTSTR lpData, DWORD& nSize ) { nSize = 0; // we will reassign the value on size of binary buffer BYTE * lpBinaryData = (BYTE*)lpData; //_strlwr( lpData ); while( *lpData != '\0' ) { while( ' ' == *lpData ) lpData++; *lpBinaryData++ = (hexa( *lpData++ ) * 16) + hexa( *lpData++ ); nSize++; } } ///////////////////////////////////////////////////////////////////////////// // CExpressionParser::fDetectRegBinary // Detect a substring in registry datum. // // Form: E=RegSubstr,,,,, // // Comments : ///////////////////////////////////////////////////////////////////////////// bool CExpressionParser::fDetectRegBinary(TCHAR * pszBuf) { const int MAX_DATA_SIZE = 2000; bool fSuccess = false; HKEY hKeyRoot; HKEY hKey; DWORD type; TCHAR szTargetKeyName[MAX_PATH]; TCHAR szTargetKeyValue[MAX_DATA_SIZE]; TCHAR szKeyMissingStatus[MAX_DATA_SIZE]; TCHAR szData[MAX_DATA_SIZE]; TCHAR szSubStr[MAX_DATA_SIZE]; DWORD iToken = 0; // Get reg root type (HKLM, etc) if ( fMapRegRoot(pszBuf, ++iToken, &hKeyRoot) && (GetStringField2(pszBuf, ++iToken, szTargetKeyName, sizeof(szTargetKeyName)/sizeof(TCHAR)) != 0) ) { if ( RegOpenKeyEx( hKeyRoot, szTargetKeyName, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS ) { if ( (GetStringField2(pszBuf, ++iToken, szTargetKeyValue, sizeof(szTargetKeyValue)/sizeof(TCHAR)) != 0) && (GetStringField2(pszBuf, ++iToken, szSubStr, sizeof(szSubStr)/sizeof(TCHAR)) != 0) ) { DWORD size = sizeof(szData); if ( RegQueryValueEx(hKey, szTargetKeyValue, 0, &type, (BYTE *)szData, &size) == ERROR_SUCCESS ) { if ( type == REG_SZ ) { _tcslwr(szData); // iterate thru the substrings looking for a match. //while ( GetStringField2(pszBuf, ++iToken, szSubStr, sizeof(szSubStr)) != 0 ) { _tcslwr(szSubStr); if ( _tcsstr(szData, szSubStr) != NULL ) { fSuccess = true; goto quit_while; } } } else if( REG_BINARY== type ) { StringToBin( szSubStr, size ); int nRes = memcmp( szData, szSubStr, size ); //printf( "", nRes ); if( (int)0 == nRes ) { fSuccess = true; //goto quit_while; } //printf( "", nRes ); } quit_while:; } else { // if we get an error, assume the key does not exist. Note that if // the status is DETFIELD_NOT_INSTALLED then we don't have to do // anything since that is the default status. if ( lstrcmpi(DETFIELD_INSTALLED, szKeyMissingStatus) == 0 ) { fSuccess = true; } } } RegCloseKey(hKey); } } //cleanup: return fSuccess; }