from enum import Enum SectionID = { 0: "custom", 1: "type", 2: "import", 3: "function", 4: "table", 5: "memory", 6: "global", 7: "export", 8: "start", 9: "element", 10: "code", 11: "data", 63: "unknown", } class RelocType(Enum): R_WEBASSEMBLY_FUNCTION_INDEX_LEB = 0 R_WEBASSEMBLY_TABLE_INDEX_SLEB = 1 R_WEBASSEMBLY_TABLE_INDEX_I32 = 2 R_WEBASSEMBLY_MEMORY_ADDR_LEB = 3 R_WEBASSEMBLY_MEMORY_ADDR_SLEB = 4 R_WEBASSEMBLY_MEMORY_ADDR_I32 = 5 R_WEBASSEMBLY_TYPE_INDEX_LEB = 6 R_WEBASSEMBLY_GLOBAL_INDEX_LEB = 7 R_WEBASSEMPLY_FUNCTION_OFFSET_I32 = 8 R_WEBASSEMBLY_SECTION_OFFSET_I32 = 9 class LinkingSubsection(Enum): WASM_SEGMENT_INFO = 5 WASM_INIT_FUNCS = 6 WASM_COMDAT_INFO = 7 WASM_SYMBOL_TABLE = 8 class TypeType(Enum): none = 1 lebu = 2 lebs = 3 flot = 4 dobl = 5 class Syminfo_Kind: SYMTAB_FUNCTION = 0 SYMTAB_DATA = 1 SYMTAB_GLOBAL = 2 SYMTAB_SECTION = 3 TypeKS = [ ["uint8", 8, TypeType.none], ["uint16", 16, TypeType.none], ["uint32", 32, TypeType.none], ["uint64", 64, TypeType.none], ["varuint1", 1, TypeType.lebu], ["varuint7", 7, TypeType.lebu], ["varuint32", 32, TypeType.lebu], ["varuint64", 64, TypeType.lebu], ["varint1", 1, TypeType.lebs], ["varint7", 7, TypeType.lebs], ["varint32", 32, TypeType.lebs], ["varint64", 64, TypeType.lebs], ] TypeDic = { "uint8": 1, "uint16": 2, "uint32": 4, "uint64": 8, "varuint1": 1, "varuint7": 1, "varuint32": 4, "varuint64": 8, "varint1": 1, "varint7": 1, "varint32": 4, "varint64": 8, } # holds the version 1.0 wasm opcodes and immediates class WASM_OP_Code: version_number = 0x01 magic_number = 0x6D736100 PAGE_SIZE = 65536 uint8 = 1 uint16 = 2 uint32 = 4 uint64 = 8 varuint1 = 1 varuint7 = 1 varuint32 = 4 varuint64 = 8 varint1 = 1 varint7 = 1 varint32 = 4 varint64 = 8 floatt = 4 doublet = 8 all_ops = [ ("i32", "7f", False), ("i64", "7e", False), ("f32", "7d", False), ("f64", "7c", False), ("anyfunc", "7b", False), ("func", "60", False), ("empty_block_type", "40", False), ("unreachable", "00", False), ("nop", "01", False), ("block", "02", True, ("varuint7")), ("loop", "03", True, ("varuint7")), ("if", "04", True, ("varuint7")), ("else", "05", False), ("end", "0b", False), ("br", "0c", True, ("varuint32")), ("br_if", "0d", True, ("varuint32")), ("br_table", "0e", True, ("varuint32", "varuint32", "varuint32")), ("return", "0f", False), ("call", "10", True, ("varuint32")), ("call_indirect", "11", True, ("varuint32", "varuint1")), ("drop", "1a", False), ("select", "1b", False), ("get_local", "20", True, ("varuint32")), ("set_local", "21", True, ("varuint32")), ("tee_local", "22", True, ("varuint32")), ("get_global", "23", True, ("varuint32")), ("set_global", "24", True, ("varuint32")), ("i32.load", "28", True, ("varuint32", "varuint32")), ("i64.load", "29", True, ("varuint32", "varuint32")), ("f32.load", "2a", True, ("varuint32", "varuint32")), ("f64.load", "2b", True, ("varuint32", "varuint32")), ("i32.load8_s", "2c", True, ("varuint32", "varuint32")), ("i32.load8_u", "2d", True, ("varuint32", "varuint32")), ("i32.load16_s", "2e", True, ("varuint32", "varuint32")), ("i32.load16_u", "2f", True, ("varuint32", "varuint32")), ("i64.load8_s", "30", True, ("varuint32", "varuint32")), ("i64.load8_u", "31", True, ("varuint32", "varuint32")), ("i64.load16_s", "32", True, ("varuint32", "varuint32")), ("i64.load16_u", "33", True, ("varuint32", "varuint32")), ("i64.load32_s", "34", True, ("varuint32", "varuint32")), ("i64.load32_u", "35", True, ("varuint32", "varuint32")), ("i32.store", "36", True, ("varuint32", "varuint32")), ("i64.store", "37", True, ("varuint32", "varuint32")), ("f32.store", "38", True, ("varuint32", "varuint32")), ("f64.store", "39", True, ("varuint32", "varuint32")), ("i32.store8", "3a", True, ("varuint32", "varuint32")), ("i32.store16", "3b", True, ("varuint32", "varuint32")), ("i64.store8", "3c", True, ("varuint32", "varuint32")), ("i64.store16", "3d", True, ("varuint32", "varuint32")), ("i64.store32", "3e", True, ("varuint32", "varuint32")), ("current_memory", "3f", True, ("varuint1")), ("grow_memory", "40", True, ("varuint1")), ("i32.const", "41", True, ("varint32")), ("i64.const", "42", True, ("varint64")), ("f32.const", "43", True, ("uint32")), ("f64.const", "44", True, ("uint64")), ("i32.eqz", "45", False), ("i32.eq", "46", False), ("i32.ne", "47", False), ("i32.lt_s", "48", False), ("i32.lt_u", "49", False), ("i32.gt_s", "4a", False), ("i32.gt_u", "4b", False), ("i32.le_s", "4c", False), ("i32.le_u", "4d", False), ("i32.ge_s", "4e", False), ("i32.ge_u", "4f", False), ("i64.eqz", "50", False), ("i64.eq", "51", False), ("i64.ne", "52", False), ("i64.lt_s", "53", False), ("i64.lt_u", "54", False), ("i64.gt_s", "55", False), ("i64.gt_u", "56", False), ("i64.le_s", "57", False), ("i64.le_u", "58", False), ("i64.ge_s", "59", False), ("i64.ge_u", "5a", False), ("f32.eq", "5b", False), ("f32.ne", "5c", False), ("f32.lt", "5d", False), ("f32.gt", "5e", False), ("f32.le", "5f", False), ("f32.ge", "60", False), ("f64.eq", "61", False), ("f64.ne", "62", False), ("f64.lt", "63", False), ("f64.gt", "64", False), ("f64.le", "65", False), ("f64.ge", "66", False), ("i32.clz", "67", False), ("i32.ctz", "68", False), ("i32.popcnt", "69", False), ("i32.add", "6a", False), ("i32.sub", "6b", False), ("i32.mul", "6c", False), ("i32.div_s", "6d", False), ("i32.div_u", "6e", False), ("i32.rem_s", "6f", False), ("i32.rem_u", "70", False), ("i32.and", "71", False), ("i32.or", "72", False), ("i32.xor", "73", False), ("i32.shl", "74", False), ("i32.shr_s", "75", False), ("i32.shr_u", "76", False), ("i32.rotl", "77", False), ("i32.rotr", "78", False), ("i64.clz", "79", False), ("i64.ctz", "7a", False), ("i64.popcnt", "7b", False), ("i64.add", "7c", False), ("i64.sub", "7d", False), ("i64.mul", "7e", False), ("i64.div_s", "7f", False), ("i64.div_u", "80", False), ("i64.rem_s", "81", False), ("i64.rem_u", "82", False), ("i64.and", "83", False), ("i64.or", "84", False), ("i64.xor", "85", False), ("i64.shl", "86", False), ("i64.shr_s", "87", False), ("i64.shr_u", "88", False), ("i64.rotl", "89", False), ("i63.rotr", "8a", False), ("f32.abs", "8b", False), ("f32.neg", "8c", False), ("f32.ceil", "8d", False), ("f32.floor", "8e", False), ("f32.trunc", "8f", False), ("f32.nearest", "90", False), ("f32.sqrt", "91", False), ("f32.add", "92", False), ("f32.sub", "93", False), ("f32.mul", "94", False), ("f32.div", "95", False), ("f32.min", "96", False), ("f32.max", "97", False), ("f32.copysign", "98", False), ("f64.abs", "99", False), ("f64.neg", "9a", False), ("f64.ceil", "9b", False), ("f64.floor", "9c", False), ("f64.trunc", "9d", False), ("f64.nearest", "9e", False), ("f64.sqrt", "9f", False), ("f64.add", "a0", False), ("f64.sub", "a1", False), ("f64.mul", "a2", False), ("f64.div", "a3", False), ("f64.min", "a4", False), ("f64.max", "a5", False), ("f64.copysign", "a6", False), ("i32.wrap/i64", "a7", False), ("i32.trunc_s/f32", "a8", False), ("i32.trunc_u/f32", "a9", False), ("i32.trunc_s/f64", "aa", False), ("i32.trunc_u/f64", "ab", False), ("i64.extend_s/i32", "ac", False), ("i64.extend_u/i32", "ad", False), ("i64.trunc_s/f32", "ae", False), ("i64.trunc_u/f32", "af", False), ("i64.trunc_s/f64", "b0", False), ("i64.trunc_u/f64", "b1", False), ("f32.convert_s/i32", "b2", False), ("f32.convert_u/i32", "b3", False), ("f32.convert_s/i64", "b4", False), ("f32.convert_u/i64", "b5", False), ("f32.demote/f64", "b6", False), ("f64.convert_s/i32", "b7", False), ("f64.convert_u/i32", "b8", False), ("f64.convert_s/i64", "b9", False), ("f64.convert_u/i64", "ba", False), ("f64.promote/f32", "bb", False), ("i32.reinterpret/f32", "bc", False), ("i64.reinterpret/f64", "bd", False), ("f32.reinterpret/i32", "be", False), ("f64.reinterpret/i64", "bf", False), ] type_ops = [ ("i32", "7f"), ("i64", "7e"), ("f32", "7d"), ("f64", "7c"), ("anyfunc", "7b"), ("func", "60"), ("empty_block_type", "40"), ] type_ops_dict = dict(type_ops) type_ops_dict_rev = {v: k for k, v in type_ops_dict.items()} control_flow_ops = [ ("unreachable", "00"), ("nop", "01"), ("block", "02"), ("loop", "03"), ("if", "04"), ("else", "05"), ("end", "0b"), ("br", "0c"), ("br_if", "0d"), ("br_table", "0e"), ("return", "0f"), ] control_flow_ops_dict = dict(control_flow_ops) control_flow_ops_dict_rev = { v: k for k, v in control_flow_ops_dict.items() } call_ops = [("call", "10"), ("call_indirect", "11")] call_ops_dict = dict(call_ops) call_ops_dict_rev = {v: k for k, v in call_ops_dict.items()} param_ops = [("drop", "1a"), ("select", "1b")] param_ops_dict = dict(param_ops) param_ops_dict_rev = {v: k for k, v in param_ops_dict.items()} var_access = [ ("get_local", "20"), ("set_local", "21"), ("tee_local", "22"), ("get_global", "23"), ("set_global", "24"), ] var_access_dict = dict(var_access) var_access_dict_rev = {v: k for k, v in var_access_dict.items()} mem_ops = [ ("i32.load", "28"), ("i64.load", "29"), ("f32.load", "2a"), ("f64.load", "2b"), ("i32.load8_s", "2c"), ("i32.load8_u", "2d"), ("i32.load16_s", "2e"), ("i32.load16_u", "2f"), ("i64.load8_s", "30"), ("i64.load8_u", "31"), ("i64.load16_s", "32"), ("i64.load16_u", "33"), ("i64.load32_s", "34"), ("i64.load32_u", "35"), ("i32.store", "36"), ("i64.store", "37"), ("f32.store", "38"), ("f64.store", "39"), ("i32.store8", "3a"), ("i32.store16", "3b"), ("i64.store8", "3c"), ("i64.store16", "3d"), ("i64.store32", "3e"), ("current_memory", "3f"), ("grow_memory", "40"), ] mem_ops_dict = dict(mem_ops) mem_ops_dict_rev = {v: k for k, v in mem_ops_dict.items()} consts = [ ("i32.const", "41"), ("i64.const", "42"), ("f32.const", "43"), ("f64", "44"), ] consts_dict = dict(consts) consts_dict_rev = {v: k for k, v in consts_dict.items()} comp_ops = [ ("i32.eqz", "45"), ("i32.eq", "46"), ("i32.ne", "47"), ("i32.lt_s", "48"), ("i32.lt_u", "49"), ("i32.gt_s", "4a"), ("i32.gt_u", "4b"), ("i32.le_s", "4c"), ("i32.le_u", "4d"), ("i32.ge_s", "4e"), ("i32.ge_u", "4f"), ("i64.eqz", "50"), ("i64.eq", "51"), ("i64.ne", "52"), ("i64.lt_s", "53"), ("i64.lt_u", "54"), ("i64.gt_s", "55"), ("i64.gt_u", "56"), ("i64.le_s", "57"), ("i64.le_u", "58"), ("i64.ge_s", "59"), ("i64.ge_u", "5a"), ("f32.eq", "5b"), ("f32.ne", "5c"), ("f32.lt", "5d"), ("f32.gt", "5e"), ("f32.le", "5f"), ("f32.ge", "60"), ("f64.eq", "61"), ("f64.ne", "62"), ("f64.lt", "63"), ("f64.gt", "64"), ("f64.le", "65"), ("f64.ge", "66"), ] comp_ops_dict = dict(comp_ops) comp_ops_dict_rev = {v: k for k, v in comp_ops_dict.items()} num_ops = [ ("i32.clz", "67"), ("i32.ctz", "68"), ("i32.popcnt", "69"), ("i32.add", "6a"), ("i32.sub", "6b"), ("i32.mul", "6c"), ("i32.div_s", "6d"), ("i32.div_u", "6e"), ("i32.rem_s", "6e"), ("i32.rem_u", "70"), ("i32.and", "71"), ("i32.or", "72"), ("i32.xor", "73"), ("i32.shl", "74"), ("i32.shr_s", "75"), ("i32.shr_u", "76"), ("i32.rotl", "77"), ("i32.rotr", "78"), ("i64.clz", "79"), ("i64.ctz", "7a"), ("i64.popcnt", "7b"), ("i64.add", "7c"), ("i64.sub", "7d"), ("i64.mul", "7e"), ("i64.div_s", "7f"), ("i64.div_u", "80"), ("i64.rem_s", "81"), ("i64.rem_u", "82"), ("i64.and", "83"), ("i64.or", "84"), ("i64.xor", "85"), ("i64.shl", "86"), ("i64.shr_s", "87"), ("i64.shr_u", "88"), ("i64.rotl", "89"), ("i63.rotr", "8a"), ("f32.abs", "8b"), ("f32.neg", "8c"), ("f32.ceil", "8d"), ("f32.floor", "8e"), ("f32.trunc", "8f"), ("f32.nearest", "90"), ("f32.sqrt", "91"), ("f32.add", "92"), ("f32.sub", "93"), ("f32.mul", "94"), ("f32.div", "95"), ("f32.min", "96"), ("f32.max", "97"), ("f32.copysign", "98"), ("f64.abs", "99"), ("f64.neg", "9a"), ("f64.ceil", "9b"), ("f64.floor", "9c"), ("f64.trunc", "9d"), ("f64.nearest", "9e"), ("f64.sqrt", "9f"), ("f64.add", "a0"), ("f64.sub", "a1"), ("f64.mul", "a2"), ("f64.div", "a3"), ("f64.min", "a4"), ("f64.max", "a5"), ("f64.copysign", "a6"), ] num_ops_dict = dict(num_ops) num_ops_dict_rev = {v: k for k, v in num_ops_dict.items()} conversion = [ ("i32.wrap/i64", "a7"), ("i32.trunc_s/f32", "a8"), ("i32.trunc_u/f32", "a9"), ("i32.trunc_s/f64", "aa"), ("i32.trunc_u/f64", "ab"), ("i64.extend_s/i32", "ac"), ("i64.extend_u/i32", "ad"), ("i64.trunc_s/f32", "ae"), ("i64.trunc_u/f32", "af"), ("i64.trunc_s/f64", "b0"), ("i64.trunc_u/f64", "b1"), ("f32.convert_s/i32", "b2"), ("f32.convert_u/i32", "b3"), ("f32.convert_s/i64", "b4"), ("f32.convert_u/i64", "b5"), ("f32.demote/f64", "b6"), ("f64.convert_s/i32", "b7"), ("f64.convert_u/i32", "b8"), ("f64.convert_s/i64", "b9"), ("f64.convert_u/i64", "ba"), ("f64.promote/f32", "bb"), ] conversion_dict = dict(conversion) conversion_dict_rev = {v: k for k, v in conversion_dict.items()} reinterpretations = [ ("i32.reinterpret/f32", "bc"), ("i64.reinterpret/f64", "bd"), ("f32.reinterpret/i32", "be"), ("f64.reinterpret/i64", "bf"), ] reinterpretations_dict = dict(reinterpretations) reinterpretations_dict_rev = { v: k for k, v in reinterpretations_dict.items() } section_code = [ ("type", "01"), ("import", "02"), ("function", "03"), ("table", "04"), ("memory", "05"), ("global", "06"), ("export", "07"), ("start", "08"), ("element", "09"), ("code", "0a"), ("data", "0b"), ("custom", "00"), ] section_code_dict = dict(section_code) section_code_dict_rev = {v: k for k, v in section_code_dict.items()}