From fa4db5c6c2fd8bf627a52d560d86a6b3610e5833 Mon Sep 17 00:00:00 2001 From: mappzor <34216645+mappzor@users.noreply.github.com> Date: Wed, 30 Oct 2024 09:36:06 +0100 Subject: [PATCH] Fixed MVEX tests (#529) --- src/SharedData.c | 4 +- tests/cases/default_038.in | 2 +- tests/cases/default_039.in | 2 +- tests/cases/default_040.in | 2 +- tests/cases/default_041.in | 2 +- tests/cases/default_042.in | 2 +- tests/cases/default_043.in | 2 +- tests/cases/jmp_far_16.in | 2 +- tests/cases/jmp_far_32.in | 2 +- tests/cases/mvex_000.in | 2 +- tests/cases/mvex_001.in | 2 +- tests/cases/mvex_002.in | 2 +- tests/cases/mvex_003.in | 2 +- tests/cases/mvex_004.in | 2 +- tests/cases/mvex_005.in | 2 +- tests/cases/mvex_006.in | 2 +- tests/cases/mvex_007.in | 2 +- tests/cases/mvex_008.in | 2 +- tests/cases/mvex_009.in | 2 +- tests/cases/mvex_010.in | 2 +- tests/cases/mvex_011.in | 2 +- tests/cases/mvex_012.in | 2 +- tests/cases/mvex_013.in | 2 +- tests/cases/mvex_014.in | 2 +- tests/cases/mvex_015.in | 2 +- tests/cases/mvex_016.in | 2 +- tests/cases/mvex_017.in | 2 +- tests/cases/mvex_018.in | 2 +- tests/cases/mvex_019.in | 2 +- tests/cases/mvex_020.in | 2 +- tests/cases/mvex_021.in | 2 +- tests/cases/mvex_022.in | 2 +- tests/cases/mvex_023.in | 2 +- tests/cases/mvex_024.in | 2 +- tests/cases/mvex_025.in | 2 +- tests/cases/mvex_026.in | 2 +- tests/cases/vexc4_025.in | 2 +- tests/cases/vexc4_026.in | 2 +- tests/cases/vexc4_027.in | 2 +- tests/crash_tool.py | 12 +- tests/enc_test_cases.json | 208 ++++++++++++++++++++++++++--------- tests/re_enc_test_cases.json | 12 +- tests/zydis_encoder_types.py | 197 +++++++++++++++++++++++++++++++++ tools/ZydisFuzzEncoder.c | 41 +++---- tools/ZydisFuzzReEncoding.c | 9 ++ tools/ZydisInfo.c | 92 +++++++++------- 46 files changed, 487 insertions(+), 164 deletions(-) diff --git a/src/SharedData.c b/src/SharedData.c index a6242391..b1dda87c 100644 --- a/src/SharedData.c +++ b/src/SharedData.c @@ -133,7 +133,7 @@ void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* typ { ZydisElementType type; ZydisElementSize size; - } lookup[ZYDIS_IELEMENT_TYPE_MAX_VALUE + 1] = + } lookup[] = { { ZYDIS_ELEMENT_TYPE_INVALID , 0 }, { ZYDIS_ELEMENT_TYPE_INVALID , 0 }, @@ -166,7 +166,7 @@ void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* typ { ZYDIS_ELEMENT_TYPE_CC , 3 }, { ZYDIS_ELEMENT_TYPE_CC , 5 } }; - + ZYAN_STATIC_ASSERT(ZYAN_ARRAY_LENGTH(lookup) == ZYDIS_IELEMENT_TYPE_MAX_VALUE + 1); ZYAN_ASSERT((ZyanUSize)element < ZYAN_ARRAY_LENGTH(lookup)); *type = lookup[element].type; diff --git a/tests/cases/default_038.in b/tests/cases/default_038.in index 943ac135..7146f104 100644 --- a/tests/cases/default_038.in +++ b/tests/cases/default_038.in @@ -1 +1 @@ --64 3eff10 +-64 3eff10 \ No newline at end of file diff --git a/tests/cases/default_039.in b/tests/cases/default_039.in index 93722419..b6d9b9c9 100644 --- a/tests/cases/default_039.in +++ b/tests/cases/default_039.in @@ -1 +1 @@ --64 3e2eff10 +-64 3e2eff10 \ No newline at end of file diff --git a/tests/cases/default_040.in b/tests/cases/default_040.in index fe7f9be5..48fd1a96 100644 --- a/tests/cases/default_040.in +++ b/tests/cases/default_040.in @@ -1 +1 @@ --64 2e3eff10 +-64 2e3eff10 \ No newline at end of file diff --git a/tests/cases/default_041.in b/tests/cases/default_041.in index 2ea166d5..64584504 100644 --- a/tests/cases/default_041.in +++ b/tests/cases/default_041.in @@ -1 +1 @@ --32 3eff10 +-32 3eff10 \ No newline at end of file diff --git a/tests/cases/default_042.in b/tests/cases/default_042.in index fc9d2a88..7a662e34 100644 --- a/tests/cases/default_042.in +++ b/tests/cases/default_042.in @@ -1 +1 @@ --32 3e2eff10 +-32 3e2eff10 \ No newline at end of file diff --git a/tests/cases/default_043.in b/tests/cases/default_043.in index 0840d10a..c45c9aac 100644 --- a/tests/cases/default_043.in +++ b/tests/cases/default_043.in @@ -1 +1 @@ --32 2e3eff10 +-32 2e3eff10 \ No newline at end of file diff --git a/tests/cases/jmp_far_16.in b/tests/cases/jmp_far_16.in index 71501e0b..c39589f6 100644 --- a/tests/cases/jmp_far_16.in +++ b/tests/cases/jmp_far_16.in @@ -1 +1 @@ --32 669AADE44E6D +-32 669AADE44E6D \ No newline at end of file diff --git a/tests/cases/jmp_far_32.in b/tests/cases/jmp_far_32.in index a98b2bc4..2b814826 100644 --- a/tests/cases/jmp_far_32.in +++ b/tests/cases/jmp_far_32.in @@ -1 +1 @@ --32 9AADEADDE44E6D +-32 9AADEADDE44E6D \ No newline at end of file diff --git a/tests/cases/mvex_000.in b/tests/cases/mvex_000.in index 844cf70f..ffb430e7 100644 --- a/tests/cases/mvex_000.in +++ b/tests/cases/mvex_000.in @@ -1 +1 @@ --64 627271ac45cf \ No newline at end of file +-knc -64 627271ac45cf \ No newline at end of file diff --git a/tests/cases/mvex_001.in b/tests/cases/mvex_001.in index ea9fdc57..3fe13b2c 100644 --- a/tests/cases/mvex_001.in +++ b/tests/cases/mvex_001.in @@ -1 +1 @@ --64 62c2e9159a19 \ No newline at end of file +-knc -64 62c2e9159a19 \ No newline at end of file diff --git a/tests/cases/mvex_002.in b/tests/cases/mvex_002.in index 54f67921..ddd8f918 100644 --- a/tests/cases/mvex_002.in +++ b/tests/cases/mvex_002.in @@ -1 +1 @@ --64 6262191eb530 \ No newline at end of file +-knc -64 6262191eb530 \ No newline at end of file diff --git a/tests/cases/mvex_003.in b/tests/cases/mvex_003.in index 0d454d99..24d21ee1 100644 --- a/tests/cases/mvex_003.in +++ b/tests/cases/mvex_003.in @@ -1 +1 @@ --64 6251680c59f4 \ No newline at end of file +-knc -64 6251680c59f4 \ No newline at end of file diff --git a/tests/cases/mvex_004.in b/tests/cases/mvex_004.in index 0f3efad7..c3d7f92b 100644 --- a/tests/cases/mvex_004.in +++ b/tests/cases/mvex_004.in @@ -1 +1 @@ --64 6202719d9a528f \ No newline at end of file +-knc -64 6202719d9a528f \ No newline at end of file diff --git a/tests/cases/mvex_005.in b/tests/cases/mvex_005.in index 546808be..97b09279 100644 --- a/tests/cases/mvex_005.in +++ b/tests/cases/mvex_005.in @@ -1 +1 @@ --64 62a149fadb8ce932280891 \ No newline at end of file +-knc -64 62a149fadb8ce932280891 \ No newline at end of file diff --git a/tests/cases/mvex_006.in b/tests/cases/mvex_006.in index b910b39f..6217836f 100644 --- a/tests/cases/mvex_006.in +++ b/tests/cases/mvex_006.in @@ -1 +1 @@ --64 6272891fbcf5 \ No newline at end of file +-knc -64 6272891fbcf5 \ No newline at end of file diff --git a/tests/cases/mvex_007.in b/tests/cases/mvex_007.in index 68455db4..10991b6f 100644 --- a/tests/cases/mvex_007.in +++ b/tests/cases/mvex_007.in @@ -1 +1 @@ --64 620241c46530 \ No newline at end of file +-knc -64 620241c46530 \ No newline at end of file diff --git a/tests/cases/mvex_008.in b/tests/cases/mvex_008.in index ea4f6d48..5deae69e 100644 --- a/tests/cases/mvex_008.in +++ b/tests/cases/mvex_008.in @@ -1 +1 @@ --64 6222794b3f56a7 \ No newline at end of file +-knc -64 6222794b3f56a7 \ No newline at end of file diff --git a/tests/cases/mvex_009.in b/tests/cases/mvex_009.in index 2efe8bb7..16600bae 100644 --- a/tests/cases/mvex_009.in +++ b/tests/cases/mvex_009.in @@ -1 +1 @@ --64 6272593eae37 \ No newline at end of file +-knc -64 6272593eae37 \ No newline at end of file diff --git a/tests/cases/mvex_010.in b/tests/cases/mvex_010.in index a31dda82..2b84cf37 100644 --- a/tests/cases/mvex_010.in +++ b/tests/cases/mvex_010.in @@ -1 +1 @@ --64 62e16126fa457b \ No newline at end of file +-knc -64 62e16126fa457b \ No newline at end of file diff --git a/tests/cases/mvex_011.in b/tests/cases/mvex_011.in index 3d2548aa..2b50ff9b 100644 --- a/tests/cases/mvex_011.in +++ b/tests/cases/mvex_011.in @@ -1 +1 @@ --64 6202b120526c83be \ No newline at end of file +-knc -64 6202b120526c83be \ No newline at end of file diff --git a/tests/cases/mvex_012.in b/tests/cases/mvex_012.in index f060ba49..b2e01819 100644 --- a/tests/cases/mvex_012.in +++ b/tests/cases/mvex_012.in @@ -1 +1 @@ --64 6202013ecc7ec5 \ No newline at end of file +-knc -64 6202013ecc7ec5 \ No newline at end of file diff --git a/tests/cases/mvex_013.in b/tests/cases/mvex_013.in index 9e829304..598104b8 100644 --- a/tests/cases/mvex_013.in +++ b/tests/cases/mvex_013.in @@ -1 +1 @@ --64 62c2392d3b83c176fcab \ No newline at end of file +-knc -64 62c2392d3b83c176fcab \ No newline at end of file diff --git a/tests/cases/mvex_014.in b/tests/cases/mvex_014.in index dcebcd92..92a55a42 100644 --- a/tests/cases/mvex_014.in +++ b/tests/cases/mvex_014.in @@ -1 +1 @@ --64 62d261b2b5fe \ No newline at end of file +-knc -64 62d261b2b5fe \ No newline at end of file diff --git a/tests/cases/mvex_015.in b/tests/cases/mvex_015.in index 6eb273c5..56ce1419 100644 --- a/tests/cases/mvex_015.in +++ b/tests/cases/mvex_015.in @@ -1 +1 @@ --64 625201719ae0 \ No newline at end of file +-knc -64 625201719ae0 \ No newline at end of file diff --git a/tests/cases/mvex_016.in b/tests/cases/mvex_016.in index e4af6407..f82c7182 100644 --- a/tests/cases/mvex_016.in +++ b/tests/cases/mvex_016.in @@ -1 +1 @@ --64 629168cfc2a34446843069 \ No newline at end of file +-knc -64 629168cfc2a34446843069 \ No newline at end of file diff --git a/tests/cases/mvex_017.in b/tests/cases/mvex_017.in index be3249de..5dfa5f56 100644 --- a/tests/cases/mvex_017.in +++ b/tests/cases/mvex_017.in @@ -1 +1 @@ --64 62f2f12dbe6f9e \ No newline at end of file +-knc -64 62f2f12dbe6f9e \ No newline at end of file diff --git a/tests/cases/mvex_018.in b/tests/cases/mvex_018.in index d1e85124..ab1127a7 100644 --- a/tests/cases/mvex_018.in +++ b/tests/cases/mvex_018.in @@ -1 +1 @@ --64 43656212414dcc14e0 \ No newline at end of file +-knc -64 43656212414dcc14e0 \ No newline at end of file diff --git a/tests/cases/mvex_019.in b/tests/cases/mvex_019.in index 5df08824..dc8de77a 100644 --- a/tests/cases/mvex_019.in +++ b/tests/cases/mvex_019.in @@ -1 +1 @@ --64 62d261b2b4f8 \ No newline at end of file +-knc -64 62d261b2b4f8 \ No newline at end of file diff --git a/tests/cases/mvex_020.in b/tests/cases/mvex_020.in index edcb7852..23bd37a4 100644 --- a/tests/cases/mvex_020.in +++ b/tests/cases/mvex_020.in @@ -1 +1 @@ --64 6262c1a1b880716ff709 \ No newline at end of file +-knc -64 6262c1a1b880716ff709 \ No newline at end of file diff --git a/tests/cases/mvex_021.in b/tests/cases/mvex_021.in index f09316eb..b1b6f123 100644 --- a/tests/cases/mvex_021.in +++ b/tests/cases/mvex_021.in @@ -1 +1 @@ --64 62c2690f3d81bbade34d \ No newline at end of file +-knc -64 62c2690f3d81bbade34d \ No newline at end of file diff --git a/tests/cases/mvex_022.in b/tests/cases/mvex_022.in index 38b98ec1..ca6f060c 100644 --- a/tests/cases/mvex_022.in +++ b/tests/cases/mvex_022.in @@ -1 +1 @@ --64 62e23915cdf2 \ No newline at end of file +-knc -64 62e23915cdf2 \ No newline at end of file diff --git a/tests/cases/mvex_023.in b/tests/cases/mvex_023.in index 21cbfc42..abe21c66 100644 --- a/tests/cases/mvex_023.in +++ b/tests/cases/mvex_023.in @@ -1 +1 @@ --64 628279f065a7701808b4 \ No newline at end of file +-knc -64 628279f065a7701808b4 \ No newline at end of file diff --git a/tests/cases/mvex_024.in b/tests/cases/mvex_024.in index 065302b9..d4a022ef 100644 --- a/tests/cases/mvex_024.in +++ b/tests/cases/mvex_024.in @@ -1 +1 @@ --64 62e1612bdbd3 \ No newline at end of file +-knc -64 62e1612bdbd3 \ No newline at end of file diff --git a/tests/cases/mvex_025.in b/tests/cases/mvex_025.in index 328a72ee..7af6527a 100644 --- a/tests/cases/mvex_025.in +++ b/tests/cases/mvex_025.in @@ -1 +1 @@ --64 62F279585000 \ No newline at end of file +-knc -64 62F279585000 \ No newline at end of file diff --git a/tests/cases/mvex_026.in b/tests/cases/mvex_026.in index 82fbaad8..9bfdbbcc 100644 --- a/tests/cases/mvex_026.in +++ b/tests/cases/mvex_026.in @@ -1 +1 @@ --64 62F271E950C2 \ No newline at end of file +-knc -64 62F271E950C2 \ No newline at end of file diff --git a/tests/cases/vexc4_025.in b/tests/cases/vexc4_025.in index 4f3591a2..da169df6 100644 --- a/tests/cases/vexc4_025.in +++ b/tests/cases/vexc4_025.in @@ -1 +1 @@ --64 C4E25A5EDE +-64 C4E25A5EDE \ No newline at end of file diff --git a/tests/cases/vexc4_026.in b/tests/cases/vexc4_026.in index 7973d60a..2e418507 100644 --- a/tests/cases/vexc4_026.in +++ b/tests/cases/vexc4_026.in @@ -1 +1 @@ --64 C4E24A5EDE +-64 C4E24A5EDE \ No newline at end of file diff --git a/tests/cases/vexc4_027.in b/tests/cases/vexc4_027.in index 13caae77..d97a07d9 100644 --- a/tests/cases/vexc4_027.in +++ b/tests/cases/vexc4_027.in @@ -1 +1 @@ --64 C4E25A5EF6 +-64 C4E25A5EF6 \ No newline at end of file diff --git a/tests/crash_tool.py b/tests/crash_tool.py index f9f7c278..3c92aba4 100644 --- a/tests/crash_tool.py +++ b/tests/crash_tool.py @@ -128,7 +128,8 @@ def convert_enc_crash_to_json(crash, return_dict=False): evex_rounding = get_sanitized_enum(reader, ZydisRoundingMode) evex_sae = bool(reader.read_uint8()) evex_zeroing_mask = bool(reader.read_uint8()) - reader.read_bytes(2) + evex_no_flags = bool(reader.read_uint8()) + evex_zero_upper = bool(reader.read_uint8()) mvex_broadcast = get_sanitized_enum(reader, ZydisBroadcastMode) mvex_conversion = get_sanitized_enum(reader, ZydisConversionMode) mvex_rounding = get_sanitized_enum(reader, ZydisRoundingMode) @@ -151,6 +152,8 @@ def convert_enc_crash_to_json(crash, return_dict=False): 'rounding': evex_rounding.name, 'sae': evex_sae, 'zeroing_mask': evex_zeroing_mask, + 'no_flags': evex_no_flags, + 'zero_upper': evex_zero_upper, }, 'mvex': { 'broadcast': mvex_broadcast.name, @@ -170,6 +173,7 @@ def convert_re_enc_crash_to_json(crash, zydis_info, return_dict=False): reader = BinaryReader(crash) machine_mode = ZydisMachineMode(reader.read_uint32()) stack_width = ZydisStackWidth(reader.read_uint32()) + decoder_mode = reader.read_uint32() payload = reader.read_bytes().hex().upper() test_case = { 'machine_mode': machine_mode.name, @@ -177,6 +181,8 @@ def convert_re_enc_crash_to_json(crash, zydis_info, return_dict=False): 'payload': payload, 'description': get_disasm(zydis_info, machine_mode, stack_width, payload), } + if decoder_mode & ZYDIS_DECODER_MODE_KNC: + test_case['knc'] = True if return_dict: return test_case return to_json(test_case) @@ -238,7 +244,8 @@ def convert_enc_json_to_crash(test_case_json, from_dict=False): writer.write_uint32(ZydisRoundingMode[test_case['evex']['rounding']]) writer.write_uint8(int(test_case['evex']['sae'])) writer.write_uint8(int(test_case['evex']['zeroing_mask'])) - writer.write_padding(2) + writer.write_uint8(int(test_case['evex']['no_flags'])) + writer.write_uint8(int(test_case['evex']['zero_upper'])) writer.write_uint32(ZydisBroadcastMode[test_case['mvex']['broadcast']]) writer.write_uint32(ZydisConversionMode[test_case['mvex']['conversion']]) writer.write_uint32(ZydisRoundingMode[test_case['mvex']['rounding']]) @@ -257,6 +264,7 @@ def convert_re_enc_json_to_crash(test_case_json, from_dict=False): writer = BinaryWriter() writer.write_uint32(ZydisMachineMode[test_case['machine_mode']]) writer.write_uint32(ZydisStackWidth[test_case['stack_width']]) + writer.write_uint32(ZYDIS_DECODER_MODE_KNC if test_case.get('knc', False) else 0) writer.write_bytes(bytes.fromhex(test_case['payload'])) return writer.get_data() diff --git a/tests/enc_test_cases.json b/tests/enc_test_cases.json index 7c928904..fa9b0488 100644 --- a/tests/enc_test_cases.json +++ b/tests/enc_test_cases.json @@ -34,7 +34,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -84,7 +86,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_2", @@ -109,7 +113,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -152,7 +158,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_4", @@ -195,7 +203,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_32", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_2", @@ -238,7 +248,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -274,7 +286,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -299,7 +313,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_32", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -356,7 +372,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -381,7 +399,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -417,7 +437,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -460,7 +482,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_8_TO_16", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_2_TO_8", @@ -502,7 +526,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_RZ", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_2_TO_16", @@ -545,7 +571,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_16", @@ -585,7 +613,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_RD", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -642,7 +672,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -684,7 +716,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -724,7 +758,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_RD", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_4", @@ -749,7 +785,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_4", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -806,7 +844,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -859,7 +899,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_2", "rounding": "ZYDIS_ROUNDING_MODE_RN", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -902,7 +944,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": true, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -945,7 +989,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -981,7 +1027,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1014,7 +1062,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1057,7 +1107,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": true, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1090,7 +1142,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1133,7 +1187,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": true, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1165,7 +1221,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1205,7 +1263,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": true, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1247,7 +1307,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1279,7 +1341,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1318,7 +1382,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1350,7 +1416,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_4_TO_8", @@ -1393,7 +1461,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_64", @@ -1429,7 +1499,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_16", @@ -1469,7 +1541,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": true, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1512,7 +1586,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1552,7 +1628,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": true, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_2_TO_8", @@ -1602,7 +1680,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_64", @@ -1652,7 +1732,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1699,7 +1781,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_64", "rounding": "ZYDIS_ROUNDING_MODE_RU", "sae": true, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_64", @@ -1746,7 +1830,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1793,7 +1879,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1832,7 +1920,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1882,7 +1972,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1907,7 +1999,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1939,7 +2033,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -1982,7 +2078,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -2025,7 +2123,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": true + "zeroing_mask": true, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_1_TO_2", @@ -2061,7 +2161,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", @@ -2093,7 +2195,9 @@ "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", "rounding": "ZYDIS_ROUNDING_MODE_INVALID", "sae": false, - "zeroing_mask": false + "zeroing_mask": false, + "no_flags": false, + "zero_upper": false }, "mvex": { "broadcast": "ZYDIS_BROADCAST_MODE_INVALID", diff --git a/tests/re_enc_test_cases.json b/tests/re_enc_test_cases.json index afd5b295..86e7a6c1 100644 --- a/tests/re_enc_test_cases.json +++ b/tests/re_enc_test_cases.json @@ -195,7 +195,8 @@ "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", "stack_width": "ZYDIS_STACK_WIDTH_64", "payload": "6242795A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A", - "description": "vbroadcasti32x4 zmm27 {k2}, dword ptr ds:[r10+0x168] {sint8}" + "description": "vbroadcasti32x4 zmm27 {k2}, dword ptr ds:[r10+0x168] {sint8}", + "knc": true }, { "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", @@ -369,7 +370,8 @@ "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", "stack_width": "ZYDIS_STACK_WIDTH_64", "payload": "6262F900922C0000", - "description": "vgatherdpd zmm29, qword ptr ds:[rax+zmm16*1]" + "description": "vgatherdpd zmm29, qword ptr ds:[rax+zmm16*1]", + "knc": true }, { "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", @@ -459,7 +461,8 @@ "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", "stack_width": "ZYDIS_STACK_WIDTH_64", "payload": "62F20198B5FFFFFFFFFFFFFFFF5CFF5C4CFFFFFFFFFFFF05000000000000B75C", - "description": "vpmadd231d zmm7, zmm15, zmm7" + "description": "vpmadd231d zmm7, zmm15, zmm7", + "knc": true }, { "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", @@ -507,7 +510,8 @@ "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", "stack_width": "ZYDIS_STACK_WIDTH_64", "payload": "6291780E1811", - "description": "vprefetch1 byte ptr ds:[r9]" + "description": "vprefetch1 byte ptr ds:[r9]", + "knc": true }, { "machine_mode": "ZYDIS_MACHINE_MODE_LONG_64", diff --git a/tests/zydis_encoder_types.py b/tests/zydis_encoder_types.py index 5fbaef74..e7c1f1ec 100644 --- a/tests/zydis_encoder_types.py +++ b/tests/zydis_encoder_types.py @@ -4,6 +4,7 @@ ZYDIS_ENCODER_MAX_OPERANDS = 5 SIZE_OF_ZYDIS_ENCODER_OPERAND = 64 # This value must be corrected manually if structure layout changes +ZYDIS_DECODER_MODE_KNC = 2 # Must be updated manually if ZydisDecoderMode changes ZydisInstructionAttributes = IntFlag('ZydisInstructionAttributes', [ @@ -58,6 +59,8 @@ ('ZYDIS_ATTRIB_HAS_OPERANDSIZE', (1 << 43)), ('ZYDIS_ATTRIB_HAS_ADDRESSSIZE', (1 << 44)), ('ZYDIS_ATTRIB_HAS_EVEX_B', (1 << 45)), + ('ZYDIS_ATTRIB_HAS_REX2', (1 << 46)), + ('ZYDIS_ATTRIB_HAS_SCC', (1 << 47)), ]) @@ -101,6 +104,7 @@ 'ZYDIS_BRANCH_TYPE_SHORT', 'ZYDIS_BRANCH_TYPE_NEAR', 'ZYDIS_BRANCH_TYPE_FAR', + 'ZYDIS_BRANCH_TYPE_ABSOLUTE', ], start=0) @@ -203,7 +207,9 @@ 'ZYDIS_MNEMONIC_INVALID', 'ZYDIS_MNEMONIC_AAA', 'ZYDIS_MNEMONIC_AAD', + 'ZYDIS_MNEMONIC_AADD', 'ZYDIS_MNEMONIC_AAM', + 'ZYDIS_MNEMONIC_AAND', 'ZYDIS_MNEMONIC_AAS', 'ZYDIS_MNEMONIC_ADC', 'ZYDIS_MNEMONIC_ADCX', @@ -235,7 +241,9 @@ 'ZYDIS_MNEMONIC_ANDNPS', 'ZYDIS_MNEMONIC_ANDPD', 'ZYDIS_MNEMONIC_ANDPS', + 'ZYDIS_MNEMONIC_AOR', 'ZYDIS_MNEMONIC_ARPL', + 'ZYDIS_MNEMONIC_AXOR', 'ZYDIS_MNEMONIC_BEXTR', 'ZYDIS_MNEMONIC_BLCFILL', 'ZYDIS_MNEMONIC_BLCI', @@ -269,8 +277,40 @@ 'ZYDIS_MNEMONIC_BZHI', 'ZYDIS_MNEMONIC_CALL', 'ZYDIS_MNEMONIC_CBW', + 'ZYDIS_MNEMONIC_CCMPB', + 'ZYDIS_MNEMONIC_CCMPBE', + 'ZYDIS_MNEMONIC_CCMPF', + 'ZYDIS_MNEMONIC_CCMPL', + 'ZYDIS_MNEMONIC_CCMPLE', + 'ZYDIS_MNEMONIC_CCMPNB', + 'ZYDIS_MNEMONIC_CCMPNBE', + 'ZYDIS_MNEMONIC_CCMPNL', + 'ZYDIS_MNEMONIC_CCMPNLE', + 'ZYDIS_MNEMONIC_CCMPNO', + 'ZYDIS_MNEMONIC_CCMPNS', + 'ZYDIS_MNEMONIC_CCMPNZ', + 'ZYDIS_MNEMONIC_CCMPO', + 'ZYDIS_MNEMONIC_CCMPS', + 'ZYDIS_MNEMONIC_CCMPT', + 'ZYDIS_MNEMONIC_CCMPZ', 'ZYDIS_MNEMONIC_CDQ', 'ZYDIS_MNEMONIC_CDQE', + 'ZYDIS_MNEMONIC_CFCMOVB', + 'ZYDIS_MNEMONIC_CFCMOVBE', + 'ZYDIS_MNEMONIC_CFCMOVL', + 'ZYDIS_MNEMONIC_CFCMOVLE', + 'ZYDIS_MNEMONIC_CFCMOVNB', + 'ZYDIS_MNEMONIC_CFCMOVNBE', + 'ZYDIS_MNEMONIC_CFCMOVNL', + 'ZYDIS_MNEMONIC_CFCMOVNLE', + 'ZYDIS_MNEMONIC_CFCMOVNO', + 'ZYDIS_MNEMONIC_CFCMOVNP', + 'ZYDIS_MNEMONIC_CFCMOVNS', + 'ZYDIS_MNEMONIC_CFCMOVNZ', + 'ZYDIS_MNEMONIC_CFCMOVO', + 'ZYDIS_MNEMONIC_CFCMOVP', + 'ZYDIS_MNEMONIC_CFCMOVS', + 'ZYDIS_MNEMONIC_CFCMOVZ', 'ZYDIS_MNEMONIC_CLAC', 'ZYDIS_MNEMONIC_CLC', 'ZYDIS_MNEMONIC_CLD', @@ -304,21 +344,53 @@ 'ZYDIS_MNEMONIC_CMOVS', 'ZYDIS_MNEMONIC_CMOVZ', 'ZYDIS_MNEMONIC_CMP', + 'ZYDIS_MNEMONIC_CMPBEXADD', + 'ZYDIS_MNEMONIC_CMPBXADD', + 'ZYDIS_MNEMONIC_CMPLEXADD', + 'ZYDIS_MNEMONIC_CMPLXADD', + 'ZYDIS_MNEMONIC_CMPNBEXADD', + 'ZYDIS_MNEMONIC_CMPNBXADD', + 'ZYDIS_MNEMONIC_CMPNLEXADD', + 'ZYDIS_MNEMONIC_CMPNLXADD', + 'ZYDIS_MNEMONIC_CMPNOXADD', + 'ZYDIS_MNEMONIC_CMPNPXADD', + 'ZYDIS_MNEMONIC_CMPNSXADD', + 'ZYDIS_MNEMONIC_CMPNZXADD', + 'ZYDIS_MNEMONIC_CMPOXADD', 'ZYDIS_MNEMONIC_CMPPD', 'ZYDIS_MNEMONIC_CMPPS', + 'ZYDIS_MNEMONIC_CMPPXADD', 'ZYDIS_MNEMONIC_CMPSB', 'ZYDIS_MNEMONIC_CMPSD', 'ZYDIS_MNEMONIC_CMPSQ', 'ZYDIS_MNEMONIC_CMPSS', 'ZYDIS_MNEMONIC_CMPSW', + 'ZYDIS_MNEMONIC_CMPSXADD', 'ZYDIS_MNEMONIC_CMPXCHG', 'ZYDIS_MNEMONIC_CMPXCHG16B', 'ZYDIS_MNEMONIC_CMPXCHG8B', + 'ZYDIS_MNEMONIC_CMPZXADD', 'ZYDIS_MNEMONIC_COMISD', 'ZYDIS_MNEMONIC_COMISS', 'ZYDIS_MNEMONIC_CPUID', 'ZYDIS_MNEMONIC_CQO', 'ZYDIS_MNEMONIC_CRC32', + 'ZYDIS_MNEMONIC_CTESTB', + 'ZYDIS_MNEMONIC_CTESTBE', + 'ZYDIS_MNEMONIC_CTESTF', + 'ZYDIS_MNEMONIC_CTESTL', + 'ZYDIS_MNEMONIC_CTESTLE', + 'ZYDIS_MNEMONIC_CTESTNB', + 'ZYDIS_MNEMONIC_CTESTNBE', + 'ZYDIS_MNEMONIC_CTESTNL', + 'ZYDIS_MNEMONIC_CTESTNLE', + 'ZYDIS_MNEMONIC_CTESTNO', + 'ZYDIS_MNEMONIC_CTESTNS', + 'ZYDIS_MNEMONIC_CTESTNZ', + 'ZYDIS_MNEMONIC_CTESTO', + 'ZYDIS_MNEMONIC_CTESTS', + 'ZYDIS_MNEMONIC_CTESTT', + 'ZYDIS_MNEMONIC_CTESTZ', 'ZYDIS_MNEMONIC_CVTDQ2PD', 'ZYDIS_MNEMONIC_CVTDQ2PS', 'ZYDIS_MNEMONIC_CVTPD2DQ', @@ -508,6 +580,7 @@ 'ZYDIS_MNEMONIC_JL', 'ZYDIS_MNEMONIC_JLE', 'ZYDIS_MNEMONIC_JMP', + 'ZYDIS_MNEMONIC_JMPABS', 'ZYDIS_MNEMONIC_JNB', 'ZYDIS_MNEMONIC_JNBE', 'ZYDIS_MNEMONIC_JNL', @@ -716,6 +789,7 @@ 'ZYDIS_MNEMONIC_PAVGW', 'ZYDIS_MNEMONIC_PBLENDVB', 'ZYDIS_MNEMONIC_PBLENDW', + 'ZYDIS_MNEMONIC_PBNDKB', 'ZYDIS_MNEMONIC_PCLMULQDQ', 'ZYDIS_MNEMONIC_PCMPEQB', 'ZYDIS_MNEMONIC_PCMPEQD', @@ -729,6 +803,7 @@ 'ZYDIS_MNEMONIC_PCMPGTW', 'ZYDIS_MNEMONIC_PCMPISTRI', 'ZYDIS_MNEMONIC_PCMPISTRM', + 'ZYDIS_MNEMONIC_PCOMMIT', 'ZYDIS_MNEMONIC_PCONFIG', 'ZYDIS_MNEMONIC_PDEP', 'ZYDIS_MNEMONIC_PEXT', @@ -804,14 +879,19 @@ 'ZYDIS_MNEMONIC_PMULLW', 'ZYDIS_MNEMONIC_PMULUDQ', 'ZYDIS_MNEMONIC_POP', + 'ZYDIS_MNEMONIC_POP2', + 'ZYDIS_MNEMONIC_POP2P', 'ZYDIS_MNEMONIC_POPA', 'ZYDIS_MNEMONIC_POPAD', 'ZYDIS_MNEMONIC_POPCNT', 'ZYDIS_MNEMONIC_POPF', 'ZYDIS_MNEMONIC_POPFD', 'ZYDIS_MNEMONIC_POPFQ', + 'ZYDIS_MNEMONIC_POPP', 'ZYDIS_MNEMONIC_POR', 'ZYDIS_MNEMONIC_PREFETCH', + 'ZYDIS_MNEMONIC_PREFETCHIT0', + 'ZYDIS_MNEMONIC_PREFETCHIT1', 'ZYDIS_MNEMONIC_PREFETCHNTA', 'ZYDIS_MNEMONIC_PREFETCHT0', 'ZYDIS_MNEMONIC_PREFETCHT1', @@ -858,11 +938,14 @@ 'ZYDIS_MNEMONIC_PUNPCKLQDQ', 'ZYDIS_MNEMONIC_PUNPCKLWD', 'ZYDIS_MNEMONIC_PUSH', + 'ZYDIS_MNEMONIC_PUSH2', + 'ZYDIS_MNEMONIC_PUSH2P', 'ZYDIS_MNEMONIC_PUSHA', 'ZYDIS_MNEMONIC_PUSHAD', 'ZYDIS_MNEMONIC_PUSHF', 'ZYDIS_MNEMONIC_PUSHFD', 'ZYDIS_MNEMONIC_PUSHFQ', + 'ZYDIS_MNEMONIC_PUSHP', 'ZYDIS_MNEMONIC_PVALIDATE', 'ZYDIS_MNEMONIC_PXOR', 'ZYDIS_MNEMONIC_RCL', @@ -872,6 +955,7 @@ 'ZYDIS_MNEMONIC_RDFSBASE', 'ZYDIS_MNEMONIC_RDGSBASE', 'ZYDIS_MNEMONIC_RDMSR', + 'ZYDIS_MNEMONIC_RDMSRLIST', 'ZYDIS_MNEMONIC_RDPID', 'ZYDIS_MNEMONIC_RDPKRU', 'ZYDIS_MNEMONIC_RDPMC', @@ -979,12 +1063,15 @@ 'ZYDIS_MNEMONIC_SYSEXIT', 'ZYDIS_MNEMONIC_SYSRET', 'ZYDIS_MNEMONIC_T1MSKC', + 'ZYDIS_MNEMONIC_TCMMIMFP16PS', + 'ZYDIS_MNEMONIC_TCMMRLFP16PS', 'ZYDIS_MNEMONIC_TDCALL', 'ZYDIS_MNEMONIC_TDPBF16PS', 'ZYDIS_MNEMONIC_TDPBSSD', 'ZYDIS_MNEMONIC_TDPBSUD', 'ZYDIS_MNEMONIC_TDPBUSD', 'ZYDIS_MNEMONIC_TDPBUUD', + 'ZYDIS_MNEMONIC_TDPFP16PS', 'ZYDIS_MNEMONIC_TEST', 'ZYDIS_MNEMONIC_TESTUI', 'ZYDIS_MNEMONIC_TILELOADD', @@ -1009,6 +1096,8 @@ 'ZYDIS_MNEMONIC_UNPCKHPS', 'ZYDIS_MNEMONIC_UNPCKLPD', 'ZYDIS_MNEMONIC_UNPCKLPS', + 'ZYDIS_MNEMONIC_URDMSR', + 'ZYDIS_MNEMONIC_UWRMSR', 'ZYDIS_MNEMONIC_V4FMADDPS', 'ZYDIS_MNEMONIC_V4FMADDSS', 'ZYDIS_MNEMONIC_V4FNMADDPS', @@ -1036,6 +1125,8 @@ 'ZYDIS_MNEMONIC_VANDNPS', 'ZYDIS_MNEMONIC_VANDPD', 'ZYDIS_MNEMONIC_VANDPS', + 'ZYDIS_MNEMONIC_VBCSTNEBF162PS', + 'ZYDIS_MNEMONIC_VBCSTNESH2PS', 'ZYDIS_MNEMONIC_VBLENDMPD', 'ZYDIS_MNEMONIC_VBLENDMPS', 'ZYDIS_MNEMONIC_VBLENDPD', @@ -1077,6 +1168,10 @@ 'ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ', 'ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS', 'ZYDIS_MNEMONIC_VCVTNE2PS2BF16', + 'ZYDIS_MNEMONIC_VCVTNEEBF162PS', + 'ZYDIS_MNEMONIC_VCVTNEEPH2PS', + 'ZYDIS_MNEMONIC_VCVTNEOBF162PS', + 'ZYDIS_MNEMONIC_VCVTNEOPH2PS', 'ZYDIS_MNEMONIC_VCVTNEPS2BF16', 'ZYDIS_MNEMONIC_VCVTPD2DQ', 'ZYDIS_MNEMONIC_VCVTPD2PH', @@ -1538,10 +1633,22 @@ 'ZYDIS_MNEMONIC_VPCOMW', 'ZYDIS_MNEMONIC_VPCONFLICTD', 'ZYDIS_MNEMONIC_VPCONFLICTQ', + 'ZYDIS_MNEMONIC_VPDPBSSD', + 'ZYDIS_MNEMONIC_VPDPBSSDS', + 'ZYDIS_MNEMONIC_VPDPBSUD', + 'ZYDIS_MNEMONIC_VPDPBSUDS', 'ZYDIS_MNEMONIC_VPDPBUSD', 'ZYDIS_MNEMONIC_VPDPBUSDS', + 'ZYDIS_MNEMONIC_VPDPBUUD', + 'ZYDIS_MNEMONIC_VPDPBUUDS', 'ZYDIS_MNEMONIC_VPDPWSSD', 'ZYDIS_MNEMONIC_VPDPWSSDS', + 'ZYDIS_MNEMONIC_VPDPWSUD', + 'ZYDIS_MNEMONIC_VPDPWSUDS', + 'ZYDIS_MNEMONIC_VPDPWUSD', + 'ZYDIS_MNEMONIC_VPDPWUSDS', + 'ZYDIS_MNEMONIC_VPDPWUUD', + 'ZYDIS_MNEMONIC_VPDPWUUDS', 'ZYDIS_MNEMONIC_VPERM2F128', 'ZYDIS_MNEMONIC_VPERM2I128', 'ZYDIS_MNEMONIC_VPERMB', @@ -1878,12 +1985,20 @@ 'ZYDIS_MNEMONIC_VSCATTERPF1QPS', 'ZYDIS_MNEMONIC_VSCATTERQPD', 'ZYDIS_MNEMONIC_VSCATTERQPS', + 'ZYDIS_MNEMONIC_VSHA512MSG1', + 'ZYDIS_MNEMONIC_VSHA512MSG2', + 'ZYDIS_MNEMONIC_VSHA512RNDS2', 'ZYDIS_MNEMONIC_VSHUFF32X4', 'ZYDIS_MNEMONIC_VSHUFF64X2', 'ZYDIS_MNEMONIC_VSHUFI32X4', 'ZYDIS_MNEMONIC_VSHUFI64X2', 'ZYDIS_MNEMONIC_VSHUFPD', 'ZYDIS_MNEMONIC_VSHUFPS', + 'ZYDIS_MNEMONIC_VSM3MSG1', + 'ZYDIS_MNEMONIC_VSM3MSG2', + 'ZYDIS_MNEMONIC_VSM3RNDS2', + 'ZYDIS_MNEMONIC_VSM4KEY4', + 'ZYDIS_MNEMONIC_VSM4RNDS4', 'ZYDIS_MNEMONIC_VSQRTPD', 'ZYDIS_MNEMONIC_VSQRTPH', 'ZYDIS_MNEMONIC_VSQRTPS', @@ -1916,6 +2031,8 @@ 'ZYDIS_MNEMONIC_WRFSBASE', 'ZYDIS_MNEMONIC_WRGSBASE', 'ZYDIS_MNEMONIC_WRMSR', + 'ZYDIS_MNEMONIC_WRMSRLIST', + 'ZYDIS_MNEMONIC_WRMSRNS', 'ZYDIS_MNEMONIC_WRPKRU', 'ZYDIS_MNEMONIC_WRSSD', 'ZYDIS_MNEMONIC_WRSSQ', @@ -1980,6 +2097,22 @@ 'ZYDIS_REGISTER_R13B', 'ZYDIS_REGISTER_R14B', 'ZYDIS_REGISTER_R15B', + 'ZYDIS_REGISTER_R16B', + 'ZYDIS_REGISTER_R17B', + 'ZYDIS_REGISTER_R18B', + 'ZYDIS_REGISTER_R19B', + 'ZYDIS_REGISTER_R20B', + 'ZYDIS_REGISTER_R21B', + 'ZYDIS_REGISTER_R22B', + 'ZYDIS_REGISTER_R23B', + 'ZYDIS_REGISTER_R24B', + 'ZYDIS_REGISTER_R25B', + 'ZYDIS_REGISTER_R26B', + 'ZYDIS_REGISTER_R27B', + 'ZYDIS_REGISTER_R28B', + 'ZYDIS_REGISTER_R29B', + 'ZYDIS_REGISTER_R30B', + 'ZYDIS_REGISTER_R31B', 'ZYDIS_REGISTER_AX', 'ZYDIS_REGISTER_CX', 'ZYDIS_REGISTER_DX', @@ -1996,6 +2129,22 @@ 'ZYDIS_REGISTER_R13W', 'ZYDIS_REGISTER_R14W', 'ZYDIS_REGISTER_R15W', + 'ZYDIS_REGISTER_R16W', + 'ZYDIS_REGISTER_R17W', + 'ZYDIS_REGISTER_R18W', + 'ZYDIS_REGISTER_R19W', + 'ZYDIS_REGISTER_R20W', + 'ZYDIS_REGISTER_R21W', + 'ZYDIS_REGISTER_R22W', + 'ZYDIS_REGISTER_R23W', + 'ZYDIS_REGISTER_R24W', + 'ZYDIS_REGISTER_R25W', + 'ZYDIS_REGISTER_R26W', + 'ZYDIS_REGISTER_R27W', + 'ZYDIS_REGISTER_R28W', + 'ZYDIS_REGISTER_R29W', + 'ZYDIS_REGISTER_R30W', + 'ZYDIS_REGISTER_R31W', 'ZYDIS_REGISTER_EAX', 'ZYDIS_REGISTER_ECX', 'ZYDIS_REGISTER_EDX', @@ -2012,6 +2161,22 @@ 'ZYDIS_REGISTER_R13D', 'ZYDIS_REGISTER_R14D', 'ZYDIS_REGISTER_R15D', + 'ZYDIS_REGISTER_R16D', + 'ZYDIS_REGISTER_R17D', + 'ZYDIS_REGISTER_R18D', + 'ZYDIS_REGISTER_R19D', + 'ZYDIS_REGISTER_R20D', + 'ZYDIS_REGISTER_R21D', + 'ZYDIS_REGISTER_R22D', + 'ZYDIS_REGISTER_R23D', + 'ZYDIS_REGISTER_R24D', + 'ZYDIS_REGISTER_R25D', + 'ZYDIS_REGISTER_R26D', + 'ZYDIS_REGISTER_R27D', + 'ZYDIS_REGISTER_R28D', + 'ZYDIS_REGISTER_R29D', + 'ZYDIS_REGISTER_R30D', + 'ZYDIS_REGISTER_R31D', 'ZYDIS_REGISTER_RAX', 'ZYDIS_REGISTER_RCX', 'ZYDIS_REGISTER_RDX', @@ -2028,6 +2193,22 @@ 'ZYDIS_REGISTER_R13', 'ZYDIS_REGISTER_R14', 'ZYDIS_REGISTER_R15', + 'ZYDIS_REGISTER_R16', + 'ZYDIS_REGISTER_R17', + 'ZYDIS_REGISTER_R18', + 'ZYDIS_REGISTER_R19', + 'ZYDIS_REGISTER_R20', + 'ZYDIS_REGISTER_R21', + 'ZYDIS_REGISTER_R22', + 'ZYDIS_REGISTER_R23', + 'ZYDIS_REGISTER_R24', + 'ZYDIS_REGISTER_R25', + 'ZYDIS_REGISTER_R26', + 'ZYDIS_REGISTER_R27', + 'ZYDIS_REGISTER_R28', + 'ZYDIS_REGISTER_R29', + 'ZYDIS_REGISTER_R30', + 'ZYDIS_REGISTER_R31', 'ZYDIS_REGISTER_ST0', 'ZYDIS_REGISTER_ST1', 'ZYDIS_REGISTER_ST2', @@ -2221,6 +2402,22 @@ 'ZYDIS_REGISTER_BND3', 'ZYDIS_REGISTER_BNDCFG', 'ZYDIS_REGISTER_BNDSTATUS', + 'ZYDIS_REGISTER_DFV0', + 'ZYDIS_REGISTER_DFV1', + 'ZYDIS_REGISTER_DFV2', + 'ZYDIS_REGISTER_DFV3', + 'ZYDIS_REGISTER_DFV4', + 'ZYDIS_REGISTER_DFV5', + 'ZYDIS_REGISTER_DFV6', + 'ZYDIS_REGISTER_DFV7', + 'ZYDIS_REGISTER_DFV8', + 'ZYDIS_REGISTER_DFV9', + 'ZYDIS_REGISTER_DFV10', + 'ZYDIS_REGISTER_DFV11', + 'ZYDIS_REGISTER_DFV12', + 'ZYDIS_REGISTER_DFV13', + 'ZYDIS_REGISTER_DFV14', + 'ZYDIS_REGISTER_DFV15', 'ZYDIS_REGISTER_MXCSR', 'ZYDIS_REGISTER_PKRU', 'ZYDIS_REGISTER_XCR0', diff --git a/tools/ZydisFuzzEncoder.c b/tools/ZydisFuzzEncoder.c index 550d533c..c8539115 100644 --- a/tools/ZydisFuzzEncoder.c +++ b/tools/ZydisFuzzEncoder.c @@ -38,7 +38,8 @@ // TODO: This could check `EVEX`/`MVEX` stuff as well void ZydisCompareRequestToInstruction(const ZydisEncoderRequest *request, - const ZydisDecodedInstruction *insn, const ZydisDecodedOperand* operands, const ZyanU8 *insn_bytes) + const ZydisDecodedInstruction *insn, const ZydisDecodedOperand* operands, + const ZyanU8 *insn_bytes) { // Special case, `xchg rAX, rAX` is an alias for `NOP` if ((request->mnemonic == ZYDIS_MNEMONIC_XCHG) && @@ -59,33 +60,6 @@ void ZydisCompareRequestToInstruction(const ZydisEncoderRequest *request, } } - // Handle possible KNC overlap - ZydisDecodedInstruction knc_insn; - ZydisDecodedOperand knc_operands[ZYDIS_MAX_OPERAND_COUNT]; - if (request->mnemonic != insn->mnemonic) - { - ZydisDecoder decoder; - ZydisStackWidth stack_width = (ZydisStackWidth)(insn->stack_width >> 5); - if (!ZYAN_SUCCESS(ZydisDecoderInit(&decoder, insn->machine_mode, stack_width))) - { - fputs("Failed to initialize decoder\n", ZYAN_STDERR); - abort(); - } - if (!ZYAN_SUCCESS(ZydisDecoderEnableMode(&decoder, ZYDIS_DECODER_MODE_KNC, ZYAN_TRUE))) - { - fputs("Failed to enable KNC mode\n", ZYAN_STDERR); - abort(); - } - if (!ZYAN_SUCCESS(ZydisDecoderDecodeFull(&decoder, insn_bytes, insn->length, &knc_insn, - knc_operands))) - { - fputs("Failed to decode instruction\n", ZYAN_STDERR); - abort(); - } - insn = &knc_insn; - operands = knc_operands; - } - ZyanBool prefixes_match = ((insn->attributes & request->prefixes) == request->prefixes); if (!prefixes_match && (request->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) && @@ -301,6 +275,17 @@ int ZydisFuzzTarget(ZydisStreamRead read_fn, void *stream_ctx) ZydisDecodedOperand operands1[ZYDIS_MAX_OPERAND_COUNT]; status = ZydisDecoderDecodeFull(&decoder, encoded_instruction, encoded_length, &insn1, operands1); + // Handle possible KNC instruction + if (!ZYAN_SUCCESS(status) || request.mnemonic != insn1.mnemonic) + { + if (!ZYAN_SUCCESS(ZydisDecoderEnableMode(&decoder, ZYDIS_DECODER_MODE_KNC, ZYAN_TRUE))) + { + fputs("Failed to enable KNC mode\n", ZYAN_STDERR); + abort(); + } + status = ZydisDecoderDecodeFull(&decoder, encoded_instruction, encoded_length, &insn1, + operands1); + } if (!ZYAN_SUCCESS(status)) { fputs("Failed to decode instruction\n", ZYAN_STDERR); diff --git a/tools/ZydisFuzzReEncoding.c b/tools/ZydisFuzzReEncoding.c index 1439ea6c..e0c59247 100644 --- a/tools/ZydisFuzzReEncoding.c +++ b/tools/ZydisFuzzReEncoding.c @@ -45,6 +45,7 @@ typedef struct ZydisFuzzControlBlock_ { ZydisMachineMode machine_mode; ZydisStackWidth stack_width; + ZydisDecoderMode decoder_mode; } ZydisFuzzControlBlock; /* ============================================================================================== */ @@ -69,6 +70,14 @@ int ZydisFuzzTarget(ZydisStreamRead read_fn, void *stream_ctx) ZYDIS_MAYBE_FPUTS("Failed to initialize decoder\n", ZYAN_STDERR); return EXIT_FAILURE; } + if (control_block.decoder_mode & ZYDIS_DECODER_MODE_KNC) + { + if (!ZYAN_SUCCESS(ZydisDecoderEnableMode(&decoder, ZYDIS_DECODER_MODE_KNC, ZYAN_TRUE))) + { + ZYDIS_MAYBE_FPUTS("Failed to enable KNC mode\n", ZYAN_STDERR); + return EXIT_FAILURE; + } + } ZyanU8 buffer[32]; ZyanUSize input_len = read_fn(stream_ctx, buffer, sizeof(buffer)); diff --git a/tools/ZydisInfo.c b/tools/ZydisInfo.c index 2a596735..6614604f 100644 --- a/tools/ZydisInfo.c +++ b/tools/ZydisInfo.c @@ -1159,7 +1159,7 @@ static void PrintInstruction(const ZydisDecoder* decoder, void PrintUsage(int argc, char* argv[]) { - ZYAN_FPRINTF(ZYAN_STDERR, "%sUsage: %s [stack_width] \n\n" + ZYAN_FPRINTF(ZYAN_STDERR, "%sUsage: %s [stack_width] [-knc] \n\n" "Machine mode: -real|-16|-32|-64\n" "Stack width: -16|-32|-64%s\n", CVT100_ERR(COLOR_ERROR), (argc > 0 ? argv[0] : "ZydisInfo"), @@ -1183,66 +1183,82 @@ int main(int argc, char** argv) return ZYAN_STATUS_INVALID_ARGUMENT; } - ZydisDecoder decoder; - ZydisMachineMode machine_mode; - ZydisStackWidth stack_width; - ZyanU8 hexbytes_index = 2; - if (!ZYAN_STRCMP(argv[1], "-real")) - { - machine_mode = ZYDIS_MACHINE_MODE_REAL_16; - stack_width = ZYDIS_STACK_WIDTH_16; - } - else if (!ZYAN_STRCMP(argv[1], "-16")) - { - machine_mode = ZYDIS_MACHINE_MODE_LONG_COMPAT_16; - stack_width = ZYDIS_STACK_WIDTH_16; - } - else if (!ZYAN_STRCMP(argv[1], "-32")) - { - machine_mode = ZYDIS_MACHINE_MODE_LONG_COMPAT_32; - stack_width = ZYDIS_STACK_WIDTH_32; - } - else if (!ZYAN_STRCMP(argv[1], "-64")) + static const struct { - machine_mode = ZYDIS_MACHINE_MODE_LONG_64; - stack_width = ZYDIS_STACK_WIDTH_64; - } - else + const char *option; + ZydisMachineMode machine_mode; + ZydisStackWidth stack_width; + } configurations[] = { - PrintUsage(argc, argv); - return ZYAN_STATUS_INVALID_ARGUMENT; - } - if ((argc > 3) && (argv[2][0] == '-')) + { "-real", ZYDIS_MACHINE_MODE_REAL_16, ZYDIS_STACK_WIDTH_16 }, + { "-16", ZYDIS_MACHINE_MODE_LONG_COMPAT_16, ZYDIS_STACK_WIDTH_16 }, + { "-32", ZYDIS_MACHINE_MODE_LONG_COMPAT_32, ZYDIS_STACK_WIDTH_32 }, + { "-64", ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_STACK_WIDTH_64 }, + }; + ZydisDecoder decoder; + ZyanBool use_knc = ZYAN_FALSE; + int options[] = { -1, -1 }; + int arg_index, options_count = 0; + for (arg_index = 1; arg_index < argc; ++arg_index) { - ++hexbytes_index; - if (!ZYAN_STRCMP(argv[2], "-16")) + if (*argv[arg_index] != '-') + { + break; + } + if (!ZYAN_STRCMP(argv[arg_index], "-knc")) { - stack_width = ZYDIS_STACK_WIDTH_16; + use_knc = ZYAN_TRUE; + continue; } - else if (!ZYAN_STRCMP(argv[2], "-32")) + if (ZYAN_ARRAY_LENGTH(options) == options_count) { - stack_width = ZYDIS_STACK_WIDTH_32; + PrintUsage(argc, argv); + return ZYAN_STATUS_INVALID_ARGUMENT; } - else if (!ZYAN_STRCMP(argv[2], "-64")) + ZyanBool parsing_failed = ZYAN_TRUE; + for (int i = 0; i < ZYAN_ARRAY_LENGTH(configurations); ++i) { - stack_width = ZYDIS_STACK_WIDTH_64; + if (!ZYAN_STRCMP(argv[arg_index], configurations[i].option)) + { + options[options_count++] = i; + parsing_failed = ZYAN_FALSE; + break; + } } - else + if (parsing_failed) { PrintUsage(argc, argv); return ZYAN_STATUS_INVALID_ARGUMENT; } } + if (options[0] == -1 || options[1] == 0) + { + PrintUsage(argc, argv); + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + int width_config_index = options[1] == -1 ? 0 : 1; + ZydisMachineMode machine_mode = configurations[options[0]].machine_mode; + ZydisStackWidth stack_width = configurations[options[width_config_index]].stack_width; ZyanStatus status = ZydisDecoderInit(&decoder, machine_mode, stack_width); if (!ZYAN_SUCCESS(status)) { PrintStatusError(status, "Failed to initialize decoder"); return status; } + if (use_knc) + { + status = ZydisDecoderEnableMode(&decoder, ZYDIS_DECODER_MODE_KNC, ZYAN_TRUE); + if (!ZYAN_SUCCESS(status)) + { + PrintStatusError(status, "Failed to enable KNC mode"); + return status; + } + } ZyanU8 data[ZYDIS_MAX_INSTRUCTION_LENGTH]; ZyanU8 byte_length = 0; - for (ZyanU8 i = hexbytes_index; i < argc; ++i) + for (int i = arg_index; i < argc; ++i) { char* cur_arg = argv[i];