|
|
//
// Modified by RogerJ, 03/08/00
// Original Creator Unknown
// Modification --- UNICODE and Win64 ready
//
//////////////////////////////////////////////////////////////////////////////
typedef enum _PARSE_TOKEN_TYPE { TOKEN_LEFTPAREN, TOKEN_RIGHTPAREN, TOKEN_AND, TOKEN_OR, TOKEN_NOT, TOKEN_VARIABLE, TOKEN_DONE } PARSE_TOKEN_TYPE;
typedef struct _TOKEN_IDENTIFIER { TCHAR *pszTok; PARSE_TOKEN_TYPE tok; } TOKEN_IDENTIFIER;
const bool FAILURE_RESULT = false;
class CExpressionParser { public: typedef enum _enumToken { // comparison tokens
COMP_EQUALS, COMP_NOT_EQUALS, COMP_LESS_THAN, COMP_LESS_THAN_EQUALS, COMP_GREATER_THAN, COMP_GREATER_THAN_EQUALS, // directory tokens
DIR_SYSTEM, DIR_WINDOWS } enumToken;
typedef struct _TokenMapping { const TCHAR * /*const*/ pszToken; enumToken enToken;
} TokenMapping;
CExpressionParser(DETECTION_STRUCT *pDetection) : m_pDetection(pDetection), m_pch(NULL) {}
//
// Expression parsing methods
//
void vSkipWS(void);
bool fGetCurToken( PARSE_TOKEN_TYPE & tok, TOKEN_IDENTIFIER *grTokens, int nSize);
bool fGetCurTermToken(PARSE_TOKEN_TYPE & tok); bool fGetCurExprToken(PARSE_TOKEN_TYPE & tok);
bool fGetVariable(TCHAR *pszVariable);
bool fPerformDetection(TCHAR * pszVariable, bool & fResult);
bool fEvalTerm(bool & fResult, bool fSkip);
HRESULT fEvalExpression(TCHAR * pszExpr, bool * pfResult);
bool fEvalExpr(bool & fResult);
bool fGetCifEntry( TCHAR *pszParamName, TCHAR *pszParamValue, DWORD cbParamValue);
//
// Detection methods
//
bool fKeyType(TCHAR *szRootType, HKEY *phKey); bool fDetectRegSubStr(TCHAR * pszBuf); bool fDetectRegBinary(TCHAR * pszBuf); bool fDetectFileVer(TCHAR * pszBuf); bool fDetectRegKeyExists(TCHAR * pszBuf); bool fDetectRegKeyVersion(TCHAR * pszBuf); bool fDetect40BitSecurity(TCHAR * pszBuf);
bool fMapToken(TCHAR *pszToken, int nSize, TokenMapping grTokenMap[], enumToken *penToken); bool fMapRootDirToken(TCHAR *pszRootDirToken, enumToken *penToken); bool fMapComparisonToken(TCHAR *pszComparisonToken, enumToken *penToken); bool fCompareVersion(IN DWORD dwVer1, IN DWORD dwBuild1, IN enumToken enComparisonToken, IN DWORD dwVer2, IN DWORD dwBuild2); DWORD dwParseValue(DWORD iToken, TCHAR * szBuf, TargetRegValue & targetValue);
private: TCHAR *m_pch; DETECTION_STRUCT *m_pDetection; };
|