Further improvements to the `ZydisInfo` tool

This commit is contained in:
flobernd 2017-07-15 03:36:11 +02:00
parent 9e15ecc5f1
commit 2be83199d5
1 changed files with 28 additions and 7 deletions

View File

@ -45,6 +45,7 @@ const char* ZydisFormatStatus(ZydisStatus status)
"SUCCESS",
"INVALID_PARAMETER",
"INVALID_OPERATION",
"INSUFFICIENT_BUFFER_SIZE",
"NO_MORE_DATA",
"DECODING_ERROR",
"INSTRUCTION_TOO_LONG",
@ -465,14 +466,36 @@ int main(int argc, char** argv)
return ZYDIS_STATUS_INVALID_PARAMETER;
}
uint8_t data[ZYDIS_MAX_INSTRUCTION_LENGTH] =
uint8_t data[ZYDIS_MAX_INSTRUCTION_LENGTH];
uint8_t length = 0;
for (uint8_t i = 0; i < argc - 2; ++i)
{
0x62, 0x22, 0xF9, 0x85, 0xA2, 0x64, 0x78, 0x5E, 0x24, 0x04, 0xCF, 0x7E, 0x23
};
if (length == ZYDIS_MAX_INSTRUCTION_LENGTH)
{
fprintf(stderr, "Maximum number of %d bytes exceeded", ZYDIS_MAX_INSTRUCTION_LENGTH);
return ZYDIS_STATUS_INVALID_PARAMETER;
}
size_t len = strlen(argv[i + 2]);
if (len % 2)
{
fputs("Even number of hex nibbles expected", stderr);
return ZYDIS_STATUS_INVALID_PARAMETER;
}
for (uint8_t j = 0; j < len / 2; ++j)
{
unsigned value;
if (!sscanf(&argv[i + 2][j * 2], "%02x", &value))
{
fputs("Invalid hex value", stderr);
return ZYDIS_STATUS_INVALID_PARAMETER;
}
data[i + j] = (uint8_t)value;
++length;
}
}
ZydisDecodedInstruction instruction;
ZydisStatus status =
ZydisDecoderDecodeBuffer(&decoder, &data, ZYDIS_MAX_INSTRUCTION_LENGTH, 0, &instruction);
ZydisStatus status = ZydisDecoderDecodeBuffer(&decoder, &data, length, 0, &instruction);
if (!ZYDIS_SUCCESS(status))
{
if (status >= ZYDIS_STATUS_USER)
@ -487,8 +510,6 @@ int main(int argc, char** argv)
}
printInstruction(&instruction);
getchar();
return ZYDIS_STATUS_SUCCESS;
}