diff --git a/CMakeLists.txt b/CMakeLists.txt index 2067d9d..65f7e18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,7 @@ if (ZYDIS_BUILD_EXAMPLES) "examples/FormatHelper.h") target_link_libraries("FormatterHooks" "Zydis") set_target_properties ("FormatterHooks" PROPERTIES FOLDER "Examples/Formatter") + target_compile_definitions("FormatterHooks" PRIVATE "_CRT_SECURE_NO_WARNINGS") endif () # Tools @@ -101,8 +102,10 @@ if (ZYDIS_BUILD_TOOLS) add_executable("ZydisDisasm" "tools/ZydisDisasm.c") target_link_libraries("ZydisDisasm" "Zydis") set_target_properties ("ZydisDisasm" PROPERTIES FOLDER "Tools") + target_compile_definitions("ZydisDisasm" PRIVATE "_CRT_SECURE_NO_WARNINGS") add_executable("ZydisFuzzIn" "tools/ZydisFuzzIn.c") target_link_libraries("ZydisFuzzIn" "Zydis") set_target_properties("ZydisFuzzIn" PROPERTIES FOLDER "Tools") + target_compile_definitions("ZydisFuzzIn" PRIVATE "_CRT_SECURE_NO_WARNINGS") endif () diff --git a/tools/ZydisDisasm.c b/tools/ZydisDisasm.c index 0f6989e..3adab9c 100644 --- a/tools/ZydisDisasm.c +++ b/tools/ZydisDisasm.c @@ -38,26 +38,19 @@ int main(int argc, char** argv) { - if (argc != 2) + if (argc < 1 || argc > 2) { - fprintf(stderr, "Usage: %s \n", (argc > 0 ? argv[0] : "ZydisDisasm")); + fprintf(stderr, "Usage: %s [input file]\n", (argc > 0 ? argv[0] : "ZydisDisasm")); return EXIT_FAILURE; } - - FILE* file = fopen(argv[1], "rb"); + + FILE* file = argc >= 2 ? fopen(argv[1], "rb") : stdin; if (!file) { fprintf(stderr, "Can not open file: %s\n", strerror(errno)); return EXIT_FAILURE; } - ZydisFileInput input; - if (!ZYDIS_SUCCESS(ZydisInputInitFileInput(&input, file))) - { - fputs("Failed to initialize file-input\n", stderr); - return EXIT_FAILURE; - } - ZydisInstructionFormatter formatter; if (!ZYDIS_SUCCESS(ZydisFormatterInitInstructionFormatterEx(&formatter, ZYDIS_FORMATTER_STYLE_INTEL, ZYDIS_FMTFLAG_FORCE_SEGMENTS | ZYDIS_FMTFLAG_FORCE_OPERANDSIZE, @@ -68,26 +61,46 @@ int main(int argc, char** argv) } ZydisInstructionDecoder decoder; - if (!ZYDIS_SUCCESS(ZydisDecoderInitInstructionDecoderEx(&decoder, ZYDIS_DISASSEMBLER_MODE_64BIT, - (ZydisCustomInput*)&input, ZYDIS_DECODER_FLAG_SKIP_DATA))) + if (!ZYDIS_SUCCESS(ZydisDecoderInitInstructionDecoder(&decoder, ZYDIS_DISASSEMBLER_MODE_64BIT))) { fputs("Failed to initialize instruction-decoder\n", stderr); return EXIT_FAILURE; } - char buffer[256]; - ZydisInstructionInfo info; - while (ZYDIS_SUCCESS(ZydisDecoderDecodeNextInstruction(&decoder, &info))) + uint8_t readBuf[ZYDIS_MAX_INSTRUCTION_LENGTH]; + size_t numBytesRead; + do { - if (info.instrFlags & ZYDIS_INSTRFLAG_ERROR_MASK) + numBytesRead = fread(readBuf, 1, sizeof(readBuf), file); + + ZydisInstructionInfo info; + ZydisStatus status; + size_t readOffs = 0; + while ((status = ZydisDecoderDecodeInstruction( + &decoder, readBuf + readOffs, numBytesRead - readOffs, &info + )) != ZYDIS_STATUS_NO_MORE_DATA) { - printf("db %02X\n", info.data[0]); - continue; - } + if (!ZYDIS_SUCCESS(status)) + { + ++decoder.instructionPointer; + ++readOffs; + printf("db %02X\n", info.data[0]); + continue; + } - ZydisFormatterFormatInstruction(&formatter, &info, buffer, sizeof(buffer)); - puts(buffer); - } + char printBuffer[256]; + ZydisFormatterFormatInstruction(&formatter, &info, printBuffer, sizeof(printBuffer)); + puts(printBuffer); + readOffs += info.length; + } + + if (readOffs < sizeof(readBuf)) + { + memmove(readBuf, readBuf + readOffs, sizeof(readBuf) - readOffs); + } + } while (numBytesRead == sizeof(readBuf)); + + return 0; } /* ============================================================================================== */ diff --git a/tools/ZydisFuzzIn.c b/tools/ZydisFuzzIn.c index 89cc3bb..e73f3a7 100644 --- a/tools/ZydisFuzzIn.c +++ b/tools/ZydisFuzzIn.c @@ -40,14 +40,12 @@ #include typedef struct ZydisFuzzControlBlock_ { - ZydisDisassemblerMode disasMode; - ZydisDecoderFlags decoderFlags; + ZydisDisassemblerMode disasMode; ZydisFormatterStyle formatterStyle; ZydisFormatterFlags formatterFlags; ZydisFormatterAddressFormat formatterAddrFormat; ZydisFormatterDisplacementFormat formatterDispFormat; ZydisFormatterImmediateFormat formatterImmFormat; - uint8_t bufSize; } ZydisFuzzControlBlock; /* ============================================================================================== */ @@ -63,45 +61,53 @@ int main() return EXIT_FAILURE; } - ZydisFileInput input; - if (!ZYDIS_SUCCESS(ZydisInputInitFileInput(&input, stdin))) - { - fputs("failed to initialize file-input\n", stderr); - return EXIT_FAILURE; - } - ZydisInstructionFormatter formatter; if (!ZYDIS_SUCCESS(ZydisFormatterInitInstructionFormatterEx(&formatter, controlBlock.formatterStyle, controlBlock.formatterFlags, controlBlock.formatterAddrFormat, controlBlock.formatterDispFormat, controlBlock.formatterImmFormat))) { - fputs("failed to initialized instruction-formatter\n", stderr); + fputs("failed to initialize instruction-formatter\n", stderr); return EXIT_FAILURE; } ZydisInstructionDecoder decoder; - if (!ZYDIS_SUCCESS(ZydisDecoderInitInstructionDecoderEx(&decoder, controlBlock.disasMode, - (ZydisCustomInput*)&input, controlBlock.decoderFlags))) + if (!ZYDIS_SUCCESS(ZydisDecoderInitInstructionDecoder(&decoder, controlBlock.disasMode))) { fputs("Failed to initialize instruction-decoder\n", stderr); return EXIT_FAILURE; } - ZydisInstructionInfo info; - char *outBuf = malloc(controlBlock.bufSize); - while (ZYDIS_SUCCESS(ZydisDecoderDecodeNextInstruction(&decoder, &info))) + uint8_t readBuf[ZYDIS_MAX_INSTRUCTION_LENGTH]; + size_t numBytesRead; + do { - if (info.instrFlags & ZYDIS_INSTRFLAG_ERROR_MASK) + numBytesRead = fread(readBuf, 1, sizeof(readBuf), stdin); + + ZydisInstructionInfo info; + ZydisStatus status; + size_t readOffs = 0; + while ((status = ZydisDecoderDecodeInstruction( + &decoder, readBuf + readOffs, numBytesRead - readOffs, &info + )) != ZYDIS_STATUS_NO_MORE_DATA) { - printf("db %02X\n", info.data[0]); - continue; + if (!ZYDIS_SUCCESS(status)) + { + ++decoder.instructionPointer; + ++readOffs; + continue; + } + + char printBuffer[256]; + ZydisFormatterFormatInstruction(&formatter, &info, printBuffer, sizeof(printBuffer)); + readOffs += info.length; } - ZydisFormatterFormatInstruction(&formatter, &info, outBuf, controlBlock.bufSize); - puts(outBuf); - } + if (readOffs < sizeof(readBuf)) + { + memmove(readBuf, readBuf + readOffs, sizeof(readBuf) - readOffs); + } + } while (numBytesRead == sizeof(readBuf)); - free(outBuf); return 0; }