HyperDbg/hyperdbg/script-engine/python/generator.py

275 lines
7.6 KiB
Python
Raw Permalink Normal View History

"""
* @file generator.py
* @author M.H. Gholamrezei (mh@hyperdbg.org)
* @author Sina Karvandi (sina@hyperdbg.org)
* @brief Script engine LL(1) Parse table generator
* @details This program reads grammar from Greammar.txt file
* placed in the same directory of the program
* and creates parse_table.h and parse_table.c which is
* used by the parser of script engine.
* @version 0.1
* @date 2020-10-24
*
* @copyright This project is released under the GNU Public License v3.
"""
import os
import subprocess
import sys
2021-02-25 18:44:26 +03:30
from ll1_parser import *
from lalr1_parser import *
def EnsureDeterministicHashSeed():
"""Restart the generator with stable set/dict iteration ordering."""
if os.environ.get("PYTHONHASHSEED") == "0":
return
Environment = os.environ.copy()
Environment["PYTHONHASHSEED"] = "0"
raise SystemExit(subprocess.call([sys.executable] + sys.argv, env=Environment))
2021-02-25 18:44:26 +03:30
class Generator():
def __init__(self):
2022-05-10 15:27:06 +04:30
self.SourceFile = open("..\\code\\parse-table.c", "w")
self.HeaderFile = open("..\\header\\parse-table.h", "w")
2024-07-07 22:07:45 +09:00
self.CommonHeaderFile = open("..\\..\\include\\SDK\\Headers\\ScriptEngineCommonDefinitions.h", "w")
2024-05-28 19:52:31 +09:00
self.CommonHeaderFileScala = open("..\\..\\..\\hwdbg\\src\\main\\scala\\hwdbg\\script\\script_definitions.scala", "w")
self.ll1 = LL1Parser(self.SourceFile, self.HeaderFile, self.CommonHeaderFile, self.CommonHeaderFileScala)
2021-02-25 18:44:26 +03:30
self.lalr = LALR1Parser(self.SourceFile, self.HeaderFile)
def Run(self):
self.WriteCommonHeader()
self.ll1.Run()
self.HeaderFile.write("\n\n")
self.lalr.ReadGrammar()
self.gr = get_grammar(self.lalr)
self.lalr_table = lalr_one.ParsingTable(self.gr)
self.lalr.ParseTable = self.lalr_table
self.ll1.SetLalr(self.lalr, self.lalr_table)
self.lalr.Run()
self.CommonHeaderFile.write("#endif\n")
# Closes Output Files
self.SourceFile.close()
self.HeaderFile.close()
self.CommonHeaderFile.close()
def WriteCommonHeader(self):
2024-05-28 19:52:31 +09:00
#
# Write scala headers
#
self.CommonHeaderFileScala.write("""package hwdbg.script
import chisel3._
import chisel3.util._
2024-05-28 20:31:38 +09:00
/**
* @brief
2024-06-12 19:49:25 +09:00
* The structure of HWDBG_SHORT_SYMBOL used in script engine of HyperDbg
2024-05-28 20:31:38 +09:00
*/
2024-06-12 19:49:25 +09:00
class HwdbgShortSymbol(
scriptVariableLength: Int
) extends Bundle {
//
// Ensure that the script variable length is at least 8 bits or 1 byte
//
require(
scriptVariableLength >= 8,
f"err, the minimum script variable length is 8 bits (1 byte)."
)
val Type = UInt(scriptVariableLength.W) // long long unsigned is 64 bits but it can be dynamic
2024-06-13 21:47:03 +09:00
val Value = UInt(scriptVariableLength.W) // long long unsigned is 64 bits but it can be dynamic
2024-05-28 20:31:38 +09:00
}
/**
* @brief
* Constant values for the script engine
*/
object ScriptConstants {
val SYMBOL_MEM_VALID_CHECK_MASK = 1 << 31
val INVALID = 0x80000000
val LALR_ACCEPT = 0x7fffffff
2026-07-20 15:03:45 +08:00
val SYMBOL_VALUE_KIND_INTEGER = 0
val SYMBOL_VALUE_KIND_FLOAT32 = 1
val SYMBOL_VALUE_KIND_FLOAT64 = 2
val SCRIPT_SCALAR_TYPE_INVALID = 0
val SCRIPT_SCALAR_TYPE_BOOL = 1
val SCRIPT_SCALAR_TYPE_I8 = 2
val SCRIPT_SCALAR_TYPE_I16 = 3
val SCRIPT_SCALAR_TYPE_I32 = 4
val SCRIPT_SCALAR_TYPE_I64 = 5
val SCRIPT_SCALAR_TYPE_U8 = 6
val SCRIPT_SCALAR_TYPE_U16 = 7
val SCRIPT_SCALAR_TYPE_U32 = 8
val SCRIPT_SCALAR_TYPE_U64 = 9
val SCRIPT_SCALAR_TYPE_F32 = 10
val SCRIPT_SCALAR_TYPE_F64 = 11
val SCRIPT_SCALAR_TYPE_POINTER = 12
val SCRIPT_SCALAR_TYPE_F80 = 13
}
/**
* @brief
* Constant type values for the script engine
*/
object ScriptConstantTypes {
object ScriptDataTypes extends ChiselEnum {
val symbolUndefined, symbolGlobalIdType, symbolLocalIdType, symbolNumType, symbolRegisterType, symbolPseudoRegType, symbolSemanticRuleType, symbolTempType, symbolStringType, symbolVariableCountType, symbolInvalid, symbolWstringType, symbolFunctionParameterIdType, symbolReturnAddressType, symbolFunctionParameterType, symbolStackIndexType, symbolStackBaseIndexType, symbolReturnValueType = Value
}
}
2024-05-28 19:52:31 +09:00
""")
#
# Write C/C++ headers
#
2021-02-25 18:44:26 +03:30
self.CommonHeaderFile.write(
"""#pragma once
#ifndef SCRIPT_ENGINE_COMMON_DEFINITIONS_H
#define SCRIPT_ENGINE_COMMON_DEFINITIONS_H
typedef struct SYMBOL
{
long long unsigned Type;
long long unsigned Len;
long long unsigned Value;
2024-06-12 19:49:25 +09:00
} SYMBOL, *PSYMBOL;
#define SIZE_SYMBOL_WITHOUT_LEN sizeof(long long unsigned) * 2
2024-06-12 19:49:25 +09:00
typedef struct HWDBG_SHORT_SYMBOL
{
long long unsigned Type;
long long unsigned Value;
} HWDBG_SHORT_SYMBOL, *PHWDBG_SHORT_SYMBOL;
2021-02-25 18:44:26 +03:30
typedef struct SYMBOL_BUFFER {
PSYMBOL Head;
unsigned int Pointer;
unsigned int Size;
char* Message;
2021-02-25 18:44:26 +03:30
} SYMBOL_BUFFER, * PSYMBOL_BUFFER;
2021-02-25 18:44:26 +03:30
typedef struct SYMBOL_MAP
{
char* Name;
long long unsigned Type;
} SYMBOL_MAP, * PSYMBOL_MAP;
2021-02-25 18:44:26 +03:30
typedef struct ACTION_BUFFER {
long long unsigned Tag;
long long unsigned CurrentAction;
char ImmediatelySendTheResults;
long long unsigned Context;
char CallingStage;
2021-02-25 18:44:26 +03:30
} ACTION_BUFFER, *PACTION_BUFFER;
2021-03-08 15:09:39 +03:30
2024-06-20 15:50:22 +09:00
#define SYMBOL_UNDEFINED 0
#define SYMBOL_GLOBAL_ID_TYPE 1
#define SYMBOL_LOCAL_ID_TYPE 2
#define SYMBOL_NUM_TYPE 3
#define SYMBOL_REGISTER_TYPE 4
#define SYMBOL_PSEUDO_REG_TYPE 5
#define SYMBOL_SEMANTIC_RULE_TYPE 6
#define SYMBOL_TEMP_TYPE 7
#define SYMBOL_STRING_TYPE 8
#define SYMBOL_VARIABLE_COUNT_TYPE 9
#define SYMBOL_INVALID 10
#define SYMBOL_WSTRING_TYPE 11
#define SYMBOL_FUNCTION_PARAMETER_ID_TYPE 12
#define SYMBOL_RETURN_ADDRESS_TYPE 13
2024-07-24 21:25:55 +08:00
#define SYMBOL_FUNCTION_PARAMETER_TYPE 14
#define SYMBOL_STACK_INDEX_TYPE 15
#define SYMBOL_STACK_BASE_INDEX_TYPE 16
#define SYMBOL_RETURN_VALUE_TYPE 17
2025-10-21 16:46:49 +08:00
#define SYMBOL_REFERENCE_LOCAL_ID_TYPE 18
#define SYMBOL_REFERENCE_TEMP_TYPE 19
#define SYMBOL_DEREFERENCE_LOCAL_ID_TYPE 20
#define SYMBOL_DEREFERENCE_TEMP_TYPE 21
#define SYMBOL_REFERENCE_FUNCTION_PARAMETER_TYPE 22
2026-07-20 15:03:45 +08:00
#define SYMBOL_VALUE_KIND_INTEGER 0
#define SYMBOL_VALUE_KIND_FLOAT32 1
#define SYMBOL_VALUE_KIND_FLOAT64 2
2026-07-18 22:28:45 +08:00
#define SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL 1
#define SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE 2
#define SCRIPT_SCALAR_TYPE_INVALID 0
#define SCRIPT_SCALAR_TYPE_BOOL 1
#define SCRIPT_SCALAR_TYPE_I8 2
#define SCRIPT_SCALAR_TYPE_I16 3
#define SCRIPT_SCALAR_TYPE_I32 4
#define SCRIPT_SCALAR_TYPE_I64 5
#define SCRIPT_SCALAR_TYPE_U8 6
#define SCRIPT_SCALAR_TYPE_U16 7
#define SCRIPT_SCALAR_TYPE_U32 8
#define SCRIPT_SCALAR_TYPE_U64 9
#define SCRIPT_SCALAR_TYPE_F32 10
#define SCRIPT_SCALAR_TYPE_F64 11
#define SCRIPT_SCALAR_TYPE_POINTER 12
#define SCRIPT_SCALAR_TYPE_F80 13
static const char *const SymbolTypeNames[] = {
"SYMBOL_UNDEFINED",
"SYMBOL_GLOBAL_ID_TYPE",
"SYMBOL_LOCAL_ID_TYPE",
"SYMBOL_NUM_TYPE",
"SYMBOL_REGISTER_TYPE",
"SYMBOL_PSEUDO_REG_TYPE",
"SYMBOL_SEMANTIC_RULE_TYPE",
"SYMBOL_TEMP_TYPE",
"SYMBOL_STRING_TYPE",
"SYMBOL_VARIABLE_COUNT_TYPE",
"SYMBOL_INVALID",
"SYMBOL_WSTRING_TYPE",
"SYMBOL_FUNCTION_PARAMETER_ID_TYPE",
"SYMBOL_RETURN_ADDRESS_TYPE",
"SYMBOL_FUNCTION_PARAMETER_TYPE",
"SYMBOL_STACK_INDEX_TYPE",
"SYMBOL_STACK_BASE_INDEX_TYPE",
2025-10-21 16:46:49 +08:00
"SYMBOL_RETURN_VALUE_TYPE",
"SYMBOL_REFERENCE_LOCAL_ID_TYPE",
"SYMBOL_REFERENCE_TEMP_TYPE",
"SYMBOL_DEREFERENCE_LOCAL_ID_TYPE",
"SYMBOL_DEREFERENCE_TEMP_TYPE",
"SYMBOL_REFERENCE_FUNCTION_PARAMETER_TYPE"
};
#define SYMBOL_MEM_VALID_CHECK_MASK (1 << 31)
2024-03-17 19:28:10 +09:00
#define INVALID 0x80000000
#define LALR_ACCEPT 0x7fffffff
2021-02-25 18:44:26 +03:30
\n\n""")
def Parse(self, Tokens):
Stack = self.ll1.Parse(Tokens)
print(Stack)
if __name__ == "__main__":
EnsureDeterministicHashSeed()
2021-02-25 18:44:26 +03:30
gen = Generator()
gen.Run()
2021-04-11 18:27:23 +04:30
Tokens = ['print', '(', '+', '_hex', ')', ';', '$']
2021-02-25 18:44:26 +03:30
gen.Parse(Tokens)