From 39e447eccdaf9f31ee7023eb751df1109c29b70e Mon Sep 17 00:00:00 2001 From: Moammad97 Date: Wed, 4 Nov 2020 15:50:14 +0330 Subject: [PATCH] Fix bugs --- hyperdbg/hprdbgctrl/sewrapper.cpp | 7 +- hyperdbg/hprdbghv/Debugger.c | 6 +- hyperdbg/include/ScriptEngineCommon.h | 82 +++++++++---------- hyperdbg/script-engine/{src => }/scanner.h | 33 ++------ hyperdbg/script-engine/script-engine.vcxproj | 2 +- .../script-engine.vcxproj.filters | 4 +- hyperdbg/script-engine/src/ScriptEngine.c | 4 +- hyperdbg/script-engine/src/ScriptEngine.h | 14 +--- hyperdbg/script-engine/src/parse_table.h | 5 +- hyperdbg/script-engine/src/scanner.c | 43 ++++++---- 10 files changed, 95 insertions(+), 105 deletions(-) rename hyperdbg/script-engine/{src => }/scanner.h (76%) diff --git a/hyperdbg/hprdbgctrl/sewrapper.cpp b/hyperdbg/hprdbgctrl/sewrapper.cpp index 80529833..7be5950d 100644 --- a/hyperdbg/hprdbgctrl/sewrapper.cpp +++ b/hyperdbg/hprdbgctrl/sewrapper.cpp @@ -51,13 +51,18 @@ VOID ScriptEngineWrapperTestPerformAction(PGUEST_REGS_USER_MODE GuestRegs, // Test Parser // PSYMBOL_BUFFER CodeBuffer = ScriptEngineParse((char *)Expr.c_str()); + + UINT64 g_TempList[MAX_TEMP_COUNT] = { 0 }; + UINT64 g_VariableList[MAX_VAR_COUNT] = { 0 }; + + if (CodeBuffer->Message == NULL) { PrintSymbolBuffer(CodeBuffer); for (int i = 0; i < CodeBuffer->Pointer;) { printf("%d\n", i); - ScriptEngineExecute(GuestRegs, CodeBuffer, &i); + ScriptEngineExecute(GuestRegs, (UINT64*)g_TempList, (UINT64*) g_VariableList, CodeBuffer, &i); } RemoveSymbolBuffer(CodeBuffer); } else { diff --git a/hyperdbg/hprdbghv/Debugger.c b/hyperdbg/hprdbghv/Debugger.c index 5bb24532..e6cb8d5a 100644 --- a/hyperdbg/hprdbghv/Debugger.c +++ b/hyperdbg/hprdbghv/Debugger.c @@ -991,9 +991,13 @@ DebuggerPerformRunScript(UINT64 Tag, PDEBUGGER_EVENT_ACTION Action, PGUEST_REGS CodeBuffer.Size = Action->ScriptConfiguration.ScriptLength; CodeBuffer.Pointer = Action->ScriptConfiguration.ScriptPointer; + UINT64 g_TempList[MAX_TEMP_COUNT] = {0}; + UINT64 g_VariableList[MAX_VAR_COUNT] = {0}; + + for (int i = 0; i < CodeBuffer.Pointer;) { - ScriptEngineExecute(Regs, &CodeBuffer, &i); + ScriptEngineExecute(Regs, (UINT64*) g_TempList, (UINT64*) g_VariableList,&CodeBuffer, &i); } } diff --git a/hyperdbg/include/ScriptEngineCommon.h b/hyperdbg/include/ScriptEngineCommon.h index 64e84e82..d62e17c4 100644 --- a/hyperdbg/include/ScriptEngineCommon.h +++ b/hyperdbg/include/ScriptEngineCommon.h @@ -151,8 +151,6 @@ typedef struct _GUEST_REGS_USER_MODE_USER_MODE { // and allocate variableList Dynamically. #define MAX_VAR_COUNT 32 -UINT64 g_TempList[MAX_TEMP_COUNT] = {0}; -UINT64 g_VariableList[MAX_VAR_COUNT] = {0}; ////////////////////////////////////////////////// // Imports // @@ -360,7 +358,7 @@ UINT64 GetPseudoRegValue(PSYMBOL Symbol) { // TODO: Add all the register } } -UINT64 GetValue(PGUEST_REGS_USER_MODE GuestRegs, PSYMBOL Symbol) { +UINT64 GetValue(PGUEST_REGS_USER_MODE GuestRegs, UINT64* g_TempList, UINT64* g_VariableList, PSYMBOL Symbol) { switch (Symbol->Type) { case SYMBOL_ID_TYPE: @@ -376,7 +374,7 @@ UINT64 GetValue(PGUEST_REGS_USER_MODE GuestRegs, PSYMBOL Symbol) { } } -VOID SetValue(PGUEST_REGS_USER_MODE GuestRegs, PSYMBOL Symbol, UINT64 Value) { +VOID SetValue(PGUEST_REGS_USER_MODE GuestRegs, UINT64* g_TempList, UINT64* g_VariableList, PSYMBOL Symbol, UINT64 Value) { switch (Symbol->Type) { case SYMBOL_ID_TYPE: g_VariableList[Symbol->Value] = Value; @@ -388,7 +386,7 @@ VOID SetValue(PGUEST_REGS_USER_MODE GuestRegs, PSYMBOL Symbol, UINT64 Value) { } // -VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, +VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs,UINT64* g_TempList, UINT64* g_VariableList, PSYMBOL_BUFFER CodeBuffer, int *Indx) { PSYMBOL Operator; @@ -416,7 +414,7 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, Src0 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal0 = GetValue(GuestRegs, Src0); + SrcVal0 = GetValue(GuestRegs, g_TempList, g_VariableList, Src0); switch (Operator->Value) { case FUNC_OR: @@ -424,14 +422,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 | SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -444,14 +442,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 ^ SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -464,14 +462,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 & SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -484,14 +482,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 >> SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -504,14 +502,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 << SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -523,14 +521,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, Src1 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 + SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -542,14 +540,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, Src1 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 - SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -560,14 +558,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, Src1 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 * SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -579,14 +577,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, Src1 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 / SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -597,14 +595,14 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, Src1 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - SrcVal1 = GetValue(GuestRegs, Src1); + SrcVal1 = GetValue(GuestRegs, g_TempList, g_VariableList, Src1); Des = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; DesVal = SrcVal1 % SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -617,8 +615,8 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - DesVal = ScriptEngineKeywordPoi((PUINT64)GetValue(GuestRegs, Src0)); - SetValue(GuestRegs, Des, DesVal); + DesVal = ScriptEngineKeywordPoi((PUINT64)GetValue(GuestRegs, g_TempList, g_VariableList, Src0)); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -631,8 +629,8 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - DesVal = ScriptEngineKeywordDb((PUINT64)GetValue(GuestRegs, Src0)); - SetValue(GuestRegs, Des, DesVal); + DesVal = ScriptEngineKeywordDb((PUINT64)GetValue(GuestRegs, g_TempList, g_VariableList, Src0)); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -644,8 +642,8 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - DesVal = ScriptEngineKeywordDb((PUINT64)GetValue(GuestRegs, Src0)); - SetValue(GuestRegs, Des, DesVal); + DesVal = ScriptEngineKeywordDb((PUINT64)GetValue(GuestRegs, g_TempList, g_VariableList, Src0)); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -657,8 +655,8 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - DesVal = ScriptEngineKeywordDq((PUINT64)GetValue(GuestRegs, Src0)); - SetValue(GuestRegs, Des, DesVal); + DesVal = ScriptEngineKeywordDq((PUINT64)GetValue(GuestRegs, g_TempList, g_VariableList, Src0)); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -699,7 +697,7 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, *Indx = *Indx + 1; DesVal = ~SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -713,7 +711,7 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, *Indx = *Indx + 1; DesVal = -(INT64)SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -725,8 +723,8 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - DesVal = ScriptEngineKeywordHi((PUINT64)GetValue(GuestRegs, Src0)); - SetValue(GuestRegs, Des, DesVal); + DesVal = ScriptEngineKeywordHi((PUINT64)GetValue(GuestRegs, g_TempList, g_VariableList, Src0)); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -738,8 +736,8 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; - DesVal = ScriptEngineKeywordLow((PUINT64)GetValue(GuestRegs, Src0)); - SetValue(GuestRegs, Des, DesVal); + DesVal = ScriptEngineKeywordLow((PUINT64)GetValue(GuestRegs, g_TempList, g_VariableList, Src0)); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); #ifdef SCRIPT_ENGINE_USER_MODE printf("DesVal = %d\n", DesVal); @@ -751,7 +749,7 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, *Indx = *Indx + 1; DesVal = SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); if (Des->Type == SYMBOL_ID_TYPE) { #ifdef SCRIPT_ENGINE_USER_MODE printf("Result is %llx\n", DesVal); @@ -774,7 +772,7 @@ VOID ScriptEngineExecute(PGUEST_REGS_USER_MODE GuestRegs, *Indx = *Indx + 1; DesVal = SrcVal0; - SetValue(GuestRegs, Des, DesVal); + SetValue(GuestRegs, g_TempList, g_VariableList, Des, DesVal); if (Des->Type == SYMBOL_ID_TYPE) { #ifdef SCRIPT_ENGINE_USER_MODE printf("Result is %llx\n", DesVal); diff --git a/hyperdbg/script-engine/src/scanner.h b/hyperdbg/script-engine/scanner.h similarity index 76% rename from hyperdbg/script-engine/src/scanner.h rename to hyperdbg/script-engine/scanner.h index 9cd0531f..f10a81fb 100644 --- a/hyperdbg/script-engine/src/scanner.h +++ b/hyperdbg/script-engine/scanner.h @@ -1,17 +1,8 @@ -/** - * @file scanner.h - * @author M.H. Gholamrezei (gholamrezaei.mh@gmail.com) - * @brief Script Engine Scanner - * @details - * @version 0.1 - * @date 2020-10-22 - * - * @copyright This project is released under the GNU Public License v3. - * - */ -#ifndef SCANNER_H -#define SCANNER_H -#include +#pragma once + + +#define SYMBOL_BUFFER_INIT_SIZE 128 +#define MAX_TEMP_COUNT 32 /** * @brief maximum length of string in the token @@ -24,7 +15,7 @@ #define TOKEN_LIST_INIT_SIZE 16 /** -* @brief enumerates possible types for token +* @brief enumerates possible types for token */ typedef enum TOKEN_TYPE { @@ -58,7 +49,7 @@ struct _TOKEN /** -* @brief Pointer to _TOKEN structure +* @brief Pointer to _TOKEN structure */ typedef struct _TOKEN* TOKEN; @@ -77,16 +68,11 @@ typedef struct _TOKEN_LIST */ unsigned int InputIdx; -/** -* @ brief When this variable is '1', we wait for a ID TOKEN. otherwise, we -* will wait for keyword. It is because ID can be lvalue only. -*/ -unsigned char WaitForID; //////////////////////////////////////////////////// // TOKEN related functions // //////////////////////////////////////////////////// -TOKEN NewToken(void); +TOKEN NewToken(void); void RemoveToken(TOKEN Token); @@ -134,5 +120,4 @@ TOKEN Scan(char* str, char* c); char sgetc(char* str); - -#endif \ No newline at end of file +char IsKeyword(char* str); diff --git a/hyperdbg/script-engine/script-engine.vcxproj b/hyperdbg/script-engine/script-engine.vcxproj index 7db5526c..eadeb88c 100644 --- a/hyperdbg/script-engine/script-engine.vcxproj +++ b/hyperdbg/script-engine/script-engine.vcxproj @@ -101,9 +101,9 @@ + - diff --git a/hyperdbg/script-engine/script-engine.vcxproj.filters b/hyperdbg/script-engine/script-engine.vcxproj.filters index 1528f8f2..f64cc0b6 100644 --- a/hyperdbg/script-engine/script-engine.vcxproj.filters +++ b/hyperdbg/script-engine/script-engine.vcxproj.filters @@ -24,10 +24,10 @@ Header Files - + Header Files - + Header Files diff --git a/hyperdbg/script-engine/src/ScriptEngine.c b/hyperdbg/script-engine/src/ScriptEngine.c index ee09cd79..cb8b67bc 100644 --- a/hyperdbg/script-engine/src/ScriptEngine.c +++ b/hyperdbg/script-engine/src/ScriptEngine.c @@ -15,8 +15,6 @@ #include #include #include "ScriptEngine.h" -#include "scanner.h" -#include "parse_table.h" #include "string.h" /** @@ -60,7 +58,7 @@ PSYMBOL_BUFFER ScriptEngineParse(char *str) Push(Stack, StartToken); InputIdx = 0; - WaitForID = 0; + c = sgetc(str); diff --git a/hyperdbg/script-engine/src/ScriptEngine.h b/hyperdbg/script-engine/src/ScriptEngine.h index 02814c8d..fad239c0 100644 --- a/hyperdbg/script-engine/src/ScriptEngine.h +++ b/hyperdbg/script-engine/src/ScriptEngine.h @@ -10,20 +10,12 @@ * */ -#ifndef SCRIPT_ENGINE_H -#define SCRIPT_ENGINE_H - +#pragma once +#include "scanner.h" #include -#include "scanner.h" #include "ScriptEngineCommon.h" - //#define _SCRIPT_ENGINE_DBG_EN - - - -#define SYMBOL_BUFFER_INIT_SIZE 1024 -#define MAX_TEMP_COUNT 32 // TODO : Automate generating this array const char* OneOperandSemanticRules[] = @@ -95,5 +87,3 @@ __declspec(dllexport) PSYMBOL_BUFFER ScriptEngineParse(char* str); void CodeGen(TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, TOKEN Operator); char HasTwoOperand(TOKEN Operator); - -#endif // !SCRIPT_ENGINE_H \ No newline at end of file diff --git a/hyperdbg/script-engine/src/parse_table.h b/hyperdbg/script-engine/src/parse_table.h index e388c8ad..12f38d05 100644 --- a/hyperdbg/script-engine/src/parse_table.h +++ b/hyperdbg/script-engine/src/parse_table.h @@ -1,6 +1,4 @@ -#ifndef PARSE_TABLE_H -#define PARSE_TABLE_H -#include "scanner.h" +#pragma once #define RULES_COUNT 56 #define TERMINAL_COUNT 36 #define NONETERMINAL_COUNT 25 @@ -278,4 +276,3 @@ const int ParseTable[NONETERMINAL_COUNT][TERMINAL_COUNT]= {24 ,-1 ,24 ,24 ,24 ,-1 ,24 ,24 ,24 ,24 ,-1 ,24 ,-1 ,-1 ,24 ,24 ,-1 ,-1 ,-1 ,-1 ,24 ,24 ,24 ,-1 ,-1 ,24 ,24 ,-1 ,24 ,24 ,-1 ,24 ,24 ,-1 ,-1 ,-1 }, {-1 ,-1 ,-1 ,-1 ,-1 ,23 ,-1 ,-1 ,-1 ,-1 ,23 ,-1 ,23 ,-1 ,-1 ,-1 ,22 ,23 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,23 ,-1 ,-1 ,-1 ,-1 ,-1 ,23 ,23 ,-1 } }; -#endif diff --git a/hyperdbg/script-engine/src/scanner.c b/hyperdbg/script-engine/src/scanner.c index 75e18dc0..a366bed8 100644 --- a/hyperdbg/script-engine/src/scanner.c +++ b/hyperdbg/script-engine/src/scanner.c @@ -10,11 +10,12 @@ * */ -#include "scanner.h" + #include #include #include #include +#include "scanner.h" // TODO: automate generation of KeyWordList @@ -568,7 +569,6 @@ TOKEN GetToken(char* c, char* str) case ';': strcpy(Token->Value, ";"); Token->Type = SPECIAL_TOKEN; - WaitForID = 0; *c = sgetc(str); return Token; @@ -658,7 +658,6 @@ TOKEN GetToken(char* c, char* str) strcpy(Token->Value, ""); Token->Type = WHITE_SPACE; *c = sgetc(str); - WaitForID = 0; return Token; case '0': @@ -739,16 +738,15 @@ TOKEN GetToken(char* c, char* str) Append(Token, *c); *c = sgetc(str); } while (IsHex(*c) || *c == '`'); - int n = sizeof(KeywordList) / sizeof(char*); - for (int i = 0; i < n; i++) + if (IsKeyword(Token->Value)) { - if (!strcmp(Token->Value, KeywordList[i])) - { - Token->Type = KEYWORD; - return Token; - } + Token->Type = KEYWORD; } - Token->Type = HEX; + else + { + Token->Type = HEX; + } + return Token; } else if (IsLetter(*c) || *c == '_') @@ -759,14 +757,13 @@ TOKEN GetToken(char* c, char* str) *c = sgetc(str); } - if (WaitForID) + if (IsKeyword(Token->Value)) { - Token->Type = ID; - WaitForID = 0; + Token->Type = KEYWORD; } else { - Token->Type = KEYWORD; + Token->Type = ID; } return Token; @@ -830,4 +827,20 @@ char sgetc(char* str) { return EOF; } +} + +char IsKeyword(char* str) +{ + for (int i = 0; i < TERMINAL_COUNT; i++) + { + if (IsLetter(TerminalMap[i][0])) + { + return 1; + } + else if (TerminalMap[i][0] == '_') + { + return 1; + } + } + return 0; } \ No newline at end of file