1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| opcode_map = { 0x01: "OP_AND", 0x02: "OP_OR", 0x03: "OP_NOT", 0x04: "OP(~)", 0x05: "OP(&)", 0x06: "OP(|)", 0x07: "OP(^)", 0x08: "OP_SHL", 0x09: "OP_SHR", 0x0A: "OP_MOD", 0x0B: "OP_INT_TO_DBL", 0x0C: "OP_STR_TO_BOOL", 0x0D: "OP_PUSH", 0x0E: "OP_POP", 0x0F: "OP_CALL", 0x10: "OP_OBJ_LOAD", 0x11: "OP_OBJ_VALUE", 0x12: "OP_OBJ_FIELD", 0x13: "OP_INDEX_ARRAY", 0x14: "OP_COUNT", 0x15: "OP_LENGTH", 0x16: "OP_FOUND", 0x17: "OP_FOUND_AT", 0x18: "OP_FOUND_IN", 0x19: "OP_OFFSET", 0x1A: "OP_OF", 0x1B: "OP_PUSH_RULE", 0x1C: "OP_INIT_RULE", 0x1D: "OP_MATCH_RULE", 0x1E: "OP_INCR_M", 0x1F: "OP_CLEAR_M", 0x20: "OP_ADD_M", 0x21: "OP_POP_M", 0x22: "OP_PUSH_M", 0x23: "OP_SET_M", 0x24: "OP_SWAPUNDEF", 0x25: "OP_FILESIZE", 0x26: "OP_ENTRYPOINT", 0x27: "OP_UNUSED", 0x28: "OP_MATCHES", 0x29: "OP_IMPORT", 0x2A: "OP_LOOKUP_DICT", 0x2B: "OP_JUNDEF", 0x2C: "OP_JUNDEF_P", 0x2D: "OP_JNUNDEF", 0x2E: "OP_JNUNDEF_P", 0x2F: "OP_JFALSE", 0x30: "OP_JFALSE_P", 0x31: "OP_JTRUE", 0x32: "OP_JTRUE_P", 0x33: "OP_JL_P", 0x34: "OP_JLE_P", 0x35: "OP_ITER_NEXT", 0x36: "OP_ITER_START_ARRAY", 0x37: "OP_ITER_START_DICT", 0x38: "OP_ITER_START_INT_RANGE", 0x39: "OP_ITER_START_INT_ENUM", 0x3A: "OP_ITER_START_STRING_SET", 0x3B: "OP_ITER_CONDITION", 0x3C: "OP_ITER_END", 0x3D: "OP_JZ", 0x3E: "OP_JZ_P", 0x3F: "OP_PUSH_8", 0x40: "OP_PUSH_16", 0x41: "OP_PUSH_32", 0x42: "OP_PUSH_U", 0x43: "OP_CONTAINS", 0x44: "OP_STARTSWITH", 0x45: "OP_ENDSWITH", 0x46: "OP_ICONTAINS", 0x47: "OP_ISTARTSWITH", 0x48: "OP_IENDSWITH", 0x49: "OP_IEQUALS", 0x4A: "OP_OF_PERCENT", 0x4B: "OP_OF_FOUND_IN", 0x4C: "OP_COUNT_IN", 0x4D: "OP_DEFINED", 0x4E: "OP_ITER_START_TEXT_STRING_SET", 0x4F: "OP_OF_FOUND_AT", 100: "OP(==)", 101: "OP(!=)", 102: "OP(<)", 103: "OP(>)", 104: "OP(<=)", 105: "OP(>=)", 106: "OP(+)", 107: "OP(-)", 108: "OP(*)", 109: "OP(/)", 110: "OP_INT_MINUS", 120: "OP_DBL_EQ", 121: "OP_DBL_NEQ", 122: "OP_DBL_LT", 123: "OP_DBL_GT", 124: "OP_DBL_LE", 125: "OP_DBL_GE", 126: "OP_DBL_ADD", 127: "OP_DBL_SUB", 128: "OP_DBL_MUL", 129: "OP_DBL_DIV", 130: "OP_DBL_MINUS", 140: "OP_STR_EQ", 141: "OP_STR_NEQ", 142: "OP_STR_LT", 143: "OP_STR_GT", 144: "OP_STR_LE", 145: "OP_STR_GE", 240: "OP_INT8", 241: "OP_INT16", 242: "OP_INT32", 243: "OP_UINT8", 244: "OP_UINT16", 245: "OP_UINT32", 246: "OP_INT8BE", 247: "OP_INT16BE", 248: "OP_INT32BE", 249: "OP_UINT8BE", 250: "OP_UINT16BE", 251: "OP_UINT32BE", }
opcode_name_map = {v: k for k, v in opcode_map.items()}
def disassemble_yara_bytecode(bytecode: bytes): print("Off | Opcode / Data") print("-----|-----------------------------")
i = 0 while i < len(bytecode): byte = bytecode[i]
if byte == 0x00: i += 1 continue
if byte == 0x3F: if i + 2 < len(bytecode): value = bytecode[i + 1] addr = bytecode[i + 2] print(f"{i:04d} | OP_PUSH_8 (value: 0x{value:02X})") i += 2 else: print(f"{i:04d} | OP_PUSH_8 (ERROR: Not enough bytes for parameters)") i += 1 else: name = opcode_map.get(byte, f"UNKNOWN (0x{byte:02X})") print(f"{i:04d} | {name}") i += 1
example_bytecode = bytearray.fromhex("2805000000000000253f2a692f120500003f011f00000000000000001f01000000000000002102000000000000003f00253f2a6b383521030000000000000032c10400002203000000000000003f006af33f803f006a073fe6642f1c0000002203000000000000003f016af33f803f016a073fed64012f1c0000002203000000000000003f026af33f803f026a073fe364012f1c0000002203000000000000003f036af33f803f036a073fe464012f1c0000002203000000000000003f046af33f803f046a073fff64012f1c0000002203000000000000003f056af33f803f056a073fe664012f1c0000002203000000000000003f066af33f803f066a073fe464012f1c0000002203000000000000003f076af33f803f076a073fbe64012f1c0000002203000000000000003f086af33f803f086a073fba64012f1c0000002203000000000000003f096af33f803f096a073fbd64012f1c0000002203000000000000003f0a6af33f803f0a6a073fbb64012f1c0000002203000000000000003f0b6af33f803f0b6a073fb864012f1c0000002203000000000000003f0c6af33f803f0c6a073fbf64012f1c0000002203000000000000003f0d6af33f803f0d6a073fa064012f1c0000002203000000000000003f0e6af33f803f0e6a073fba64012f1c0000002203000000000000003f0f6af33f803f0f6a073fed64012f1c0000002203000000000000003f106af33f803f106a073fa264012f1c0000002203000000000000003f116af33f803f116a073fa664012f1c0000002203000000000000003f126af33f803f126a073fbf64012f1c0000002203000000000000003f136af33f803f136a073fa764012f1c0000002203000000000000003f146af33f803f146a073fac64012f1c0000002203000000000000003f156af33f803f156a073fa364012f1c0000002203000000000000003f166af33f803f166a073fa064012f1c0000002203000000000000003f176af33f803f176a073fba64012f1c0000002203000000000000003f186af33f803f186a073ff964012f1c0000002203000000000000003f196af33f803f196a073faf64012f1c0000002203000000000000003f1a6af33f803f1a6a073fa364012f1c0000002203000000000000003f1b6af33f803f1b6a073faf64012f1c0000002203000000000000003f1c6af33f803f1c6a073fb164012f1c0000002203000000000000003f1d6af33f803f1d6a073faa64012f1c0000002203000000000000003f1e6af33f803f1e6a073ffb64012f1c0000002203000000000000003f1f6af33f803f1f6a073fac64012f1c0000002203000000000000003f206af33f803f206a073fc564012f1c0000002203000000000000003f216af33f803f216a073f9064012f1c0000002203000000000000003f226af33f803f226a073fc364012f1c0000002203000000000000003f236af33f803f236a073fc264012f1c0000002203000000000000003f246af33f803f246a073fc264012f1c0000002203000000000000003f256af33f803f256a073f9c64012f1c0000002203000000000000003f266af33f803f266a073fc264012f1c0000002203000000000000003f276af33f803f276a073fc364012f1c0000002203000000000000003f286af33f803f286a073f9964012f1c0000002203000000000000003f296af33f803f296a073fd464011e01000000000000002200000000000000002202000000000000003b200000000000000000323afbffff0e2201000000000000002200000000000000002202000000000000003c011d0000000000000000ff") disassemble_yara_bytecode(example_bytecode)
|