Project name changed and C-Bindings reverted

* Changed project name to Zydis
  * Removed Zydis (former VX) prefix from classes and enums
  * Renamed Verteron namespace to Zydis
* Reverted C-Bindings back to the old solution
  * C-Bindings are now based on the C++ source again (and not the other way around)
This commit is contained in:
flobernd 2015-05-16 05:05:17 +02:00
parent de31261273
commit 4676a8b2d7
41 changed files with 12863 additions and 26570 deletions

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : athre0z Modifications : Joel Höner
Last change : 19. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,14 +26,15 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#include <ZyDisDisassembler.h> #ifndef _ZYDIS_DISASSEMBLER_H_
#define _ZYDIS_DISASSEMBLER_H_
int main(int argc, char* argv[]) #include "ZydisTypes.h"
{ #include "ZydisInstructionDecoder.h"
ZYDIS_UNUSED(argc); ZYDIS_UNUSED(argv); #include "ZydisInstructionFormatter.h"
#include "ZydisSymbolResolver.h"
#include "ZydisUtils.h"
// TODO: #endif /* _ZYDIS_DISASSEMBLER_H_ */
return 0;
}

View File

@ -0,0 +1,259 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#include "ZydisInstructionDecoder.h"
#include "ZydisInstructionDecoder.hpp"
#include "ZydisTypes.hpp"
/* Helpers ===================================================================================== */
namespace
{
inline Zydis::BaseInput* ZydisBaseInput_CppPtr(
ZydisBaseInputContext *ctx)
{
return reinterpret_cast<Zydis::BaseInput*>(ctx);
}
inline const Zydis::BaseInput* ZydisBaseInput_CppPtr(
const ZydisBaseInputContext *ctx)
{
return reinterpret_cast<const Zydis::BaseInput*>(ctx);
}
inline ZydisBaseInputContext* ZydisBaseInput_CPtr(
Zydis::BaseInput *ptr)
{
return reinterpret_cast<ZydisBaseInputContext*>(ptr);
}
inline const ZydisBaseInputContext* ZydisBaseInput_CPtr(
const Zydis::BaseInput *ptr)
{
return reinterpret_cast<const ZydisBaseInputContext*>(ptr);
}
inline Zydis::InstructionInfo* ZydisInstructionInfo_CppPtr(
ZydisInstructionInfo *ptr)
{
static_assert(sizeof(*ptr) == sizeof(Zydis::InstructionInfo), "broken struct");
return reinterpret_cast<Zydis::InstructionInfo*>(ptr);
}
inline const Zydis::InstructionInfo* ZydisInstructionInfo_CppPtr(
const ZydisInstructionInfo *ptr)
{
static_assert(sizeof(*ptr) == sizeof(Zydis::InstructionInfo), "broken struct");
return reinterpret_cast<const Zydis::InstructionInfo*>(ptr);
}
inline ZydisInstructionDecoderContext* ZydisInstructionDecoder_CPtr(
Zydis::InstructionDecoder *ptr)
{
return reinterpret_cast<ZydisInstructionDecoderContext*>(ptr);
}
inline const ZydisInstructionDecoderContext* ZydisInstructionDecoder_CPtr(
const Zydis::InstructionDecoder *ptr)
{
return reinterpret_cast<const ZydisInstructionDecoderContext*>(ptr);
}
inline Zydis::InstructionDecoder* ZydisInstructionDecoder_CppPtr(
ZydisInstructionDecoderContext *ctx)
{
return reinterpret_cast<Zydis::InstructionDecoder*>(ctx);
}
inline const Zydis::InstructionDecoder* ZydisInstructionDecoder_CppPtr(
const ZydisInstructionDecoderContext *ctx)
{
return reinterpret_cast<const Zydis::InstructionDecoder*>(ctx);
}
inline Zydis::DisassemblerMode ZydisDisassemblerMode_CppRepr(
ZydisDisassemblerMode val)
{
return static_cast<Zydis::DisassemblerMode>(val);
}
inline ZydisDisassemblerMode ZydisDisassemblerMode_CRepr(
Zydis::DisassemblerMode val)
{
return static_cast<ZydisDisassemblerMode>(val);
}
inline Zydis::InstructionSetVendor ZydisInstructionSetVendor_CppRepr(
ZydisInstructionSetVendor val)
{
return static_cast<Zydis::InstructionSetVendor>(val);
}
inline ZydisInstructionSetVendor ZydisInstructionSetVendor_CRepr(
Zydis::InstructionSetVendor val)
{
return static_cast<ZydisInstructionSetVendor>(val);
}
}
/* BaseInput ============================================================================ */
void ZydisBaseInput_Release(ZydisBaseInputContext *ctx)
{
delete ZydisBaseInput_CppPtr(ctx);
}
uint8_t ZydisBaseInput_InputPeek(ZydisBaseInputContext *ctx, ZydisInstructionInfo *info)
{
return ZydisBaseInput_CppPtr(ctx)->inputPeek(*ZydisInstructionInfo_CppPtr(info));
}
uint8_t ZydisBaseInput_InputNext(ZydisBaseInputContext *ctx, ZydisInstructionInfo *info)
{
return ZydisBaseInput_CppPtr(ctx)->inputNext(*ZydisInstructionInfo_CppPtr(info));
}
uint8_t ZydisBaseInput_InputCurrent(const ZydisBaseInputContext *ctx)
{
return ZydisBaseInput_CppPtr(ctx)->inputCurrent();
}
bool ZydisBaseInput_IsEndOfInput(const ZydisBaseInputContext *ctx)
{
return ZydisBaseInput_CppPtr(ctx)->isEndOfInput();
}
uint64_t ZydisBaseInput_GetPosition(const ZydisBaseInputContext *ctx)
{
return ZydisBaseInput_CppPtr(ctx)->getPosition();
}
bool ZydisBaseInput_SetPosition(ZydisBaseInputContext *ctx, uint64_t position)
{
return ZydisBaseInput_CppPtr(ctx)->setPosition(position);
}
/* MemoryInput ========================================================================== */
ZydisBaseInputContext* ZydisMemoryInput_Create(const void* buffer, size_t bufferLen)
{
return reinterpret_cast<ZydisBaseInputContext*>(
new Zydis::MemoryInput(buffer, bufferLen));
}
/* InstructionDecoder ======================================================================== */
ZydisInstructionDecoderContext* ZydisInstructionDecoder_Create()
{
return reinterpret_cast<ZydisInstructionDecoderContext*>(new Zydis::InstructionDecoder);
}
ZydisInstructionDecoderContext* ZydisInstructionDecoder_CreateEx(
ZydisBaseInputContext *input,
ZydisDisassemblerMode disassemblerMode,
ZydisInstructionSetVendor preferredVendor,
uint64_t instructionPointer)
{
return ZydisInstructionDecoder_CPtr(new Zydis::InstructionDecoder(
ZydisBaseInput_CppPtr(input),
ZydisDisassemblerMode_CppRepr(disassemblerMode),
ZydisInstructionSetVendor_CppRepr(preferredVendor),
instructionPointer));
}
void ZydisInstructionDecoder_Release(ZydisInstructionDecoderContext *ctx)
{
delete ZydisInstructionDecoder_CppPtr(ctx);
}
bool ZydisInstructionDecoder_DecodeInstruction(
ZydisInstructionDecoderContext *ctx, ZydisInstructionInfo *info)
{
return ZydisInstructionDecoder_CppPtr(ctx)->decodeInstruction(
*ZydisInstructionInfo_CppPtr(info));
}
ZydisBaseInputContext* ZydisInstructionDecoder_GetDataSource(
const ZydisInstructionDecoderContext *ctx)
{
return ZydisBaseInput_CPtr(ZydisInstructionDecoder_CppPtr(ctx)->getDataSource());
}
void ZydisInstructionDecoder_SetDataSource(
ZydisInstructionDecoderContext *ctx, ZydisBaseInputContext *input)
{
ZydisInstructionDecoder_CppPtr(ctx)->setDataSource(ZydisBaseInput_CppPtr(input));
}
ZydisDisassemblerMode ZydisInstructionDecoder_GetDisassemblerMode(
ZydisInstructionDecoderContext *ctx)
{
return ZydisDisassemblerMode_CRepr(ZydisInstructionDecoder_CppPtr(ctx)->getDisassemblerMode());
}
void ZydisInstructionDecoder_SetDisassemblerMode(
ZydisInstructionDecoderContext *ctx,
ZydisDisassemblerMode disassemblerMode)
{
ZydisInstructionDecoder_CppPtr(ctx)->setDisassemblerMode(
ZydisDisassemblerMode_CppRepr(disassemblerMode));
}
ZydisInstructionSetVendor ZydisInstructionDecoder_GetPreferredVendor(
const ZydisInstructionDecoderContext *ctx)
{
return ZydisInstructionSetVendor_CRepr(
ZydisInstructionDecoder_CppPtr(ctx)->getPreferredVendor());
}
void ZydisInstructionDecoder_SetPreferredVendor(
ZydisInstructionDecoderContext *ctx,
ZydisInstructionSetVendor preferredVendor)
{
return ZydisInstructionDecoder_CppPtr(ctx)->setPreferredVendor(
ZydisInstructionSetVendor_CppRepr(preferredVendor));
}
uint64_t ZydisInstructionDecoder_GetInstructionPointer(
ZydisInstructionDecoderContext *ctx)
{
return ZydisInstructionDecoder_CppPtr(ctx)->getInstructionPointer();
}
void ZydisInstructionDecoder_SetInstructionPointer(
ZydisInstructionDecoderContext *ctx,
uint64_t instructionPointer)
{
ZydisInstructionDecoder_CppPtr(ctx)->setInstructionPointer(instructionPointer);
}
/* ============================================================================================= */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : athre0z Modifications : Joel Höner
Last change : 14. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,14 +26,12 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#ifndef _VDE_ZyDisINSTRUCTIONDECODERC_H_ #ifndef _ZYDIS_INSTRUCTIONDECODER_H_
#define _VDE_ZyDisINSTRUCTIONDECODERC_H_ #define _ZYDIS_INSTRUCTIONDECODER_H_
#include "ZyDisDisassemblerTypes.h"
#include "ZyDisDisassemblerUtils.h"
#include "ZydisTypes.h"
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
@ -44,24 +40,16 @@ extern "C"
{ {
#endif #endif
/* ZyDisBaseDataSource ============================================================================ */ /* BaseInput ============================================================================ */
typedef struct _ZyDisBaseDataSourceContext { ZyDisContextDescriptor d; } ZyDisBaseDataSourceContext; typedef struct _ZydisBaseInputContext { int a; } ZydisBaseInputContext;
typedef void(*ZyDisBaseDataSource_DestructionCallback)(ZyDisBaseDataSourceContext *ctx);
typedef uint8_t(*ZyDisBaseDataSource_InputCallback)(ZyDisBaseDataSourceContext *ctx);
typedef bool(*ZyDisBaseDataSource_IsEndOfInputCallback)(const ZyDisBaseDataSourceContext *ctx);
typedef uint64_t(*ZyDisBaseDataSource_GetPositionCallback)(const ZyDisBaseDataSourceContext *ctx);
typedef bool(*ZyDisBaseDataSource_SetPositionCallback)(
ZyDisBaseDataSourceContext *ctx, uint64_t position);
/** /**
* @brief Releases a data source. * @brief Releases a data source.
* @param ctx The context to release. * @param ctx The context to release.
* The context may no longer be used after it was released. * The context may no longer be used after it was released.
*/ */
ZYDIS_EXPORT void ZyDisBaseDataSource_Release( void ZydisBaseInput_Release(ZydisBaseInputContext *ctx);
ZyDisBaseDataSourceContext *ctx);
/** /**
* @brief Reads the next byte from the data source without altering the current input position * @brief Reads the next byte from the data source without altering the current input position
@ -72,9 +60,7 @@ ZYDIS_EXPORT void ZyDisBaseDataSource_Release(
* field of the @c info parameter for error flags. Possible error values are * field of the @c info parameter for error flags. Possible error values are
* @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
ZYDIS_EXPORT uint8_t ZyDisBaseDataSource_InputPeek( uint8_t ZydisBaseInput_InputPeek(ZydisBaseInputContext *ctx, ZydisInstructionInfo *info);
ZyDisBaseDataSourceContext *ctx,
ZyDisInstructionInfo *info);
/** /**
* @brief Reads the next byte from the data source. * @brief Reads the next byte from the data source.
@ -87,30 +73,7 @@ ZYDIS_EXPORT uint8_t ZyDisBaseDataSource_InputPeek(
* parameter. This function also appends the new byte to to @c data field of the @c info * parameter. This function also appends the new byte to to @c data field of the @c info
* parameter. * parameter.
*/ */
ZYDIS_EXPORT uint8_t ZyDisBaseDataSource_InputNext8( uint8_t ZydisBaseInput_InputNext(ZydisBaseInputContext *ctx, ZydisInstructionInfo *info);
ZyDisBaseDataSourceContext *ctx,
ZyDisInstructionInfo *info);
/**
* @copydoc ZyDisBaseDataSource_InputNext8
*/
ZYDIS_EXPORT uint16_t ZyDisBaseDataSource_InputNext16(
ZyDisBaseDataSourceContext *ctx,
ZyDisInstructionInfo *info);
/**
* @copydoc ZyDisBaseDataSource_InputNext8
*/
ZYDIS_EXPORT uint32_t ZyDisBaseDataSource_InputNext32(
ZyDisBaseDataSourceContext *ctx,
ZyDisInstructionInfo *info);
/**
* @copydoc ZyDisBaseDataSource_InputNext8
*/
ZYDIS_EXPORT uint64_t ZyDisBaseDataSource_InputNext64(
ZyDisBaseDataSourceContext *ctx,
ZyDisInstructionInfo *info);
/** /**
* @brief Returns the current input byte. * @brief Returns the current input byte.
@ -119,24 +82,21 @@ ZYDIS_EXPORT uint64_t ZyDisBaseDataSource_InputNext64(
* The current input byte is set everytime the @c inputPeek or @c inputNext method is called. * The current input byte is set everytime the @c inputPeek or @c inputNext method is called.
*/ */
// TODO: check long descr // TODO: check long descr
ZYDIS_EXPORT uint8_t ZyDisBaseDataSource_InputCurrent( uint8_t ZydisBaseInput_InputCurrent(const ZydisBaseInputContext *ctx);
const ZyDisBaseDataSourceContext *ctx);
/** /**
* @brief Queries if the end of the data source is reached. * @brief Queries if the end of the data source is reached.
* @param ctx The data soruce context. * @param ctx The data soruce context.
* @return @c true if end of input, @c false if not. * @return @c true if end of input, @c false if not.
*/ */
ZYDIS_EXPORT bool ZyDisBaseDataSource_IsEndOfInput( bool ZydisBaseInput_IsEndOfInput(const ZydisBaseInputContext *ctx);
const ZyDisBaseDataSourceContext *ctx);
/** /**
* @brief Returns the current input position. * @brief Returns the current input position.
* @param ctx The data soruce context. * @param ctx The data soruce context.
* @return The current input position. * @return The current input position.
*/ */
ZYDIS_EXPORT uint64_t ZyDisBaseDataSource_GetPosition( uint64_t ZydisBaseInput_GetPosition(const ZydisBaseInputContext *ctx);
const ZyDisBaseDataSourceContext *ctx);
/** /**
* @brief Sets a new input position. * @brief Sets a new input position.
@ -144,81 +104,53 @@ ZYDIS_EXPORT uint64_t ZyDisBaseDataSource_GetPosition(
* @param position The new input position. * @param position The new input position.
* @return @c false if the new position exceeds the maximum input length. * @return @c false if the new position exceeds the maximum input length.
*/ */
ZYDIS_EXPORT bool ZyDisBaseDataSource_SetPosition( bool ZydisBaseInput_SetPosition(ZydisBaseInputContext *ctx, uint64_t position);
ZyDisBaseDataSourceContext *ctx,
uint64_t position);
/* ZyDisMemoryDataSource ========================================================================== */ /* MemoryInput ========================================================================== */
/** /**
* @brief Creates a memory data source. * @brief Creates a memory data source.
* @param buffer The input buffer. * @param buffer The input buffer.
* @param bufferLen THe length of the input buffer. * @param bufferLen THe length of the input buffer.
* @return @c NULL if it fails, else a data source context. * @return @c NULL if it fails, else a data source context.
* @see ZyDisBaseDataSource_Release * @see BaseInput_Release
*/ */
ZYDIS_EXPORT ZyDisBaseDataSourceContext* ZyDisMemoryDataSource_Create( // TODO: verify return value
const void* buffer, ZydisBaseInputContext* ZydisMemoryInput_Create(const void* buffer, size_t bufferLen);
size_t bufferLen);
/* ZyDisCustomDataSource ========================================================================== */
/**
* @brief Creates a custom daat source.
* @param ctx The context.
* @param inputPeekCb The callback peeking the next input byte.
* @param inputNextCb The callback consuming the next input byte.
* @param isEndOfInputCb The callback determining if the end of input was reached.
* @param getPositionCb The callback obtaining the current input position.
* @param setPositionCb The callback setting the current input position.
* @param destructionCb The destruction callback. May be @c NULL.
* @return @c NULL if it fails, else a data source context.
* @see ZyDisBaseDataSource_Release
*/
ZYDIS_EXPORT ZyDisBaseDataSourceContext* ZyDisCustomDataSource_Create(
ZyDisBaseDataSource_InputCallback inputPeekCb,
ZyDisBaseDataSource_InputCallback inputNextCb,
ZyDisBaseDataSource_IsEndOfInputCallback isEndOfInputCb,
ZyDisBaseDataSource_GetPositionCallback getPositionCb,
ZyDisBaseDataSource_SetPositionCallback setPositionCb,
ZyDisBaseDataSource_DestructionCallback destructionCb);
/* Enums ======================================================================================= */ /* Enums ======================================================================================= */
/** /**
* @brief Values that represent a disassembler mode. * @brief Values that represent a disassembler mode.
*/ */
typedef enum _ZyDisDisassemblerMode /* : uint8_t */ typedef enum _ZydisDisassemblerMode /* : uint8_t */
{ {
DM_M16BIT, DM_M16BIT,
DM_M32BIT, DM_M32BIT,
DM_M64BIT DM_M64BIT
} ZyDisDisassemblerMode; } ZydisDisassemblerMode;
/** /**
* @brief Values that represent an instruction-set vendor. * @brief Values that represent an instruction-set vendor.
*/ */
typedef enum _ZyDisInstructionSetVendor /* : uint8_t */ typedef enum _ZydisInstructionSetVendor /* : uint8_t */
{ {
ISV_ANY, ISV_ANY,
ISV_INTEL, ISV_INTEL,
ISV_AMD ISV_AMD
} ZyDisInstructionSetVendor; } ZydisInstructionSetVendor;
/* ZyDisInstructionDecoder ======================================================================== */ /* InstructionDecoder ======================================================================== */
typedef struct _ZyDisInstructionDecoderContext typedef struct _ZydisInstructionDecoderContext { int a; } ZydisInstructionDecoderContext;
{
ZyDisContextDescriptor d;
} ZyDisInstructionDecoderContext;
/** /**
* @brief Creates an instruction decoder. * @brief Creates an instruction decoder.
* @return @c NULL if it fails, else an instruction decoder context. * @return @c NULL if it fails, else an instruction decoder context.
* @see ZyDisInstructionDecoder_Release * @see InstructionDecoder_Release
*/ */
// TODO: verify return value // TODO: verify return value
ZYDIS_EXPORT ZyDisInstructionDecoderContext* ZyDisInstructionDecoder_Create(void); ZydisInstructionDecoderContext* ZydisInstructionDecoder_Create(void);
/** /**
* @brief Creates an instruction decoder. * @brief Creates an instruction decoder.
@ -227,100 +159,89 @@ ZYDIS_EXPORT ZyDisInstructionDecoderContext* ZyDisInstructionDecoder_Create(void
* @param preferredVendor The preferred instruction-set vendor. * @param preferredVendor The preferred instruction-set vendor.
* @param instructionPointer The initial instruction pointer. * @param instructionPointer The initial instruction pointer.
* @return @c NULL if it fails, else an instruction decoder context. * @return @c NULL if it fails, else an instruction decoder context.
* @see ZyDisInstructionDecoder_Release * @see InstructionDecoder_Release
*/ */
ZYDIS_EXPORT ZyDisInstructionDecoderContext* ZyDisInstructionDecoder_CreateEx( ZydisInstructionDecoderContext* ZydisInstructionDecoder_CreateEx(ZydisBaseInputContext *input,
ZyDisBaseDataSourceContext *input, ZydisDisassemblerMode disassemblerMode, ZydisInstructionSetVendor preferredVendor,
ZyDisDisassemblerMode disassemblerMode,
ZyDisInstructionSetVendor preferredVendor,
uint64_t instructionPointer); uint64_t instructionPointer);
/** /**
* @brief Releases an instruction decoder. * @brief Releases an instruction decoder.
* @param ctx The context of the instruction decoder to release. * @param ctx The context of the instruction decoder to release.
*/ */
ZYDIS_EXPORT void ZyDisInstructionDecoder_Release( void ZydisInstructionDecoder_Release(ZydisInstructionDecoderContext *ctx);
ZyDisInstructionDecoderContext *ctx);
/** /**
* @brief Decodes the next instruction from the input data source. * @brief Decodes the next instruction from the input data source.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @param info The @c ZyDisInstructionInfo struct that receives the information about the decoded * @param info The @c ZydisInstructionInfo struct that receives the information about the decoded
* instruction. * instruction.
* @return This function returns @c false if the current position exceeds the maximum input * @return This function returns @c false if the current position exceeds the maximum input
* length. In all other cases (valid and invalid instructions) the return value is * length. In all other cases (valid and invalid instructions) the return value is
* @c true. * @c true.
*/ */
ZYDIS_EXPORT bool ZyDisInstructionDecoder_DecodeInstruction( bool ZydisInstructionDecoder_DecodeInstruction(ZydisInstructionDecoderContext *ctx,
ZyDisInstructionDecoderContext *ctx, ZydisInstructionInfo *info);
ZyDisInstructionInfo *info);
/** /**
* @brief Returns a pointer to the current data source. * @brief Returns a pointer to the current data source.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @return The context of the data source. * @return The context of the data source.
*/ */
ZYDIS_EXPORT ZyDisBaseDataSourceContext* ZyDisInstructionDecoder_GetDataSource( ZydisBaseInputContext* ZydisInstructionDecoder_GetDataSource(const ZydisInstructionDecoderContext *ctx);
const ZyDisInstructionDecoderContext *ctx);
/** /**
* @brief Sets a new data source. * @brief Sets a new data source.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @param input The context of the new input data source. * @param input The context of the new input data source.
*/ */
ZYDIS_EXPORT void ZyDisInstructionDecoder_SetDataSource( void ZydisInstructionDecoder_SetDataSource(ZydisInstructionDecoderContext *ctx,
ZyDisInstructionDecoderContext *ctx, ZydisBaseInputContext *input);
ZyDisBaseDataSourceContext *input);
/** /**
* @brief Returns the current disassembler mode. * @brief Returns the current disassembler mode.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @return The current disassembler mode. * @return The current disassembler mode.
*/ */
ZYDIS_EXPORT ZyDisDisassemblerMode ZyDisInstructionDecoder_GetDisassemblerMode( ZydisDisassemblerMode ZydisInstructionDecoder_GetDisassemblerMode(ZydisInstructionDecoderContext *ctx);
const ZyDisInstructionDecoderContext *ctx);
/** /**
* @brief Sets the current disassembler mode. * @brief Sets the current disassembler mode.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @param disassemblerMode The new disassembler mode. * @param disassemblerMode The new disassembler mode.
*/ */
ZYDIS_EXPORT void ZyDisInstructionDecoder_SetDisassemblerMode( void ZydisInstructionDecoder_SetDisassemblerMode(ZydisInstructionDecoderContext *ctx,
ZyDisInstructionDecoderContext *ctx, ZydisDisassemblerMode disassemblerMode);
ZyDisDisassemblerMode disassemblerMode);
/** /**
* @brief Returns the preferred instruction-set vendor. * @brief Returns the preferred instruction-set vendor.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @return The preferred instruction-set vendor. * @return The preferred instruction-set vendor.
*/ */
ZYDIS_EXPORT ZyDisInstructionSetVendor ZyDisInstructionDecoder_GetPreferredVendor( ZydisInstructionSetVendor ZydisInstructionDecoder_GetPreferredVendor(
const ZyDisInstructionDecoderContext *ctx); const ZydisInstructionDecoderContext *ctx);
/** /**
* @brief Sets the preferred instruction-set vendor. * @brief Sets the preferred instruction-set vendor.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @param preferredVendor The new preferred instruction-set vendor. * @param preferredVendor The new preferred instruction-set vendor.
*/ */
ZYDIS_EXPORT void ZyDisInstructionDecoder_SetPreferredVendor( void ZydisInstructionDecoder_SetPreferredVendor(ZydisInstructionDecoderContext *ctx,
ZyDisInstructionDecoderContext *ctx, ZydisInstructionSetVendor preferredVendor);
ZyDisInstructionSetVendor preferredVendor);
/** /**
* @brief Returns the current instruction pointer. * @brief Returns the current instruction pointer.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @return The current instruction pointer. * @return The current instruction pointer.
*/ */
ZYDIS_EXPORT uint64_t ZyDisInstructionDecoder_GetInstructionPointer( uint64_t ZydisInstructionDecoder_GetInstructionPointer(ZydisInstructionDecoderContext *ctx);
const ZyDisInstructionDecoderContext *ctx);
/** /**
* @brief Sets a new instruction pointer. * @brief Sets a new instruction pointer.
* @param ctx The instruction decoder context. * @param ctx The instruction decoder context.
* @param instructionPointer The new instruction pointer. * @param instructionPointer The new instruction pointer.
*/ */
ZYDIS_EXPORT void ZyDisInstructionDecoder_SetInstructionPointer( void ZydisInstructionDecoder_SetInstructionPointer(ZydisInstructionDecoderContext *ctx,
ZyDisInstructionDecoderContext *ctx,
uint64_t instructionPointer); uint64_t instructionPointer);
/* ============================================================================================= */ /* ============================================================================================= */
@ -329,4 +250,4 @@ ZYDIS_EXPORT void ZyDisInstructionDecoder_SetInstructionPointer(
} }
#endif #endif
#endif /* _VDE_ZyDisINSTRUCTIONDECODERC_H_ */ #endif /* _ZYDIS_INSTRUCTIONDECODER_H_ */

View File

@ -0,0 +1,251 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#include "ZydisInstructionFormatter.h"
#include "ZydisInstructionFormatter.hpp"
/* Helpers ===================================================================================== */
namespace
{
inline Zydis::BaseSymbolResolver* ZydisBaseSymbolResolver_CppPtr(
ZydisBaseSymbolResolverContext *ctx)
{
return reinterpret_cast<Zydis::BaseSymbolResolver*>(ctx);
}
inline const Zydis::BaseSymbolResolver* ZydisBaseSymbolResolver_CppPtr(
const ZydisBaseSymbolResolverContext *ctx)
{
return reinterpret_cast<const Zydis::BaseSymbolResolver*>(ctx);
}
inline ZydisBaseSymbolResolverContext* ZydisBaseSymbolResolver_CPtr(
Zydis::BaseSymbolResolver *ptr)
{
return reinterpret_cast<ZydisBaseSymbolResolverContext*>(ptr);
}
inline const ZydisBaseSymbolResolverContext* ZydisBaseSymbolResolver_CPtr(
const Zydis::BaseSymbolResolver *ptr)
{
return reinterpret_cast<const ZydisBaseSymbolResolverContext*>(ptr);
}
inline Zydis::ExactSymbolResolver* ZydisExactSymbolResolver_CppPtr(
ZydisBaseSymbolResolverContext *ctx)
{
return reinterpret_cast<Zydis::ExactSymbolResolver*>(ctx);
}
inline const Zydis::ExactSymbolResolver* ZydisExactSymbolResolver_CppPtr(
const ZydisBaseSymbolResolverContext *ctx)
{
return reinterpret_cast<const Zydis::ExactSymbolResolver*>(ctx);
}
inline ZydisBaseSymbolResolverContext* ZydisExactSymbolResolver_CPtr(
Zydis::ExactSymbolResolver *ptr)
{
return reinterpret_cast<ZydisBaseSymbolResolverContext*>(ptr);
}
inline const ZydisBaseSymbolResolverContext* ZydisExactSymbolResolver_CPtr(
const Zydis::ExactSymbolResolver *ptr)
{
return reinterpret_cast<const ZydisBaseSymbolResolverContext*>(ptr);
}
inline Zydis::InstructionInfo* ZydisInstructionInfo_CppPtr(
ZydisInstructionInfo *ptr)
{
static_assert(sizeof(*ptr) == sizeof(Zydis::InstructionInfo), "broken struct");
return reinterpret_cast<Zydis::InstructionInfo*>(ptr);
}
inline const Zydis::InstructionInfo* ZydisInstructionInfo_CppPtr(
const ZydisInstructionInfo *ptr)
{
static_assert(sizeof(*ptr) == sizeof(Zydis::InstructionInfo), "broken struct");
return reinterpret_cast<const Zydis::InstructionInfo*>(ptr);
}
inline ZydisInstructionInfo* ZydisInstructionInfo_CPtr(
Zydis::InstructionInfo *ptr)
{
return reinterpret_cast<ZydisInstructionInfo*>(ptr);
}
inline const ZydisInstructionInfo* ZydisInstructionInfo_CPtr(
const Zydis::InstructionInfo *ptr)
{
return reinterpret_cast<const ZydisInstructionInfo*>(ptr);
}
inline Zydis::BaseInstructionFormatter* ZydisBaseInstructionFormatter_CppPtr(
ZydisBaseInstructionFormatterContext *ctx)
{
return reinterpret_cast<Zydis::BaseInstructionFormatter*>(ctx);
}
inline const Zydis::BaseInstructionFormatter* ZydisBaseInstructionFormatter_CppPtr(
const ZydisBaseInstructionFormatterContext *ctx)
{
return reinterpret_cast<const Zydis::BaseInstructionFormatter*>(ctx);
}
inline Zydis::BaseInstructionFormatter* ZydisIntelInstructionFormatter_CppPtr(
ZydisBaseInstructionFormatterContext *ctx)
{
return reinterpret_cast<Zydis::BaseInstructionFormatter*>(ctx);
}
inline const Zydis::BaseInstructionFormatter* ZydisIntelInstructionFormatter_CppPtr(
const ZydisBaseInstructionFormatterContext *ctx)
{
return reinterpret_cast<const Zydis::BaseInstructionFormatter*>(ctx);
}
inline ZydisBaseInstructionFormatterContext* ZydisIntelInstructionFormatter_CPtr(
Zydis::BaseInstructionFormatter *ctx)
{
return reinterpret_cast<ZydisBaseInstructionFormatterContext*>(ctx);
}
inline const ZydisBaseInstructionFormatterContext* ZydisIntelInstructionFormatter_CPtr(
const Zydis::BaseInstructionFormatter *ctx)
{
return reinterpret_cast<const ZydisBaseInstructionFormatterContext*>(ctx);
}
}
/* BaseSymbolResolver ======================================================================== */
void ZydisBaseSymbolResolver_Release(
ZydisBaseSymbolResolverContext *ctx)
{
delete ZydisBaseSymbolResolver_CppPtr(ctx);
}
const char* ZydisBaseSymbolResolver_ResolveSymbol(
ZydisBaseSymbolResolverContext *ctx,
const ZydisInstructionInfo *info,
uint64_t address,
uint64_t *offset)
{
return ZydisBaseSymbolResolver_CppPtr(ctx)->resolveSymbol(
*ZydisInstructionInfo_CppPtr(info),
address,
*offset);
}
/* ExactSymbolResolver ======================================================================= */
ZydisBaseSymbolResolverContext* ZydisExactSymbolResolver_Create(void)
{
return ZydisExactSymbolResolver_CPtr(new Zydis::ExactSymbolResolver);
}
bool EZydisxactSymbolResolver_ContainsSymbol(
ZydisBaseSymbolResolverContext *ctx,
uint64_t address)
{
return ZydisExactSymbolResolver_CppPtr(ctx)->containsSymbol(address);
}
void ZydisExactSymbolResolverContext_SetSymbol(
ZydisBaseSymbolResolverContext *ctx,
uint64_t address,
const char* name)
{
ZydisExactSymbolResolver_CppPtr(ctx)->setSymbol(address, name);
}
void ZydisExactSymbolResolverContext_RemoveSymbol(
ZydisBaseSymbolResolverContext *ctx,
uint64_t address)
{
ZydisExactSymbolResolver_CppPtr(ctx)->removeSymbol(address);
}
void ZydisExactSymbolResolverContext_Clear(
ZydisBaseSymbolResolverContext *ctx)
{
ZydisExactSymbolResolver_CppPtr(ctx)->clear();
}
/* BaseInstructionFormatter ================================================================== */
const char* ZydisBaseInstructionFormatter_FormatInstruction(
ZydisBaseInstructionFormatterContext *ctx,
const ZydisInstructionInfo *info)
{
return ZydisBaseInstructionFormatter_CppPtr(ctx)->formatInstruction(
*ZydisInstructionInfo_CppPtr(info));
}
ZydisBaseSymbolResolverContext* ZydisBaseInstructionFormatter_GetSymbolResolver(
const ZydisBaseInstructionFormatterContext *ctx)
{
return ZydisBaseSymbolResolver_CPtr(
ZydisBaseInstructionFormatter_CppPtr(ctx)->getSymbolResolver());
}
void ZydisBaseInstructionFormatter_SetSymbolResolver(
ZydisBaseInstructionFormatterContext *ctx,
ZydisBaseSymbolResolverContext *resolver)
{
ZydisBaseInstructionFormatter_CppPtr(ctx)->setSymbolResolver(
ZydisBaseSymbolResolver_CppPtr(resolver));
}
void ZydisBaseInstructionFormatter_Release(
ZydisBaseInstructionFormatterContext *ctx)
{
delete ZydisBaseInstructionFormatter_CppPtr(ctx);
}
/* IntelInstructionFormatter ================================================================ */
ZydisBaseInstructionFormatterContext* ZydisIntelInstructionFormatter_Create(void)
{
return ZydisIntelInstructionFormatter_CPtr(new Zydis::IntelInstructionFormatter);
}
ZydisBaseInstructionFormatterContext* ZydisIntelInstructionFormatter_CreateEx(
ZydisBaseSymbolResolverContext *resolver)
{
return ZydisIntelInstructionFormatter_CPtr(new Zydis::IntelInstructionFormatter(
ZydisBaseSymbolResolver_CppPtr(resolver)));
}
/* ============================================================================================= */

View File

@ -0,0 +1,104 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#ifndef _ZYDIS_INSTRUCTIONFORMATTER_H_
#define _ZYDIS_INSTRUCTIONFORMATTER_H_
#include "ZydisTypes.h"
#include "ZydisSymbolResolver.h"
#ifdef __cplusplus
extern "C"
{
#endif
/* BaseInstructionFormatter ================================================================== */
typedef struct _ZydisBaseInstructionFormatterContext {int a;} ZydisBaseInstructionFormatterContext;
/**
* @brief Formats a decoded instruction.
* @param ctx The instruction formatter context.
* @param info The instruction info.
* @return Pointer to the formatted instruction string. This pointer remains valid until
* this function is called again or the context is released.
*/
const char* ZydisBaseInstructionFormatter_FormatInstruction(
ZydisBaseInstructionFormatterContext *ctx, const ZydisInstructionInfo *info);
/**
* @brief Returns a pointer to the current symbol resolver.
* @param ctx The instruction formatter context.
* @return Pointer to the current symbol resolver or @c NULL if no symbol resolver is used.
*/
ZydisBaseSymbolResolverContext* ZydisBaseInstructionFormatter_GetSymbolResolver(
const ZydisBaseInstructionFormatterContext *ctx);
/**
* @brief Sets a new symbol resolver.
* @param ctx The instruction formatter context.
* @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol
* resolver should be used.
*/
void ZydisBaseInstructionFormatter_SetSymbolResolver(ZydisBaseInstructionFormatterContext *ctx,
ZydisBaseSymbolResolverContext *resolver);
/**
* @brief Releases an instruction formatter.
* @param ctx The context of the instruction formatter to release.
* The context may no longer used after it has been released.
*/
void ZydisBaseInstructionFormatter_Release(ZydisBaseInstructionFormatterContext *ctx);
/* IntelInstructionFormatter ================================================================ */
/**
* @brief Creates an Intel-syntax instruction formatter.
* @return @c NULL if it fails, else an Intel instruction formatter context.
* @see BaseInstructionFormatter_Release
*/
ZydisBaseInstructionFormatterContext* ZydisIntelInstructionFormatter_Create(void);
/**
* @brief Creates an Intel-syntax instruction formatter.
* @param resolver The symbol resolver consulted to resolve symbols on formatting.
* @return @c NULL if it fails, else an Intel instruction formatter context.
* @see BaseInstructionFormatter_Release
*/
ZydisBaseInstructionFormatterContext* ZydisIntelInstructionFormatter_CreateEx(
ZydisBaseSymbolResolverContext *resolver);
/* ============================================================================================= */
#ifdef __cplusplus
}
#endif
#endif /* _ZYDIS_INSTRUCTIONFORMATTER_H_ */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : athre0z Modifications : Joel Höner
Last change : 19. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,14 +26,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#include <ZyDisDisassembler.h> #include "ZydisOpcodeTable.h"
#include "ZydisOpcodeTable.hpp"
int main(int argc, char* argv[])
{
ZYDIS_UNUSED(argc); ZYDIS_UNUSED(argv);
// TODO:
return 0;
}

View File

@ -0,0 +1,961 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#ifndef _ZYDIS_OPCODETABLE_H_
#define _ZYDIS_OPCODETABLE_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* @brief Values that represent an instruction mnemonic.
*/
typedef enum _ZydisInstructionMnemonic /* : uint16_t */
{
/* 000 */ ZYDIS_MNEM_INVALID,
/* 001 */ ZYDIS_MNEM_AAA,
/* 002 */ ZYDIS_MNEM_AAD,
/* 003 */ ZYDIS_MNEM_AAM,
/* 004 */ ZYDIS_MNEM_AAS,
/* 005 */ ZYDIS_MNEM_ADC,
/* 006 */ ZYDIS_MNEM_ADD,
/* 007 */ ZYDIS_MNEM_ADDPD,
/* 008 */ ZYDIS_MNEM_ADDPS,
/* 009 */ ZYDIS_MNEM_ADDSD,
/* 00A */ ZYDIS_MNEM_ADDSS,
/* 00B */ ZYDIS_MNEM_ADDSUBPD,
/* 00C */ ZYDIS_MNEM_ADDSUBPS,
/* 00D */ ZYDIS_MNEM_AESDEC,
/* 00E */ ZYDIS_MNEM_AESDECLAST,
/* 00F */ ZYDIS_MNEM_AESENC,
/* 010 */ ZYDIS_MNEM_AESENCLAST,
/* 011 */ ZYDIS_MNEM_AESIMC,
/* 012 */ ZYDIS_MNEM_AESKEYGENASSIST,
/* 013 */ ZYDIS_MNEM_AND,
/* 014 */ ZYDIS_MNEM_ANDNPD,
/* 015 */ ZYDIS_MNEM_ANDNPS,
/* 016 */ ZYDIS_MNEM_ANDPD,
/* 017 */ ZYDIS_MNEM_ANDPS,
/* 018 */ ZYDIS_MNEM_ARPL,
/* 019 */ ZYDIS_MNEM_BLENDPD,
/* 01A */ ZYDIS_MNEM_BLENDPS,
/* 01B */ ZYDIS_MNEM_BLENDVPD,
/* 01C */ ZYDIS_MNEM_BLENDVPS,
/* 01D */ ZYDIS_MNEM_BOUND,
/* 01E */ ZYDIS_MNEM_BSF,
/* 01F */ ZYDIS_MNEM_BSR,
/* 020 */ ZYDIS_MNEM_BSWAP,
/* 021 */ ZYDIS_MNEM_BT,
/* 022 */ ZYDIS_MNEM_BTC,
/* 023 */ ZYDIS_MNEM_BTR,
/* 024 */ ZYDIS_MNEM_BTS,
/* 025 */ ZYDIS_MNEM_CALL,
/* 026 */ ZYDIS_MNEM_CBW,
/* 027 */ ZYDIS_MNEM_CDQ,
/* 028 */ ZYDIS_MNEM_CDQE,
/* 029 */ ZYDIS_MNEM_CLC,
/* 02A */ ZYDIS_MNEM_CLD,
/* 02B */ ZYDIS_MNEM_CLFLUSH,
/* 02C */ ZYDIS_MNEM_CLGI,
/* 02D */ ZYDIS_MNEM_CLI,
/* 02E */ ZYDIS_MNEM_CLTS,
/* 02F */ ZYDIS_MNEM_CMC,
/* 030 */ ZYDIS_MNEM_CMOVA,
/* 031 */ ZYDIS_MNEM_CMOVAE,
/* 032 */ ZYDIS_MNEM_CMOVB,
/* 033 */ ZYDIS_MNEM_CMOVBE,
/* 034 */ ZYDIS_MNEM_CMOVE,
/* 035 */ ZYDIS_MNEM_CMOVG,
/* 036 */ ZYDIS_MNEM_CMOVGE,
/* 037 */ ZYDIS_MNEM_CMOVL,
/* 038 */ ZYDIS_MNEM_CMOVLE,
/* 039 */ ZYDIS_MNEM_CMOVNE,
/* 03A */ ZYDIS_MNEM_CMOVNO,
/* 03B */ ZYDIS_MNEM_CMOVNP,
/* 03C */ ZYDIS_MNEM_CMOVNS,
/* 03D */ ZYDIS_MNEM_CMOVO,
/* 03E */ ZYDIS_MNEM_CMOVP,
/* 03F */ ZYDIS_MNEM_CMOVS,
/* 040 */ ZYDIS_MNEM_CMP,
/* 041 */ ZYDIS_MNEM_CMPPD,
/* 042 */ ZYDIS_MNEM_CMPPS,
/* 043 */ ZYDIS_MNEM_CMPSB,
/* 044 */ ZYDIS_MNEM_CMPSD,
/* 045 */ ZYDIS_MNEM_CMPSQ,
/* 046 */ ZYDIS_MNEM_CMPSS,
/* 047 */ ZYDIS_MNEM_CMPSW,
/* 048 */ ZYDIS_MNEM_CMPXCHG,
/* 049 */ ZYDIS_MNEM_CMPXCHG16B,
/* 04A */ ZYDIS_MNEM_CMPXCHG8B,
/* 04B */ ZYDIS_MNEM_COMISD,
/* 04C */ ZYDIS_MNEM_COMISS,
/* 04D */ ZYDIS_MNEM_CPUID,
/* 04E */ ZYDIS_MNEM_CQO,
/* 04F */ ZYDIS_MNEM_CRC32,
/* 050 */ ZYDIS_MNEM_CVTDQ2PD,
/* 051 */ ZYDIS_MNEM_CVTDQ2PS,
/* 052 */ ZYDIS_MNEM_CVTPD2DQ,
/* 053 */ ZYDIS_MNEM_CVTPD2PI,
/* 054 */ ZYDIS_MNEM_CVTPD2PS,
/* 055 */ ZYDIS_MNEM_CVTPI2PD,
/* 056 */ ZYDIS_MNEM_CVTPI2PS,
/* 057 */ ZYDIS_MNEM_CVTPS2DQ,
/* 058 */ ZYDIS_MNEM_CVTPS2PD,
/* 059 */ ZYDIS_MNEM_CVTPS2PI,
/* 05A */ ZYDIS_MNEM_CVTSD2SI,
/* 05B */ ZYDIS_MNEM_CVTSD2SS,
/* 05C */ ZYDIS_MNEM_CVTSI2SD,
/* 05D */ ZYDIS_MNEM_CVTSI2SS,
/* 05E */ ZYDIS_MNEM_CVTSS2SD,
/* 05F */ ZYDIS_MNEM_CVTSS2SI,
/* 060 */ ZYDIS_MNEM_CVTTPD2DQ,
/* 061 */ ZYDIS_MNEM_CVTTPD2PI,
/* 062 */ ZYDIS_MNEM_CVTTPS2DQ,
/* 063 */ ZYDIS_MNEM_CVTTPS2PI,
/* 064 */ ZYDIS_MNEM_CVTTSD2SI,
/* 065 */ ZYDIS_MNEM_CVTTSS2SI,
/* 066 */ ZYDIS_MNEM_CWD,
/* 067 */ ZYDIS_MNEM_CWDE,
/* 068 */ ZYDIS_MNEM_DAA,
/* 069 */ ZYDIS_MNEM_DAS,
/* 06A */ ZYDIS_MNEM_DEC,
/* 06B */ ZYDIS_MNEM_DIV,
/* 06C */ ZYDIS_MNEM_DIVPD,
/* 06D */ ZYDIS_MNEM_DIVPS,
/* 06E */ ZYDIS_MNEM_DIVSD,
/* 06F */ ZYDIS_MNEM_DIVSS,
/* 070 */ ZYDIS_MNEM_DPPD,
/* 071 */ ZYDIS_MNEM_DPPS,
/* 072 */ ZYDIS_MNEM_EMMS,
/* 073 */ ZYDIS_MNEM_ENTER,
/* 074 */ ZYDIS_MNEM_EXTRACTPS,
/* 075 */ ZYDIS_MNEM_F2XM1,
/* 076 */ ZYDIS_MNEM_FABS,
/* 077 */ ZYDIS_MNEM_FADD,
/* 078 */ ZYDIS_MNEM_FADDP,
/* 079 */ ZYDIS_MNEM_FBLD,
/* 07A */ ZYDIS_MNEM_FBSTP,
/* 07B */ ZYDIS_MNEM_FCHS,
/* 07C */ ZYDIS_MNEM_FCLEX,
/* 07D */ ZYDIS_MNEM_FCMOVB,
/* 07E */ ZYDIS_MNEM_FCMOVBE,
/* 07F */ ZYDIS_MNEM_FCMOVE,
/* 080 */ ZYDIS_MNEM_FCMOVNB,
/* 081 */ ZYDIS_MNEM_FCMOVNBE,
/* 082 */ ZYDIS_MNEM_FCMOVNE,
/* 083 */ ZYDIS_MNEM_FCMOVNU,
/* 084 */ ZYDIS_MNEM_FCMOVU,
/* 085 */ ZYDIS_MNEM_FCOM,
/* 086 */ ZYDIS_MNEM_FCOM2,
/* 087 */ ZYDIS_MNEM_FCOMI,
/* 088 */ ZYDIS_MNEM_FCOMIP,
/* 089 */ ZYDIS_MNEM_FCOMP,
/* 08A */ ZYDIS_MNEM_FCOMP3,
/* 08B */ ZYDIS_MNEM_FCOMP5,
/* 08C */ ZYDIS_MNEM_FCOMPP,
/* 08D */ ZYDIS_MNEM_FCOS,
/* 08E */ ZYDIS_MNEM_FDECSTP,
/* 08F */ ZYDIS_MNEM_FDIV,
/* 090 */ ZYDIS_MNEM_FDIVP,
/* 091 */ ZYDIS_MNEM_FDIVR,
/* 092 */ ZYDIS_MNEM_FDIVRP,
/* 093 */ ZYDIS_MNEM_FEMMS,
/* 094 */ ZYDIS_MNEM_FFREE,
/* 095 */ ZYDIS_MNEM_FFREEP,
/* 096 */ ZYDIS_MNEM_FIADD,
/* 097 */ ZYDIS_MNEM_FICOM,
/* 098 */ ZYDIS_MNEM_FICOMP,
/* 099 */ ZYDIS_MNEM_FIDIV,
/* 09A */ ZYDIS_MNEM_FIDIVR,
/* 09B */ ZYDIS_MNEM_FILD,
/* 09C */ ZYDIS_MNEM_FIMUL,
/* 09D */ ZYDIS_MNEM_FINCSTP,
/* 09E */ ZYDIS_MNEM_FIST,
/* 09F */ ZYDIS_MNEM_FISTP,
/* 0A0 */ ZYDIS_MNEM_FISTTP,
/* 0A1 */ ZYDIS_MNEM_FISUB,
/* 0A2 */ ZYDIS_MNEM_FISUBR,
/* 0A3 */ ZYDIS_MNEM_FLD,
/* 0A4 */ ZYDIS_MNEM_FLD1,
/* 0A5 */ ZYDIS_MNEM_FLDCW,
/* 0A6 */ ZYDIS_MNEM_FLDENV,
/* 0A7 */ ZYDIS_MNEM_FLDL2E,
/* 0A8 */ ZYDIS_MNEM_FLDL2T,
/* 0A9 */ ZYDIS_MNEM_FLDLG2,
/* 0AA */ ZYDIS_MNEM_FLDLN2,
/* 0AB */ ZYDIS_MNEM_FLDPI,
/* 0AC */ ZYDIS_MNEM_FLDZ,
/* 0AD */ ZYDIS_MNEM_FMUL,
/* 0AE */ ZYDIS_MNEM_FMULP,
/* 0AF */ ZYDIS_MNEM_FNDISI,
/* 0B0 */ ZYDIS_MNEM_FNENI,
/* 0B1 */ ZYDIS_MNEM_FNINIT,
/* 0B2 */ ZYDIS_MNEM_FNOP,
/* 0B3 */ ZYDIS_MNEM_FNSAVE,
/* 0B4 */ ZYDIS_MNEM_FNSETPM,
/* 0B5 */ ZYDIS_MNEM_FNSTCW,
/* 0B6 */ ZYDIS_MNEM_FNSTENV,
/* 0B7 */ ZYDIS_MNEM_FNSTSW,
/* 0B8 */ ZYDIS_MNEM_FPATAN,
/* 0B9 */ ZYDIS_MNEM_FPREM,
/* 0BA */ ZYDIS_MNEM_FPREM1,
/* 0BB */ ZYDIS_MNEM_FPTAN,
/* 0BC */ ZYDIS_MNEM_FRNDINT,
/* 0BD */ ZYDIS_MNEM_FRSTOR,
/* 0BE */ ZYDIS_MNEM_FRSTPM,
/* 0BF */ ZYDIS_MNEM_FSCALE,
/* 0C0 */ ZYDIS_MNEM_FSIN,
/* 0C1 */ ZYDIS_MNEM_FSINCOS,
/* 0C2 */ ZYDIS_MNEM_FSQRT,
/* 0C3 */ ZYDIS_MNEM_FST,
/* 0C4 */ ZYDIS_MNEM_FSTP,
/* 0C5 */ ZYDIS_MNEM_FSTP1,
/* 0C6 */ ZYDIS_MNEM_FSTP8,
/* 0C7 */ ZYDIS_MNEM_FSTP9,
/* 0C8 */ ZYDIS_MNEM_FSUB,
/* 0C9 */ ZYDIS_MNEM_FSUBP,
/* 0CA */ ZYDIS_MNEM_FSUBR,
/* 0CB */ ZYDIS_MNEM_FSUBRP,
/* 0CC */ ZYDIS_MNEM_FTST,
/* 0CD */ ZYDIS_MNEM_FUCOM,
/* 0CE */ ZYDIS_MNEM_FUCOMI,
/* 0CF */ ZYDIS_MNEM_FUCOMIP,
/* 0D0 */ ZYDIS_MNEM_FUCOMP,
/* 0D1 */ ZYDIS_MNEM_FUCOMPP,
/* 0D2 */ ZYDIS_MNEM_FXAM,
/* 0D3 */ ZYDIS_MNEM_FXCH,
/* 0D4 */ ZYDIS_MNEM_FXCH4,
/* 0D5 */ ZYDIS_MNEM_FXCH7,
/* 0D6 */ ZYDIS_MNEM_FXRSTOR,
/* 0D7 */ ZYDIS_MNEM_FXSAVE,
/* 0D8 */ ZYDIS_MNEM_FXTRACT,
/* 0D9 */ ZYDIS_MNEM_FYL2X,
/* 0DA */ ZYDIS_MNEM_FYL2XP1,
/* 0DB */ ZYDIS_MNEM_GETSEC,
/* 0DC */ ZYDIS_MNEM_HADDPD,
/* 0DD */ ZYDIS_MNEM_HADDPS,
/* 0DE */ ZYDIS_MNEM_HLT,
/* 0DF */ ZYDIS_MNEM_HSUBPD,
/* 0E0 */ ZYDIS_MNEM_HSUBPS,
/* 0E1 */ ZYDIS_MNEM_IDIV,
/* 0E2 */ ZYDIS_MNEM_IMUL,
/* 0E3 */ ZYDIS_MNEM_IN,
/* 0E4 */ ZYDIS_MNEM_INC,
/* 0E5 */ ZYDIS_MNEM_INSB,
/* 0E6 */ ZYDIS_MNEM_INSD,
/* 0E7 */ ZYDIS_MNEM_INSERTPS,
/* 0E8 */ ZYDIS_MNEM_INSW,
/* 0E9 */ ZYDIS_MNEM_INT,
/* 0EA */ ZYDIS_MNEM_INT1,
/* 0EB */ ZYDIS_MNEM_INT3,
/* 0EC */ ZYDIS_MNEM_INTO,
/* 0ED */ ZYDIS_MNEM_INVD,
/* 0EE */ ZYDIS_MNEM_INVEPT,
/* 0EF */ ZYDIS_MNEM_INVLPG,
/* 0F0 */ ZYDIS_MNEM_INVLPGA,
/* 0F1 */ ZYDIS_MNEM_INVVPID,
/* 0F2 */ ZYDIS_MNEM_IRETD,
/* 0F3 */ ZYDIS_MNEM_IRETQ,
/* 0F4 */ ZYDIS_MNEM_IRETW,
/* 0F5 */ ZYDIS_MNEM_JA,
/* 0F6 */ ZYDIS_MNEM_JB,
/* 0F7 */ ZYDIS_MNEM_JBE,
/* 0F8 */ ZYDIS_MNEM_JCXZ,
/* 0F9 */ ZYDIS_MNEM_JE,
/* 0FA */ ZYDIS_MNEM_JECXZ,
/* 0FB */ ZYDIS_MNEM_JG,
/* 0FC */ ZYDIS_MNEM_JGE,
/* 0FD */ ZYDIS_MNEM_JL,
/* 0FE */ ZYDIS_MNEM_JLE,
/* 0FF */ ZYDIS_MNEM_JMP,
/* 100 */ ZYDIS_MNEM_JNB,
/* 101 */ ZYDIS_MNEM_JNE,
/* 102 */ ZYDIS_MNEM_JNO,
/* 103 */ ZYDIS_MNEM_JNP,
/* 104 */ ZYDIS_MNEM_JNS,
/* 105 */ ZYDIS_MNEM_JO,
/* 106 */ ZYDIS_MNEM_JP,
/* 107 */ ZYDIS_MNEM_JRCXZ,
/* 108 */ ZYDIS_MNEM_JS,
/* 109 */ ZYDIS_MNEM_LAHF,
/* 10A */ ZYDIS_MNEM_LAR,
/* 10B */ ZYDIS_MNEM_LDDQU,
/* 10C */ ZYDIS_MNEM_LDMXCSR,
/* 10D */ ZYDIS_MNEM_LDS,
/* 10E */ ZYDIS_MNEM_LEA,
/* 10F */ ZYDIS_MNEM_LEAVE,
/* 110 */ ZYDIS_MNEM_LES,
/* 111 */ ZYDIS_MNEM_LFENCE,
/* 112 */ ZYDIS_MNEM_LFS,
/* 113 */ ZYDIS_MNEM_LGDT,
/* 114 */ ZYDIS_MNEM_LGS,
/* 115 */ ZYDIS_MNEM_LIDT,
/* 116 */ ZYDIS_MNEM_LLDT,
/* 117 */ ZYDIS_MNEM_LMSW,
/* 118 */ ZYDIS_MNEM_LOCK,
/* 119 */ ZYDIS_MNEM_LODSB,
/* 11A */ ZYDIS_MNEM_LODSD,
/* 11B */ ZYDIS_MNEM_LODSQ,
/* 11C */ ZYDIS_MNEM_LODSW,
/* 11D */ ZYDIS_MNEM_LOOP,
/* 11E */ ZYDIS_MNEM_LOOPE,
/* 11F */ ZYDIS_MNEM_LOOPNE,
/* 120 */ ZYDIS_MNEM_LSL,
/* 121 */ ZYDIS_MNEM_LSS,
/* 122 */ ZYDIS_MNEM_LTR,
/* 123 */ ZYDIS_MNEM_MASKMOVDQU,
/* 124 */ ZYDIS_MNEM_MASKMOVQ,
/* 125 */ ZYDIS_MNEM_MAXPD,
/* 126 */ ZYDIS_MNEM_MAXPS,
/* 127 */ ZYDIS_MNEM_MAXSD,
/* 128 */ ZYDIS_MNEM_MAXSS,
/* 129 */ ZYDIS_MNEM_MFENCE,
/* 12A */ ZYDIS_MNEM_MINPD,
/* 12B */ ZYDIS_MNEM_MINPS,
/* 12C */ ZYDIS_MNEM_MINSD,
/* 12D */ ZYDIS_MNEM_MINSS,
/* 12E */ ZYDIS_MNEM_MONITOR,
/* 12F */ ZYDIS_MNEM_MONTMUL,
/* 130 */ ZYDIS_MNEM_MOV,
/* 131 */ ZYDIS_MNEM_MOVAPD,
/* 132 */ ZYDIS_MNEM_MOVAPS,
/* 133 */ ZYDIS_MNEM_MOVBE,
/* 134 */ ZYDIS_MNEM_MOVD,
/* 135 */ ZYDIS_MNEM_MOVDDUP,
/* 136 */ ZYDIS_MNEM_MOVDQ2Q,
/* 137 */ ZYDIS_MNEM_MOVDQA,
/* 138 */ ZYDIS_MNEM_MOVDQU,
/* 139 */ ZYDIS_MNEM_MOVHLPS,
/* 13A */ ZYDIS_MNEM_MOVHPD,
/* 13B */ ZYDIS_MNEM_MOVHPS,
/* 13C */ ZYDIS_MNEM_MOVLHPS,
/* 13D */ ZYDIS_MNEM_MOVLPD,
/* 13E */ ZYDIS_MNEM_MOVLPS,
/* 13F */ ZYDIS_MNEM_MOVMSKPD,
/* 140 */ ZYDIS_MNEM_MOVMSKPS,
/* 141 */ ZYDIS_MNEM_MOVNTDQ,
/* 142 */ ZYDIS_MNEM_MOVNTDQA,
/* 143 */ ZYDIS_MNEM_MOVNTI,
/* 144 */ ZYDIS_MNEM_MOVNTPD,
/* 145 */ ZYDIS_MNEM_MOVNTPS,
/* 146 */ ZYDIS_MNEM_MOVNTQ,
/* 147 */ ZYDIS_MNEM_MOVQ,
/* 148 */ ZYDIS_MNEM_MOVQ2DQ,
/* 149 */ ZYDIS_MNEM_MOVSB,
/* 14A */ ZYDIS_MNEM_MOVSD,
/* 14B */ ZYDIS_MNEM_MOVSHDUP,
/* 14C */ ZYDIS_MNEM_MOVSLDUP,
/* 14D */ ZYDIS_MNEM_MOVSQ,
/* 14E */ ZYDIS_MNEM_MOVSS,
/* 14F */ ZYDIS_MNEM_MOVSW,
/* 150 */ ZYDIS_MNEM_MOVSX,
/* 151 */ ZYDIS_MNEM_MOVSXD,
/* 152 */ ZYDIS_MNEM_MOVUPD,
/* 153 */ ZYDIS_MNEM_MOVUPS,
/* 154 */ ZYDIS_MNEM_MOVZX,
/* 155 */ ZYDIS_MNEM_MPSADBW,
/* 156 */ ZYDIS_MNEM_MUL,
/* 157 */ ZYDIS_MNEM_MULPD,
/* 158 */ ZYDIS_MNEM_MULPS,
/* 159 */ ZYDIS_MNEM_MULSD,
/* 15A */ ZYDIS_MNEM_MULSS,
/* 15B */ ZYDIS_MNEM_MWAIT,
/* 15C */ ZYDIS_MNEM_NEG,
/* 15D */ ZYDIS_MNEM_NOP,
/* 15E */ ZYDIS_MNEM_NOT,
/* 15F */ ZYDIS_MNEM_OR,
/* 160 */ ZYDIS_MNEM_ORPD,
/* 161 */ ZYDIS_MNEM_ORPS,
/* 162 */ ZYDIS_MNEM_OUT,
/* 163 */ ZYDIS_MNEM_OUTSB,
/* 164 */ ZYDIS_MNEM_OUTSD,
/* 165 */ ZYDIS_MNEM_OUTSW,
/* 166 */ ZYDIS_MNEM_PABSB,
/* 167 */ ZYDIS_MNEM_PABSD,
/* 168 */ ZYDIS_MNEM_PABSW,
/* 169 */ ZYDIS_MNEM_PACKSSDW,
/* 16A */ ZYDIS_MNEM_PACKSSWB,
/* 16B */ ZYDIS_MNEM_PACKUSDW,
/* 16C */ ZYDIS_MNEM_PACKUSWB,
/* 16D */ ZYDIS_MNEM_PADDB,
/* 16E */ ZYDIS_MNEM_PADDD,
/* 16F */ ZYDIS_MNEM_PADDQ,
/* 170 */ ZYDIS_MNEM_PADDSB,
/* 171 */ ZYDIS_MNEM_PADDSW,
/* 172 */ ZYDIS_MNEM_PADDUSB,
/* 173 */ ZYDIS_MNEM_PADDUSW,
/* 174 */ ZYDIS_MNEM_PADDW,
/* 175 */ ZYDIS_MNEM_PALIGNR,
/* 176 */ ZYDIS_MNEM_PAND,
/* 177 */ ZYDIS_MNEM_PANDN,
/* 178 */ ZYDIS_MNEM_PAUSE,
/* 179 */ ZYDIS_MNEM_PAVGB,
/* 17A */ ZYDIS_MNEM_PAVGUSB,
/* 17B */ ZYDIS_MNEM_PAVGW,
/* 17C */ ZYDIS_MNEM_PBLENDVB,
/* 17D */ ZYDIS_MNEM_PBLENDW,
/* 17E */ ZYDIS_MNEM_PCLMULQDQ,
/* 17F */ ZYDIS_MNEM_PCMPEQB,
/* 180 */ ZYDIS_MNEM_PCMPEQD,
/* 181 */ ZYDIS_MNEM_PCMPEQQ,
/* 182 */ ZYDIS_MNEM_PCMPEQW,
/* 183 */ ZYDIS_MNEM_PCMPESTRI,
/* 184 */ ZYDIS_MNEM_PCMPESTRM,
/* 185 */ ZYDIS_MNEM_PCMPGTB,
/* 186 */ ZYDIS_MNEM_PCMPGTD,
/* 187 */ ZYDIS_MNEM_PCMPGTQ,
/* 188 */ ZYDIS_MNEM_PCMPGTW,
/* 189 */ ZYDIS_MNEM_PCMPISTRI,
/* 18A */ ZYDIS_MNEM_PCMPISTRM,
/* 18B */ ZYDIS_MNEM_PEXTRB,
/* 18C */ ZYDIS_MNEM_PEXTRD,
/* 18D */ ZYDIS_MNEM_PEXTRQ,
/* 18E */ ZYDIS_MNEM_PEXTRW,
/* 18F */ ZYDIS_MNEM_PF2ID,
/* 190 */ ZYDIS_MNEM_PF2IW,
/* 191 */ ZYDIS_MNEM_PFACC,
/* 192 */ ZYDIS_MNEM_PFADD,
/* 193 */ ZYDIS_MNEM_PFCMPEQ,
/* 194 */ ZYDIS_MNEM_PFCMPGE,
/* 195 */ ZYDIS_MNEM_PFCMPGT,
/* 196 */ ZYDIS_MNEM_PFMAX,
/* 197 */ ZYDIS_MNEM_PFMIN,
/* 198 */ ZYDIS_MNEM_PFMUL,
/* 199 */ ZYDIS_MNEM_PFNACC,
/* 19A */ ZYDIS_MNEM_PFPNACC,
/* 19B */ ZYDIS_MNEM_PFRCP,
/* 19C */ ZYDIS_MNEM_PFRCPIT1,
/* 19D */ ZYDIS_MNEM_PFRCPIT2,
/* 19E */ ZYDIS_MNEM_PFRSQIT1,
/* 19F */ ZYDIS_MNEM_PFRSQRT,
/* 1A0 */ ZYDIS_MNEM_PFSUB,
/* 1A1 */ ZYDIS_MNEM_PFSUBR,
/* 1A2 */ ZYDIS_MNEM_PHADDD,
/* 1A3 */ ZYDIS_MNEM_PHADDSW,
/* 1A4 */ ZYDIS_MNEM_PHADDW,
/* 1A5 */ ZYDIS_MNEM_PHMINPOSUW,
/* 1A6 */ ZYDIS_MNEM_PHSUBD,
/* 1A7 */ ZYDIS_MNEM_PHSUBSW,
/* 1A8 */ ZYDIS_MNEM_PHSUBW,
/* 1A9 */ ZYDIS_MNEM_PI2FD,
/* 1AA */ ZYDIS_MNEM_PI2FW,
/* 1AB */ ZYDIS_MNEM_PINSRB,
/* 1AC */ ZYDIS_MNEM_PINSRD,
/* 1AD */ ZYDIS_MNEM_PINSRQ,
/* 1AE */ ZYDIS_MNEM_PINSRW,
/* 1AF */ ZYDIS_MNEM_PMADDUBSW,
/* 1B0 */ ZYDIS_MNEM_PMADDWD,
/* 1B1 */ ZYDIS_MNEM_PMAXSB,
/* 1B2 */ ZYDIS_MNEM_PMAXSD,
/* 1B3 */ ZYDIS_MNEM_PMAXSW,
/* 1B4 */ ZYDIS_MNEM_PMAXUB,
/* 1B5 */ ZYDIS_MNEM_PMAXUD,
/* 1B6 */ ZYDIS_MNEM_PMAXUW,
/* 1B7 */ ZYDIS_MNEM_PMINSB,
/* 1B8 */ ZYDIS_MNEM_PMINSD,
/* 1B9 */ ZYDIS_MNEM_PMINSW,
/* 1BA */ ZYDIS_MNEM_PMINUB,
/* 1BB */ ZYDIS_MNEM_PMINUD,
/* 1BC */ ZYDIS_MNEM_PMINUW,
/* 1BD */ ZYDIS_MNEM_PMOVMSKB,
/* 1BE */ ZYDIS_MNEM_PMOVSXBD,
/* 1BF */ ZYDIS_MNEM_PMOVSXBQ,
/* 1C0 */ ZYDIS_MNEM_PMOVSXBW,
/* 1C1 */ ZYDIS_MNEM_PMOVSXDQ,
/* 1C2 */ ZYDIS_MNEM_PMOVSXWD,
/* 1C3 */ ZYDIS_MNEM_PMOVSXWQ,
/* 1C4 */ ZYDIS_MNEM_PMOVZXBD,
/* 1C5 */ ZYDIS_MNEM_PMOVZXBQ,
/* 1C6 */ ZYDIS_MNEM_PMOVZXBW,
/* 1C7 */ ZYDIS_MNEM_PMOVZXDQ,
/* 1C8 */ ZYDIS_MNEM_PMOVZXWD,
/* 1C9 */ ZYDIS_MNEM_PMOVZXWQ,
/* 1CA */ ZYDIS_MNEM_PMULDQ,
/* 1CB */ ZYDIS_MNEM_PMULHRSW,
/* 1CC */ ZYDIS_MNEM_PMULHRW,
/* 1CD */ ZYDIS_MNEM_PMULHUW,
/* 1CE */ ZYDIS_MNEM_PMULHW,
/* 1CF */ ZYDIS_MNEM_PMULLD,
/* 1D0 */ ZYDIS_MNEM_PMULLW,
/* 1D1 */ ZYDIS_MNEM_PMULUDQ,
/* 1D2 */ ZYDIS_MNEM_POP,
/* 1D3 */ ZYDIS_MNEM_POPA,
/* 1D4 */ ZYDIS_MNEM_POPAD,
/* 1D5 */ ZYDIS_MNEM_POPCNT,
/* 1D6 */ ZYDIS_MNEM_POPFD,
/* 1D7 */ ZYDIS_MNEM_POPFQ,
/* 1D8 */ ZYDIS_MNEM_POPFW,
/* 1D9 */ ZYDIS_MNEM_POR,
/* 1DA */ ZYDIS_MNEM_PREFETCH,
/* 1DB */ ZYDIS_MNEM_PREFETCHNTA,
/* 1DC */ ZYDIS_MNEM_PREFETCHT0,
/* 1DD */ ZYDIS_MNEM_PREFETCHT1,
/* 1DE */ ZYDIS_MNEM_PREFETCHT2,
/* 1DF */ ZYDIS_MNEM_PSADBW,
/* 1E0 */ ZYDIS_MNEM_PSHUFB,
/* 1E1 */ ZYDIS_MNEM_PSHUFD,
/* 1E2 */ ZYDIS_MNEM_PSHUFHW,
/* 1E3 */ ZYDIS_MNEM_PSHUFLW,
/* 1E4 */ ZYDIS_MNEM_PSHUFW,
/* 1E5 */ ZYDIS_MNEM_PSIGNB,
/* 1E6 */ ZYDIS_MNEM_PSIGND,
/* 1E7 */ ZYDIS_MNEM_PSIGNW,
/* 1E8 */ ZYDIS_MNEM_PSLLD,
/* 1E9 */ ZYDIS_MNEM_PSLLDQ,
/* 1EA */ ZYDIS_MNEM_PSLLQ,
/* 1EB */ ZYDIS_MNEM_PSLLW,
/* 1EC */ ZYDIS_MNEM_PSRAD,
/* 1ED */ ZYDIS_MNEM_PSRAW,
/* 1EE */ ZYDIS_MNEM_PSRLD,
/* 1EF */ ZYDIS_MNEM_PSRLDQ,
/* 1F0 */ ZYDIS_MNEM_PSRLQ,
/* 1F1 */ ZYDIS_MNEM_PSRLW,
/* 1F2 */ ZYDIS_MNEM_PSUBB,
/* 1F3 */ ZYDIS_MNEM_PSUBD,
/* 1F4 */ ZYDIS_MNEM_PSUBQ,
/* 1F5 */ ZYDIS_MNEM_PSUBSB,
/* 1F6 */ ZYDIS_MNEM_PSUBSW,
/* 1F7 */ ZYDIS_MNEM_PSUBUSB,
/* 1F8 */ ZYDIS_MNEM_PSUBUSW,
/* 1F9 */ ZYDIS_MNEM_PSUBW,
/* 1FA */ ZYDIS_MNEM_PSWAPD,
/* 1FB */ ZYDIS_MNEM_PTEST,
/* 1FC */ ZYDIS_MNEM_PUNPCKHBW,
/* 1FD */ ZYDIS_MNEM_PUNPCKHDQ,
/* 1FE */ ZYDIS_MNEM_PUNPCKHQDQ,
/* 1FF */ ZYDIS_MNEM_PUNPCKHWD,
/* 200 */ ZYDIS_MNEM_PUNPCKLBW,
/* 201 */ ZYDIS_MNEM_PUNPCKLDQ,
/* 202 */ ZYDIS_MNEM_PUNPCKLQDQ,
/* 203 */ ZYDIS_MNEM_PUNPCKLWD,
/* 204 */ ZYDIS_MNEM_PUSH,
/* 205 */ ZYDIS_MNEM_PUSHA,
/* 206 */ ZYDIS_MNEM_PUSHAD,
/* 207 */ ZYDIS_MNEM_PUSHFD,
/* 208 */ ZYDIS_MNEM_PUSHFQ,
/* 209 */ ZYDIS_MNEM_PUSHFW,
/* 20A */ ZYDIS_MNEM_PXOR,
/* 20B */ ZYDIS_MNEM_RCL,
/* 20C */ ZYDIS_MNEM_RCPPS,
/* 20D */ ZYDIS_MNEM_RCPSS,
/* 20E */ ZYDIS_MNEM_RCR,
/* 20F */ ZYDIS_MNEM_RDMSR,
/* 210 */ ZYDIS_MNEM_RDPMC,
/* 211 */ ZYDIS_MNEM_RDRAND,
/* 212 */ ZYDIS_MNEM_RDTSC,
/* 213 */ ZYDIS_MNEM_RDTSCP,
/* 214 */ ZYDIS_MNEM_REP,
/* 215 */ ZYDIS_MNEM_REPNE,
/* 216 */ ZYDIS_MNEM_RET,
/* 217 */ ZYDIS_MNEM_RETF,
/* 218 */ ZYDIS_MNEM_ROL,
/* 219 */ ZYDIS_MNEM_ROR,
/* 21A */ ZYDIS_MNEM_ROUNDPD,
/* 21B */ ZYDIS_MNEM_ROUNDPS,
/* 21C */ ZYDIS_MNEM_ROUNDSD,
/* 21D */ ZYDIS_MNEM_ROUNDSS,
/* 21E */ ZYDIS_MNEM_RSM,
/* 21F */ ZYDIS_MNEM_RSQRTPS,
/* 220 */ ZYDIS_MNEM_RSQRTSS,
/* 221 */ ZYDIS_MNEM_SAHF,
/* 222 */ ZYDIS_MNEM_SALC,
/* 223 */ ZYDIS_MNEM_SAR,
/* 224 */ ZYDIS_MNEM_SBB,
/* 225 */ ZYDIS_MNEM_SCASB,
/* 226 */ ZYDIS_MNEM_SCASD,
/* 227 */ ZYDIS_MNEM_SCASQ,
/* 228 */ ZYDIS_MNEM_SCASW,
/* 229 */ ZYDIS_MNEM_SETA,
/* 22A */ ZYDIS_MNEM_SETAE,
/* 22B */ ZYDIS_MNEM_SETB,
/* 22C */ ZYDIS_MNEM_SETBE,
/* 22D */ ZYDIS_MNEM_SETE,
/* 22E */ ZYDIS_MNEM_SETG,
/* 22F */ ZYDIS_MNEM_SETGE,
/* 230 */ ZYDIS_MNEM_SETL,
/* 231 */ ZYDIS_MNEM_SETLE,
/* 232 */ ZYDIS_MNEM_SETNE,
/* 233 */ ZYDIS_MNEM_SETNO,
/* 234 */ ZYDIS_MNEM_SETNP,
/* 235 */ ZYDIS_MNEM_SETNS,
/* 236 */ ZYDIS_MNEM_SETO,
/* 237 */ ZYDIS_MNEM_SETP,
/* 238 */ ZYDIS_MNEM_SETS,
/* 239 */ ZYDIS_MNEM_SFENCE,
/* 23A */ ZYDIS_MNEM_SGDT,
/* 23B */ ZYDIS_MNEM_SHL,
/* 23C */ ZYDIS_MNEM_SHLD,
/* 23D */ ZYDIS_MNEM_SHR,
/* 23E */ ZYDIS_MNEM_SHRD,
/* 23F */ ZYDIS_MNEM_SHUFPD,
/* 240 */ ZYDIS_MNEM_SHUFPS,
/* 241 */ ZYDIS_MNEM_SIDT,
/* 242 */ ZYDIS_MNEM_SKINIT,
/* 243 */ ZYDIS_MNEM_SLDT,
/* 244 */ ZYDIS_MNEM_SMSW,
/* 245 */ ZYDIS_MNEM_SQRTPD,
/* 246 */ ZYDIS_MNEM_SQRTPS,
/* 247 */ ZYDIS_MNEM_SQRTSD,
/* 248 */ ZYDIS_MNEM_SQRTSS,
/* 249 */ ZYDIS_MNEM_STC,
/* 24A */ ZYDIS_MNEM_STD,
/* 24B */ ZYDIS_MNEM_STGI,
/* 24C */ ZYDIS_MNEM_STI,
/* 24D */ ZYDIS_MNEM_STMXCSR,
/* 24E */ ZYDIS_MNEM_STOSB,
/* 24F */ ZYDIS_MNEM_STOSD,
/* 250 */ ZYDIS_MNEM_STOSQ,
/* 251 */ ZYDIS_MNEM_STOSW,
/* 252 */ ZYDIS_MNEM_STR,
/* 253 */ ZYDIS_MNEM_SUB,
/* 254 */ ZYDIS_MNEM_SUBPD,
/* 255 */ ZYDIS_MNEM_SUBPS,
/* 256 */ ZYDIS_MNEM_SUBSD,
/* 257 */ ZYDIS_MNEM_SUBSS,
/* 258 */ ZYDIS_MNEM_SWAPGS,
/* 259 */ ZYDIS_MNEM_SYSCALL,
/* 25A */ ZYDIS_MNEM_SYSENTER,
/* 25B */ ZYDIS_MNEM_SYSEXIT,
/* 25C */ ZYDIS_MNEM_SYSRET,
/* 25D */ ZYDIS_MNEM_TEST,
/* 25E */ ZYDIS_MNEM_UCOMISD,
/* 25F */ ZYDIS_MNEM_UCOMISS,
/* 260 */ ZYDIS_MNEM_UD2,
/* 261 */ ZYDIS_MNEM_UNPCKHPD,
/* 262 */ ZYDIS_MNEM_UNPCKHPS,
/* 263 */ ZYDIS_MNEM_UNPCKLPD,
/* 264 */ ZYDIS_MNEM_UNPCKLPS,
/* 265 */ ZYDIS_MNEM_VADDPD,
/* 266 */ ZYDIS_MNEM_VADDPS,
/* 267 */ ZYDIS_MNEM_VADDSD,
/* 268 */ ZYDIS_MNEM_VADDSS,
/* 269 */ ZYDIS_MNEM_VADDSUBPD,
/* 26A */ ZYDIS_MNEM_VADDSUBPS,
/* 26B */ ZYDIS_MNEM_VAESDEC,
/* 26C */ ZYDIS_MNEM_VAESDECLAST,
/* 26D */ ZYDIS_MNEM_VAESENC,
/* 26E */ ZYDIS_MNEM_VAESENCLAST,
/* 26F */ ZYDIS_MNEM_VAESIMC,
/* 270 */ ZYDIS_MNEM_VAESKEYGENASSIST,
/* 271 */ ZYDIS_MNEM_VANDNPD,
/* 272 */ ZYDIS_MNEM_VANDNPS,
/* 273 */ ZYDIS_MNEM_VANDPD,
/* 274 */ ZYDIS_MNEM_VANDPS,
/* 275 */ ZYDIS_MNEM_VBLENDPD,
/* 276 */ ZYDIS_MNEM_VBLENDPS,
/* 277 */ ZYDIS_MNEM_VBLENDVPD,
/* 278 */ ZYDIS_MNEM_VBLENDVPS,
/* 279 */ ZYDIS_MNEM_VBROADCASTSD,
/* 27A */ ZYDIS_MNEM_VBROADCASTSS,
/* 27B */ ZYDIS_MNEM_VCMPPD,
/* 27C */ ZYDIS_MNEM_VCMPPS,
/* 27D */ ZYDIS_MNEM_VCMPSD,
/* 27E */ ZYDIS_MNEM_VCMPSS,
/* 27F */ ZYDIS_MNEM_VCOMISD,
/* 280 */ ZYDIS_MNEM_VCOMISS,
/* 281 */ ZYDIS_MNEM_VCVTDQ2PD,
/* 282 */ ZYDIS_MNEM_VCVTDQ2PS,
/* 283 */ ZYDIS_MNEM_VCVTPD2DQ,
/* 284 */ ZYDIS_MNEM_VCVTPD2PS,
/* 285 */ ZYDIS_MNEM_VCVTPS2DQ,
/* 286 */ ZYDIS_MNEM_VCVTPS2PD,
/* 287 */ ZYDIS_MNEM_VCVTSD2SI,
/* 288 */ ZYDIS_MNEM_VCVTSD2SS,
/* 289 */ ZYDIS_MNEM_VCVTSI2SD,
/* 28A */ ZYDIS_MNEM_VCVTSI2SS,
/* 28B */ ZYDIS_MNEM_VCVTSS2SD,
/* 28C */ ZYDIS_MNEM_VCVTSS2SI,
/* 28D */ ZYDIS_MNEM_VCVTTPD2DQ,
/* 28E */ ZYDIS_MNEM_VCVTTPS2DQ,
/* 28F */ ZYDIS_MNEM_VCVTTSD2SI,
/* 290 */ ZYDIS_MNEM_VCVTTSS2SI,
/* 291 */ ZYDIS_MNEM_VDIVPD,
/* 292 */ ZYDIS_MNEM_VDIVPS,
/* 293 */ ZYDIS_MNEM_VDIVSD,
/* 294 */ ZYDIS_MNEM_VDIVSS,
/* 295 */ ZYDIS_MNEM_VDPPD,
/* 296 */ ZYDIS_MNEM_VDPPS,
/* 297 */ ZYDIS_MNEM_VERR,
/* 298 */ ZYDIS_MNEM_VERW,
/* 299 */ ZYDIS_MNEM_VEXTRACTF128,
/* 29A */ ZYDIS_MNEM_VEXTRACTPS,
/* 29B */ ZYDIS_MNEM_VHADDPD,
/* 29C */ ZYDIS_MNEM_VHADDPS,
/* 29D */ ZYDIS_MNEM_VHSUBPD,
/* 29E */ ZYDIS_MNEM_VHSUBPS,
/* 29F */ ZYDIS_MNEM_VINSERTF128,
/* 2A0 */ ZYDIS_MNEM_VINSERTPS,
/* 2A1 */ ZYDIS_MNEM_VLDDQU,
/* 2A2 */ ZYDIS_MNEM_VMASKMOVDQU,
/* 2A3 */ ZYDIS_MNEM_VMASKMOVPD,
/* 2A4 */ ZYDIS_MNEM_VMASKMOVPS,
/* 2A5 */ ZYDIS_MNEM_VMAXPD,
/* 2A6 */ ZYDIS_MNEM_VMAXPS,
/* 2A7 */ ZYDIS_MNEM_VMAXSD,
/* 2A8 */ ZYDIS_MNEM_VMAXSS,
/* 2A9 */ ZYDIS_MNEM_VMCALL,
/* 2AA */ ZYDIS_MNEM_VMCLEAR,
/* 2AB */ ZYDIS_MNEM_VMINPD,
/* 2AC */ ZYDIS_MNEM_VMINPS,
/* 2AD */ ZYDIS_MNEM_VMINSD,
/* 2AE */ ZYDIS_MNEM_VMINSS,
/* 2AF */ ZYDIS_MNEM_VMLAUNCH,
/* 2B0 */ ZYDIS_MNEM_VMLOAD,
/* 2B1 */ ZYDIS_MNEM_VMMCALL,
/* 2B2 */ ZYDIS_MNEM_VMOVAPD,
/* 2B3 */ ZYDIS_MNEM_VMOVAPS,
/* 2B4 */ ZYDIS_MNEM_VMOVD,
/* 2B5 */ ZYDIS_MNEM_VMOVDDUP,
/* 2B6 */ ZYDIS_MNEM_VMOVDQA,
/* 2B7 */ ZYDIS_MNEM_VMOVDQU,
/* 2B8 */ ZYDIS_MNEM_VMOVHLPS,
/* 2B9 */ ZYDIS_MNEM_VMOVHPD,
/* 2BA */ ZYDIS_MNEM_VMOVHPS,
/* 2BB */ ZYDIS_MNEM_VMOVLHPS,
/* 2BC */ ZYDIS_MNEM_VMOVLPD,
/* 2BD */ ZYDIS_MNEM_VMOVLPS,
/* 2BE */ ZYDIS_MNEM_VMOVMSKPD,
/* 2BF */ ZYDIS_MNEM_VMOVMSKPS,
/* 2C0 */ ZYDIS_MNEM_VMOVNTDQ,
/* 2C1 */ ZYDIS_MNEM_VMOVNTDQA,
/* 2C2 */ ZYDIS_MNEM_VMOVNTPD,
/* 2C3 */ ZYDIS_MNEM_VMOVNTPS,
/* 2C4 */ ZYDIS_MNEM_VMOVQ,
/* 2C5 */ ZYDIS_MNEM_VMOVSD,
/* 2C6 */ ZYDIS_MNEM_VMOVSHDUP,
/* 2C7 */ ZYDIS_MNEM_VMOVSLDUP,
/* 2C8 */ ZYDIS_MNEM_VMOVSS,
/* 2C9 */ ZYDIS_MNEM_VMOVUPD,
/* 2CA */ ZYDIS_MNEM_VMOVUPS,
/* 2CB */ ZYDIS_MNEM_VMPSADBW,
/* 2CC */ ZYDIS_MNEM_VMPTRLD,
/* 2CD */ ZYDIS_MNEM_VMPTRST,
/* 2CE */ ZYDIS_MNEM_VMREAD,
/* 2CF */ ZYDIS_MNEM_VMRESUME,
/* 2D0 */ ZYDIS_MNEM_VMRUN,
/* 2D1 */ ZYDIS_MNEM_VMSAVE,
/* 2D2 */ ZYDIS_MNEM_VMULPD,
/* 2D3 */ ZYDIS_MNEM_VMULPS,
/* 2D4 */ ZYDIS_MNEM_VMULSD,
/* 2D5 */ ZYDIS_MNEM_VMULSS,
/* 2D6 */ ZYDIS_MNEM_VMWRITE,
/* 2D7 */ ZYDIS_MNEM_VMXOFF,
/* 2D8 */ ZYDIS_MNEM_VMXON,
/* 2D9 */ ZYDIS_MNEM_VORPD,
/* 2DA */ ZYDIS_MNEM_VORPS,
/* 2DB */ ZYDIS_MNEM_VPABSB,
/* 2DC */ ZYDIS_MNEM_VPABSD,
/* 2DD */ ZYDIS_MNEM_VPABSW,
/* 2DE */ ZYDIS_MNEM_VPACKSSDW,
/* 2DF */ ZYDIS_MNEM_VPACKSSWB,
/* 2E0 */ ZYDIS_MNEM_VPACKUSDW,
/* 2E1 */ ZYDIS_MNEM_VPACKUSWB,
/* 2E2 */ ZYDIS_MNEM_VPADDB,
/* 2E3 */ ZYDIS_MNEM_VPADDD,
/* 2E4 */ ZYDIS_MNEM_VPADDQ,
/* 2E5 */ ZYDIS_MNEM_VPADDSB,
/* 2E6 */ ZYDIS_MNEM_VPADDSW,
/* 2E7 */ ZYDIS_MNEM_VPADDUSB,
/* 2E8 */ ZYDIS_MNEM_VPADDUSW,
/* 2E9 */ ZYDIS_MNEM_VPADDW,
/* 2EA */ ZYDIS_MNEM_VPALIGNR,
/* 2EB */ ZYDIS_MNEM_VPAND,
/* 2EC */ ZYDIS_MNEM_VPANDN,
/* 2ED */ ZYDIS_MNEM_VPAVGB,
/* 2EE */ ZYDIS_MNEM_VPAVGW,
/* 2EF */ ZYDIS_MNEM_VPBLENDVB,
/* 2F0 */ ZYDIS_MNEM_VPBLENDW,
/* 2F1 */ ZYDIS_MNEM_VPCLMULQDQ,
/* 2F2 */ ZYDIS_MNEM_VPCMPEQB,
/* 2F3 */ ZYDIS_MNEM_VPCMPEQD,
/* 2F4 */ ZYDIS_MNEM_VPCMPEQQ,
/* 2F5 */ ZYDIS_MNEM_VPCMPEQW,
/* 2F6 */ ZYDIS_MNEM_VPCMPESTRI,
/* 2F7 */ ZYDIS_MNEM_VPCMPESTRM,
/* 2F8 */ ZYDIS_MNEM_VPCMPGTB,
/* 2F9 */ ZYDIS_MNEM_VPCMPGTD,
/* 2FA */ ZYDIS_MNEM_VPCMPGTQ,
/* 2FB */ ZYDIS_MNEM_VPCMPGTW,
/* 2FC */ ZYDIS_MNEM_VPCMPISTRI,
/* 2FD */ ZYDIS_MNEM_VPCMPISTRM,
/* 2FE */ ZYDIS_MNEM_VPERM2F128,
/* 2FF */ ZYDIS_MNEM_VPERMILPD,
/* 300 */ ZYDIS_MNEM_VPERMILPS,
/* 301 */ ZYDIS_MNEM_VPEXTRB,
/* 302 */ ZYDIS_MNEM_VPEXTRD,
/* 303 */ ZYDIS_MNEM_VPEXTRQ,
/* 304 */ ZYDIS_MNEM_VPEXTRW,
/* 305 */ ZYDIS_MNEM_VPHADDD,
/* 306 */ ZYDIS_MNEM_VPHADDSW,
/* 307 */ ZYDIS_MNEM_VPHADDW,
/* 308 */ ZYDIS_MNEM_VPHMINPOSUW,
/* 309 */ ZYDIS_MNEM_VPHSUBD,
/* 30A */ ZYDIS_MNEM_VPHSUBSW,
/* 30B */ ZYDIS_MNEM_VPHSUBW,
/* 30C */ ZYDIS_MNEM_VPINSRB,
/* 30D */ ZYDIS_MNEM_VPINSRD,
/* 30E */ ZYDIS_MNEM_VPINSRQ,
/* 30F */ ZYDIS_MNEM_VPINSRW,
/* 310 */ ZYDIS_MNEM_VPMADDUBSW,
/* 311 */ ZYDIS_MNEM_VPMADDWD,
/* 312 */ ZYDIS_MNEM_VPMAXSB,
/* 313 */ ZYDIS_MNEM_VPMAXSD,
/* 314 */ ZYDIS_MNEM_VPMAXSW,
/* 315 */ ZYDIS_MNEM_VPMAXUB,
/* 316 */ ZYDIS_MNEM_VPMAXUD,
/* 317 */ ZYDIS_MNEM_VPMAXUW,
/* 318 */ ZYDIS_MNEM_VPMINSB,
/* 319 */ ZYDIS_MNEM_VPMINSD,
/* 31A */ ZYDIS_MNEM_VPMINSW,
/* 31B */ ZYDIS_MNEM_VPMINUB,
/* 31C */ ZYDIS_MNEM_VPMINUD,
/* 31D */ ZYDIS_MNEM_VPMINUW,
/* 31E */ ZYDIS_MNEM_VPMOVMSKB,
/* 31F */ ZYDIS_MNEM_VPMOVSXBD,
/* 320 */ ZYDIS_MNEM_VPMOVSXBQ,
/* 321 */ ZYDIS_MNEM_VPMOVSXBW,
/* 322 */ ZYDIS_MNEM_VPMOVSXWD,
/* 323 */ ZYDIS_MNEM_VPMOVSXWQ,
/* 324 */ ZYDIS_MNEM_VPMOVZXBD,
/* 325 */ ZYDIS_MNEM_VPMOVZXBQ,
/* 326 */ ZYDIS_MNEM_VPMOVZXBW,
/* 327 */ ZYDIS_MNEM_VPMOVZXDQ,
/* 328 */ ZYDIS_MNEM_VPMOVZXWD,
/* 329 */ ZYDIS_MNEM_VPMOVZXWQ,
/* 32A */ ZYDIS_MNEM_VPMULDQ,
/* 32B */ ZYDIS_MNEM_VPMULHRSW,
/* 32C */ ZYDIS_MNEM_VPMULHUW,
/* 32D */ ZYDIS_MNEM_VPMULHW,
/* 32E */ ZYDIS_MNEM_VPMULLD,
/* 32F */ ZYDIS_MNEM_VPMULLW,
/* 330 */ ZYDIS_MNEM_VPOR,
/* 331 */ ZYDIS_MNEM_VPSADBW,
/* 332 */ ZYDIS_MNEM_VPSHUFB,
/* 333 */ ZYDIS_MNEM_VPSHUFD,
/* 334 */ ZYDIS_MNEM_VPSHUFHW,
/* 335 */ ZYDIS_MNEM_VPSHUFLW,
/* 336 */ ZYDIS_MNEM_VPSIGNB,
/* 337 */ ZYDIS_MNEM_VPSIGND,
/* 338 */ ZYDIS_MNEM_VPSIGNW,
/* 339 */ ZYDIS_MNEM_VPSLLD,
/* 33A */ ZYDIS_MNEM_VPSLLDQ,
/* 33B */ ZYDIS_MNEM_VPSLLQ,
/* 33C */ ZYDIS_MNEM_VPSLLW,
/* 33D */ ZYDIS_MNEM_VPSRAD,
/* 33E */ ZYDIS_MNEM_VPSRAW,
/* 33F */ ZYDIS_MNEM_VPSRLD,
/* 340 */ ZYDIS_MNEM_VPSRLDQ,
/* 341 */ ZYDIS_MNEM_VPSRLQ,
/* 342 */ ZYDIS_MNEM_VPSRLW,
/* 343 */ ZYDIS_MNEM_VPSUBB,
/* 344 */ ZYDIS_MNEM_VPSUBD,
/* 345 */ ZYDIS_MNEM_VPSUBQ,
/* 346 */ ZYDIS_MNEM_VPSUBSB,
/* 347 */ ZYDIS_MNEM_VPSUBSW,
/* 348 */ ZYDIS_MNEM_VPSUBUSB,
/* 349 */ ZYDIS_MNEM_VPSUBUSW,
/* 34A */ ZYDIS_MNEM_VPSUBW,
/* 34B */ ZYDIS_MNEM_VPTEST,
/* 34C */ ZYDIS_MNEM_VPUNPCKHBW,
/* 34D */ ZYDIS_MNEM_VPUNPCKHDQ,
/* 34E */ ZYDIS_MNEM_VPUNPCKHQDQ,
/* 34F */ ZYDIS_MNEM_VPUNPCKHWD,
/* 350 */ ZYDIS_MNEM_VPUNPCKLBW,
/* 351 */ ZYDIS_MNEM_VPUNPCKLDQ,
/* 352 */ ZYDIS_MNEM_VPUNPCKLQDQ,
/* 353 */ ZYDIS_MNEM_VPUNPCKLWD,
/* 354 */ ZYDIS_MNEM_VPXOR,
/* 355 */ ZYDIS_MNEM_VRCPPS,
/* 356 */ ZYDIS_MNEM_VRCPSS,
/* 357 */ ZYDIS_MNEM_VROUNDPD,
/* 358 */ ZYDIS_MNEM_VROUNDPS,
/* 359 */ ZYDIS_MNEM_VROUNDSD,
/* 35A */ ZYDIS_MNEM_VROUNDSS,
/* 35B */ ZYDIS_MNEM_VRSQRTPS,
/* 35C */ ZYDIS_MNEM_VRSQRTSS,
/* 35D */ ZYDIS_MNEM_VSHUFPD,
/* 35E */ ZYDIS_MNEM_VSHUFPS,
/* 35F */ ZYDIS_MNEM_VSQRTPD,
/* 360 */ ZYDIS_MNEM_VSQRTPS,
/* 361 */ ZYDIS_MNEM_VSQRTSD,
/* 362 */ ZYDIS_MNEM_VSQRTSS,
/* 363 */ ZYDIS_MNEM_VSTMXCSR,
/* 364 */ ZYDIS_MNEM_VSUBPD,
/* 365 */ ZYDIS_MNEM_VSUBPS,
/* 366 */ ZYDIS_MNEM_VSUBSD,
/* 367 */ ZYDIS_MNEM_VSUBSS,
/* 368 */ ZYDIS_MNEM_VTESTPD,
/* 369 */ ZYDIS_MNEM_VTESTPS,
/* 36A */ ZYDIS_MNEM_VUCOMISD,
/* 36B */ ZYDIS_MNEM_VUCOMISS,
/* 36C */ ZYDIS_MNEM_VUNPCKHPD,
/* 36D */ ZYDIS_MNEM_VUNPCKHPS,
/* 36E */ ZYDIS_MNEM_VUNPCKLPD,
/* 36F */ ZYDIS_MNEM_VUNPCKLPS,
/* 370 */ ZYDIS_MNEM_VXORPD,
/* 371 */ ZYDIS_MNEM_VXORPS,
/* 372 */ ZYDIS_MNEM_VZEROALL,
/* 373 */ ZYDIS_MNEM_VZEROUPPER,
/* 374 */ ZYDIS_MNEM_WAIT,
/* 375 */ ZYDIS_MNEM_WBINVD,
/* 376 */ ZYDIS_MNEM_WRMSR,
/* 377 */ ZYDIS_MNEM_XADD,
/* 378 */ ZYDIS_MNEM_XCHG,
/* 379 */ ZYDIS_MNEM_XCRYPTCBC,
/* 37A */ ZYDIS_MNEM_XCRYPTCFB,
/* 37B */ ZYDIS_MNEM_XCRYPTCTR,
/* 37C */ ZYDIS_MNEM_XCRYPTECB,
/* 37D */ ZYDIS_MNEM_XCRYPTOFB,
/* 37E */ ZYDIS_MNEM_XGETBV,
/* 37F */ ZYDIS_MNEM_XLATB,
/* 380 */ ZYDIS_MNEM_XOR,
/* 381 */ ZYDIS_MNEM_XORPD,
/* 382 */ ZYDIS_MNEM_XORPS,
/* 383 */ ZYDIS_MNEM_XRSTOR,
/* 384 */ ZYDIS_MNEM_XSAVE,
/* 385 */ ZYDIS_MNEM_XSETBV,
/* 386 */ ZYDIS_MNEM_XSHA1,
/* 387 */ ZYDIS_MNEM_XSHA256,
/* 388 */ ZYDIS_MNEM_XSTORE,
ZYDIS_MNEM_FORCE_WORD = 0x7FFF
} ZydisInstructionMnemonic;
/* TODO: Port instruction definition types */
#ifdef __cplusplus
}
#endif
#endif // _ZYDIS_OPCODETABLE_H_

View File

@ -0,0 +1,144 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#include "ZydisSymbolResolver.h"
#include <ZydisSymbolResolver.hpp>
/* CustomSymbolResolver ========================================================================= */
inline Zydis::BaseSymbolResolver* ZydisBaseSymbolResolver_CppPtr(
ZydisBaseSymbolResolverContext *ctx)
{
return reinterpret_cast<Zydis::BaseSymbolResolver*>(ctx);
}
inline const Zydis::BaseSymbolResolver* ZydisBaseSymbolResolver_CppPtr(
const ZydisBaseSymbolResolverContext *ctx)
{
return reinterpret_cast<const Zydis::BaseSymbolResolver*>(ctx);
}
inline ZydisBaseSymbolResolverContext* ZydisBaseSymbolResolver_CPtr(
Zydis::BaseSymbolResolver *ptr)
{
return reinterpret_cast<ZydisBaseSymbolResolverContext*>(ptr);
}
inline const ZydisBaseSymbolResolverContext* ZydisBaseSymbolResolver_CPtr(
const Zydis::BaseSymbolResolver *ptr)
{
return reinterpret_cast<const ZydisBaseSymbolResolverContext*>(ptr);
}
inline Zydis::InstructionInfo* ZydisInstructionInfo_CppPtr(
ZydisInstructionInfo *ptr)
{
static_assert(sizeof(*ptr) == sizeof(Zydis::InstructionInfo), "broken struct");
return reinterpret_cast<Zydis::InstructionInfo*>(ptr);
}
inline const Zydis::InstructionInfo* ZydisInstructionInfo_CppPtr(
const ZydisInstructionInfo *ptr)
{
static_assert(sizeof(*ptr) == sizeof(Zydis::InstructionInfo), "broken struct");
return reinterpret_cast<const Zydis::InstructionInfo*>(ptr);
}
inline ZydisInstructionInfo* ZydisInstructionInfo_CPtr(
Zydis::InstructionInfo *ptr)
{
return reinterpret_cast<ZydisInstructionInfo*>(ptr);
}
inline const ZydisInstructionInfo* ZydisInstructionInfo_CPtr(
const Zydis::InstructionInfo *ptr)
{
return reinterpret_cast<const ZydisInstructionInfo*>(ptr);
}
/* Internal helper class ----------------------------------------------------------------------- */
namespace
{
class ZydisCustomSymbolResolver : public Zydis::BaseSymbolResolver
{
ZydisResolveSymbol_t m_resolverCb;
void* m_userData;
public:
/**
* @brief Constructor.
* @param resolverCb The resolver callback.
* @param userData User provided pointer to arbitrary data passed to resolve callback.
*/
ZydisCustomSymbolResolver(ZydisResolveSymbol_t resolverCb, void *userData);
/**
* @brief Destructor.
*/
~ZydisCustomSymbolResolver() override = default;
public:
/**
* @brief Resolves a symbol.
* @param info The instruction info.
* @param address The address.
* @param offset Reference to an unsigned 64 bit integer that receives an offset
* relative to the base address of the symbol.
* @return The name of the symbol, if the symbol was found, @c NULL if not.
*/
const char* resolveSymbol(const Zydis::InstructionInfo &info, uint64_t address,
uint64_t &offset) override;
};
ZydisCustomSymbolResolver::ZydisCustomSymbolResolver(ZydisResolveSymbol_t resolverCb,
void *userData)
: m_resolverCb(resolverCb)
, m_userData(userData)
{
}
const char* ZydisCustomSymbolResolver::resolveSymbol(
const Zydis::InstructionInfo &info, uint64_t address, uint64_t &offset)
{
return m_resolverCb(ZydisInstructionInfo_CPtr(&info), address, &offset, m_userData);
}
} // anon namespace
/* C API implementation ------------------------------------------------------------------------ */
ZydisBaseSymbolResolverContext* ZydisCustomSymbolResolver_Create(
ZydisResolveSymbol_t resolverCb,
void *userData)
{
return ZydisBaseSymbolResolver_CPtr(new ZydisCustomSymbolResolver(resolverCb, userData));
}
/* ============================================================================================= */

View File

@ -0,0 +1,126 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#ifndef _ZYDIS_SYMBOLRESOLVER_H_
#define _ZYDIS_SYMBOLRESOLVER_H_
#include "ZydisTypes.h"
#ifdef __cplusplus
extern "C"
{
#endif
/* BaseSymbolResolver ======================================================================== */
typedef struct _ZydisBaseSymbolResolverContext { int a; } ZydisBaseSymbolResolverContext;
/**
* @brief Releases a symbol resolver.
* @param ctx The context of the symbol resolver to free.
* The context may no longer used after it was released.
*/
void ZydisBaseSymbolResolver_Release(ZydisBaseSymbolResolverContext *ctx);
/**
* @brief Resolves a symbol.
* @param ctx The symbol resolver context.
* @param info The instruction info.
* @param address The address.
* @param offset Pointer to an unsigned 64 bit integer that receives an offset relative to
* the base address of the symbol.
* @return The name of the symbol if the symbol was found, else @c NULL.
*/
const char* ZydisBaseSymbolResolver_ResolveSymbol(ZydisBaseSymbolResolverContext *ctx,
const ZydisInstructionInfo *info, uint64_t address, uint64_t *offset);
/* ExactSymbolResolver ======================================================================= */
/**
* @brief Creates an exact symbol resolver.
* @return @c NULL if it fails, else a symbol resolver context.
* @see BaseSymbolResolver_Release
* An exact resolver is a simple symbol resolver that only matches exact addresses.
*/
// TODO: verify return value
ZydisBaseSymbolResolverContext* ZydisExactSymbolResolver_Create(void);
/**
* @brief Query if the given address is a known symbol.
* @param ctx The exact symbol resolver context.
* @param address The address.
* @return @c true if the address is known, @c false if not.
*/
bool ZydisExactSymbolResolver_ContainsSymbol(ZydisBaseSymbolResolverContext *ctx, uint64_t address);
/**
* @brief Adds or changes a symbol.
* @param ctx The exact symbol resolver context.
* @param address The address.
* @param name The symbol name.
*/
void ZydisExactSymbolResolverContext_SetSymbol(ZydisBaseSymbolResolverContext *ctx,
uint64_t address, const char* name);
/**
* @brief Removes the symbol described by address.
* @param ctx The exact symbol resolver context.
* @param address The address.
* This will invalidate all char-pointers to the affected symbol name.
*/
void ZydisExactSymbolResolverContext_RemoveSymbol(ZydisBaseSymbolResolverContext *ctx,
uint64_t address);
/**
* @brief Clears the symbol tree.
* @param ctx The exact symbol resolver context.
*/
void ExactSymbolResolverContext_Clear(ZydisBaseSymbolResolverContext *ctx);
/* CustomSymbolResolver ====================================================================== */
typedef const char* (*ZydisResolveSymbol_t)(const ZydisInstructionInfo *info, uint64_t address,
uint64_t *offset, void *userData);
/**
* @brief Creates a custom symbol resolver.
* @param resolverCb The resolver callback consulted when symbols need to be resolved.
* @param userData A pointer to arbitrary data passed to the resolver callback.
* May also be @c NULL.
* @return @c NULL if it fails, else a symbol resolver context.
*/
ZydisBaseSymbolResolverContext* CustomSymbolResolver_Create(ZydisResolveSymbol_t resolverCb,
void *userData);
#ifdef __cplusplus
}
#endif
#endif /* _ZYDIS_SYMBOLRESOLVER_H_ */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : athre0z Modifications : Joel Höner
Last change : 04. February 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,14 +26,14 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#ifndef _VDE_ZyDisDISASSEMBLERTYPESC_H_ #ifndef _ZYDIS_TYPES_H_
#define _VDE_ZyDisDISASSEMBLERTYPESC_H_ #define _ZYDIS_TYPES_H_
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include "ZyDisOpcodeTable.h" #include "ZydisOpcodeTable.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
@ -45,218 +43,218 @@ extern "C"
/** /**
* @brief Values that represent additional flags of a decoded instruction. * @brief Values that represent additional flags of a decoded instruction.
*/ */
typedef enum _ZyDisInstructionFlags /* : uint32_t */ typedef enum _ZydisInstructionFlags /* : uint32_t */
{ {
IF_NONE = 0x00000000, ZYDIS_IF_NONE = 0x00000000,
/** /**
* @brief The instruction was decoded in 16 bit disassembler mode. * @brief The instruction was decoded in 16 bit disassembler mode.
*/ */
IF_DISASSEMBLER_MODE_16 = 0x00000001, ZYDIS_IF_DISASSEMBLER_MODE_16 = 0x00000001,
/** /**
* @brief The instruction was decoded in 32 bit disassembler mode. * @brief The instruction was decoded in 32 bit disassembler mode.
*/ */
IF_DISASSEMBLER_MODE_32 = 0x00000002, ZYDIS_IF_DISASSEMBLER_MODE_32 = 0x00000002,
/** /**
* @brief The instruction was decoded in 64 bit disassembler mode. * @brief The instruction was decoded in 64 bit disassembler mode.
*/ */
IF_DISASSEMBLER_MODE_64 = 0x00000004, ZYDIS_IF_DISASSEMBLER_MODE_64 = 0x00000004,
/** /**
* @brief The instruction has a segment prefix (0x26, 0x2E, 0x36, 0x3E, 0x64, 0x65). * @brief The instruction has a segment prefix (0x26, 0x2E, 0x36, 0x3E, 0x64, 0x65).
*/ */
IF_PREFIX_SEGMENT = 0x00000008, ZYDIS_IF_PREFIX_SEGMENT = 0x00000008,
/** /**
* @brief The instruction has a lock prefix (0xF0). * @brief The instruction has a lock prefix (0xF0).
*/ */
IF_PREFIX_LOCK = 0x00000010, ZYDIS_IF_PREFIX_LOCK = 0x00000010,
/** /**
* @brief The instruction has a repne prefix (0xF2). * @brief The instruction has a repne prefix (0xF2).
*/ */
IF_PREFIX_REPNE = 0x00000020, ZYDIS_IF_PREFIX_REPNE = 0x00000020,
/** /**
* @brief The instruction has a rep prefix (0xF3). * @brief The instruction has a rep prefix (0xF3).
*/ */
IF_PREFIX_REP = 0x00000040, ZYDIS_IF_PREFIX_REP = 0x00000040,
/** /**
* @brief The instruction has an operand size prefix (0x66). * @brief The instruction has an operand size prefix (0x66).
*/ */
IF_PREFIX_OPERAND_SIZE = 0x00000080, ZYDIS_IF_PREFIX_OPERAND_SIZE = 0x00000080,
/** /**
* @brief The instruction has an address size prefix (0x67). * @brief The instruction has an address size prefix (0x67).
*/ */
IF_PREFIX_ADDRESS_SIZE = 0x00000100, ZYDIS_IF_PREFIX_ADDRESS_SIZE = 0x00000100,
/** /**
* @brief The instruction has a rex prefix (0x40 - 0x4F). * @brief The instruction has a rex prefix (0x40 - 0x4F).
*/ */
IF_PREFIX_REX = 0x00000200, ZYDIS_IF_PREFIX_REX = 0x00000200,
/** /**
* @brief The instruction has a vex prefix (0xC4 or 0xC5). * @brief The instruction has a vex prefix (0xC4 or 0xC5).
*/ */
IF_PREFIX_VEX = 0x00000400, ZYDIS_IF_PREFIX_VEX = 0x00000400,
/** /**
* @brief The instruction has a modrm byte. * @brief The instruction has a modrm byte.
*/ */
IF_MODRM = 0x00000800, ZYDIS_IF_MODRM = 0x00000800,
/** /**
* @brief The instruction has a sib byte. * @brief The instruction has a sib byte.
*/ */
IF_SIB = 0x00001000, ZYDIS_IF_SIB = 0x00001000,
/** /**
* @brief The instruction has an operand with a relative address. * @brief The instruction has an operand with a relative address.
*/ */
IF_RELATIVE = 0x00002000, ZYDIS_IF_RELATIVE = 0x00002000,
/** /**
* @brief An error occured while decoding the instruction. * @brief An error occured while decoding the instruction.
*/ */
IF_ERROR_MASK = 0xFFF00000, ZYDIS_IF_ERROR_MASK = 0xFFF00000,
/** /**
* @brief End of input reached while decoding the instruction. * @brief End of input reached while decoding the instruction.
*/ */
IF_ERROR_END_OF_INPUT = 0x00100000, ZYDIS_IF_ERROR_END_OF_INPUT = 0x00100000,
/** /**
* @brief The instruction length has exceeded the maximum of 15 bytes. * @brief The instruction length has exceeded the maximum of 15 bytes.
*/ */
IF_ERROR_LENGTH = 0x00200000, ZYDIS_IF_ERROR_LENGTH = 0x00200000,
/** /**
* @brief The instruction is invalid. * @brief The instruction is invalid.
*/ */
IF_ERROR_INVALID = 0x00400000, ZYDIS_IF_ERROR_INVALID = 0x00400000,
/** /**
* @brief The instruction is invalid in 64 bit mode. * @brief The instruction is invalid in 64 bit mode.
*/ */
IF_ERROR_INVALID_64 = 0x00800000, ZYDIS_IF_ERROR_INVALID_64 = 0x00800000,
/** /**
* @brief An error occured while decoding the instruction operands. * @brief An error occured while decoding the instruction operands.
*/ */
IF_ERROR_OPERAND = 0x01000000, ZYDIS_IF_ERROR_OPERAND = 0x01000000,
IF_FORCE_DWORD = 0x7FFFFFFF ZYDIS_IF_FORCE_DWORD = 0x7FFFFFFF
} ZyDisInstructionFlags; } ZydisInstructionFlags;
/** /**
* @brief Values that represent a cpu register. * @brief Values that represent a cpu register.
*/ */
typedef enum _ZyDisRegister /* : uint16_t */ typedef enum _ZydisRegister /* : uint16_t */
{ {
REG_NONE, ZYDIS_REG_NONE,
/* 8 bit general purpose registers */ /* 8 bit general purpose registers */
REG_AL, REG_CL, REG_DL, REG_BL, ZYDIS_REG_AL, ZYDIS_REG_CL, ZYDIS_REG_DL, ZYDIS_REG_BL,
REG_AH, REG_CH, REG_DH, REG_BH, ZYDIS_REG_AH, ZYDIS_REG_CH, ZYDIS_REG_DH, ZYDIS_REG_BH,
REG_SPL, REG_BPL, REG_SIL, REG_DIL, ZYDIS_REG_SPL, ZYDIS_REG_BPL, ZYDIS_REG_SIL, ZYDIS_REG_DIL,
REG_R8B, REG_R9B, REG_R10B, REG_R11B, ZYDIS_REG_R8B, ZYDIS_REG_R9B, ZYDIS_REG_R10B, ZYDIS_REG_R11B,
REG_R12B, REG_R13B, REG_R14B, REG_R15B, ZYDIS_REG_R12B, ZYDIS_REG_R13B, ZYDIS_REG_R14B, ZYDIS_REG_R15B,
/* 16 bit general purpose registers */ /* 16 bit general purpose registers */
REG_AX, REG_CX, REG_DX, REG_BX, ZYDIS_REG_AX, ZYDIS_REG_CX, ZYDIS_REG_DX, ZYDIS_REG_BX,
REG_SP, REG_BP, REG_SI, REG_DI, ZYDIS_REG_SP, ZYDIS_REG_BP, ZYDIS_REG_SI, ZYDIS_REG_DI,
REG_R8W, REG_R9W, REG_R10W, REG_R11W, ZYDIS_REG_R8W, ZYDIS_REG_R9W, ZYDIS_REG_R10W, ZYDIS_REG_R11W,
REG_R12W, REG_R13W, REG_R14W, REG_R15W, ZYDIS_REG_R12W, ZYDIS_REG_R13W, ZYDIS_REG_R14W, ZYDIS_REG_R15W,
/* 32 bit general purpose registers */ /* 32 bit general purpose registers */
REG_EAX, REG_ECX, REG_EDX, REG_EBX, ZYDIS_REG_EAX, ZYDIS_REG_ECX, ZYDIS_REG_EDX, ZYDIS_REG_EBX,
REG_ESP, REG_EBP, REG_ESI, REG_EDI, ZYDIS_REG_ESP, ZYDIS_REG_EBP, ZYDIS_REG_ESI, ZYDIS_REG_EDI,
REG_R8D, REG_R9D, REG_R10D, REG_R11D, ZYDIS_REG_R8D, ZYDIS_REG_R9D, ZYDIS_REG_R10D, ZYDIS_REG_R11D,
REG_R12D, REG_R13D, REG_R14D, REG_R15D, ZYDIS_REG_R12D, ZYDIS_REG_R13D, ZYDIS_REG_R14D, ZYDIS_REG_R15D,
/* 64 bit general purpose registers */ /* 64 bit general purpose registers */
REG_RAX, REG_RCX, REG_RDX, REG_RBX, ZYDIS_REG_RAX, ZYDIS_REG_RCX, ZYDIS_REG_RDX, ZYDIS_REG_RBX,
REG_RSP, REG_RBP, REG_RSI, REG_RDI, ZYDIS_REG_RSP, ZYDIS_REG_RBP, ZYDIS_REG_RSI, ZYDIS_REG_RDI,
REG_R8, REG_R9, REG_R10, REG_R11, ZYDIS_REG_R8, ZYDIS_REG_R9, ZYDIS_REG_R10, ZYDIS_REG_R11,
REG_R12, REG_R13, REG_R14, REG_R15, ZYDIS_REG_R12, ZYDIS_REG_R13, ZYDIS_REG_R14, ZYDIS_REG_R15,
/* segment registers */ /* segment registers */
REG_ES, REG_CS, REG_SS, ZYDIS_REG_ES, ZYDIS_REG_CS, ZYDIS_REG_SS,
REG_DS, REG_FS, REG_GS, ZYDIS_REG_DS, ZYDIS_REG_FS, ZYDIS_REG_GS,
/* control registers */ /* control registers */
REG_CR0, REG_CR1, REG_CR2, REG_CR3, ZYDIS_REG_CR0, ZYDIS_REG_CR1, ZYDIS_REG_CR2, ZYDIS_REG_CR3,
REG_CR4, REG_CR5, REG_CR6, REG_CR7, ZYDIS_REG_CR4, ZYDIS_REG_CR5, ZYDIS_REG_CR6, ZYDIS_REG_CR7,
REG_CR8, REG_CR9, REG_CR10, REG_CR11, ZYDIS_REG_CR8, ZYDIS_REG_CR9, ZYDIS_REG_CR10, ZYDIS_REG_CR11,
REG_CR12, REG_CR13, REG_CR14, REG_CR15, ZYDIS_REG_CR12, ZYDIS_REG_CR13, ZYDIS_REG_CR14, ZYDIS_REG_CR15,
/* debug registers */ /* debug registers */
REG_DR0, REG_DR1, REG_DR2, REG_DR3, ZYDIS_REG_DR0, ZYDIS_REG_DR1, ZYDIS_REG_DR2, ZYDIS_REG_DR3,
REG_DR4, REG_DR5, REG_DR6, REG_DR7, ZYDIS_REG_DR4, ZYDIS_REG_DR5, ZYDIS_REG_DR6, ZYDIS_REG_DR7,
REG_DR8, REG_DR9, REG_DR10, REG_DR11, ZYDIS_REG_DR8, ZYDIS_REG_DR9, ZYDIS_REG_DR10, ZYDIS_REG_DR11,
REG_DR12, REG_DR13, REG_DR14, REG_DR15, ZYDIS_REG_DR12, ZYDIS_REG_DR13, ZYDIS_REG_DR14, ZYDIS_REG_DR15,
/* mmx registers */ /* mmx registers */
REG_MM0, REG_MM1, REG_MM2, REG_MM3, ZYDIS_REG_MM0, ZYDIS_REG_MM1, ZYDIS_REG_MM2, ZYDIS_REG_MM3,
REG_MM4, REG_MM5, REG_MM6, REG_MM7, ZYDIS_REG_MM4, ZYDIS_REG_MM5, ZYDIS_REG_MM6, ZYDIS_REG_MM7,
/* x87 registers */ /* x87 registers */
REG_ST0, REG_ST1, REG_ST2, REG_ST3, ZYDIS_REG_ST0, ZYDIS_REG_ST1, ZYDIS_REG_ST2, ZYDIS_REG_ST3,
REG_ST4, REG_ST5, REG_ST6, REG_ST7, ZYDIS_REG_ST4, ZYDIS_REG_ST5, ZYDIS_REG_ST6, ZYDIS_REG_ST7,
/* extended multimedia registers */ /* extended multimedia registers */
REG_XMM0, REG_XMM1, REG_XMM2, REG_XMM3, ZYDIS_REG_XMM0, ZYDIS_REG_XMM1, ZYDIS_REG_XMM2, ZYDIS_REG_XMM3,
REG_XMM4, REG_XMM5, REG_XMM6, REG_XMM7, ZYDIS_REG_XMM4, ZYDIS_REG_XMM5, ZYDIS_REG_XMM6, ZYDIS_REG_XMM7,
REG_XMM8, REG_XMM9, REG_XMM10, REG_XMM11, ZYDIS_REG_XMM8, ZYDIS_REG_XMM9, ZYDIS_REG_XMM10, ZYDIS_REG_XMM11,
REG_XMM12, REG_XMM13, REG_XMM14, REG_XMM15, ZYDIS_REG_XMM12, ZYDIS_REG_XMM13, ZYDIS_REG_XMM14, ZYDIS_REG_XMM15,
/* 256 bit multimedia registers */ /* 256 bit multimedia registers */
REG_YMM0, REG_YMM1, REG_YMM2, REG_YMM3, ZYDIS_REG_YMM0, ZYDIS_REG_YMM1, ZYDIS_REG_YMM2, ZYDIS_REG_YMM3,
REG_YMM4, REG_YMM5, REG_YMM6, REG_YMM7, ZYDIS_REG_YMM4, ZYDIS_REG_YMM5, ZYDIS_REG_YMM6, ZYDIS_REG_YMM7,
REG_YMM8, REG_YMM9, REG_YMM10, REG_YMM11, ZYDIS_REG_YMM8, ZYDIS_REG_YMM9, ZYDIS_REG_YMM10, ZYDIS_REG_YMM11,
REG_YMM12, REG_YMM13, REG_YMM14, YMM15, ZYDIS_REG_YMM12, ZYDIS_REG_YMM13, ZYDIS_REG_YMM14, YMM15,
/* instruction pointer register */ /* instruction pointer register */
REG_RIP, ZYDIS_REG_RIP,
REG_FORCE_WORD = 0x7FFF ZYDIS_REG_FORCE_WORD = 0x7FFF
} ZyDisRegister; } ZydisRegister;
/** /**
* @brief Values that represent the type of a decoded operand. * @brief Values that represent the type of a decoded operand.
*/ */
typedef enum _ZyDisOperandType /*: uint8_t*/ typedef enum _ZydisOperandType /*: uint8_t*/
{ {
/** /**
* @brief The operand is not used. * @brief The operand is not used.
*/ */
OPTYPE_NONE, ZYDIS_OPTYPE_NONE,
/** /**
* @brief The operand is a register operand. * @brief The operand is a register operand.
*/ */
OPTYPE_REGISTER, ZYDIS_OPTYPE_REGISTER,
/** /**
* @brief The operand is a memory operand. * @brief The operand is a memory operand.
*/ */
OPTYPE_MEMORY, ZYDIS_OPTYPE_MEMORY,
/** /**
* @brief The operand is a pointer operand. * @brief The operand is a pointer operand.
*/ */
OPTYPE_POINTER, ZYDIS_OPTYPE_POINTER,
/** /**
* @brief The operand is an immediate operand. * @brief The operand is an immediate operand.
*/ */
OPTYPE_IMMEDIATE, ZYDIS_OPTYPE_IMMEDIATE,
/** /**
* @brief The operand is a relative immediate operand. * @brief The operand is a relative immediate operand.
*/ */
OPTYPE_REL_IMMEDIATE, ZYDIS_OPTYPE_REL_IMMEDIATE,
/** /**
* @brief The operand is a constant value. * @brief The operand is a constant value.
*/ */
OPTYPE_CONSTANT ZYDIS_OPTYPE_CONSTANT
} ZyDisOperandType; } ZydisOperandType;
/** /**
* @brief Values that represent the operand access mode. * @brief Values that represent the operand access mode.
*/ */
typedef enum _ZyDisOperandAccessMode /* : uint8_t */ typedef enum _ZydisOperandAccessMode /* : uint8_t */
{ {
OPACCESSMODE_NA, ZYDIS_OPACCESSMODE_NA,
/** /**
* @brief The operand is accessed in read-only mode. * @brief The operand is accessed in read-only mode.
*/ */
OPACCESSMODE_READ, ZYDIS_OPACCESSMODE_READ,
/** /**
* @brief The operand is accessed in write mode. * @brief The operand is accessed in write mode.
*/ */
OPACCESSMODE_WRITE, ZYDIS_OPACCESSMODE_WRITE,
/** /**
* @brief The operand is accessed in read-write mode. * @brief The operand is accessed in read-write mode.
*/ */
OPACCESSMODE_READWRITE ZYDIS_OPACCESSMODE_READWRITE
} ZyDisOperandAccessMode; } ZydisOperandAccessMode;
/** /**
* @brief This struct holds information about a decoded operand. * @brief This struct holds information about a decoded operand.
*/ */
typedef struct _ZyDisOperandInfo typedef struct _ZydisOperandInfo
{ {
/** /**
* @brief The type of the operand. * @brief The type of the operand.
* @see ZyDisOperandType * @see ZydisOperandType
*/ */
uint8_t type; uint8_t type;
/** /**
@ -265,17 +263,17 @@ typedef struct _ZyDisOperandInfo
uint16_t size; uint16_t size;
/** /**
* @brief The operand access mode. * @brief The operand access mode.
* @see ZyDisOperandAccessMode * @see ZydisOperandAccessMode
*/ */
uint8_t access_mode; uint8_t access_mode;
/** /**
* @brief The base register. * @brief The base register.
* @see ZyDisRegister * @see ZydisRegister
*/ */
uint16_t base; uint16_t base;
/** /**
* @brief The index register. * @brief The index register.
* @see ZyDisRegister * @see ZydisRegister
*/ */
uint16_t index; uint16_t index;
/** /**
@ -308,12 +306,12 @@ typedef struct _ZyDisOperandInfo
uint32_t off; uint32_t off;
} ptr; } ptr;
} lval; } lval;
} ZyDisOperandInfo; } ZydisOperandInfo;
/** /**
* @brief This struct holds information about a decoded instruction. * @brief This struct holds information about a decoded instruction.
*/ */
typedef struct _ZyDisInstructionInfo typedef struct _ZydisInstructionInfo
{ {
/** /**
* @brief The instruction flags. * @brief The instruction flags.
@ -321,7 +319,7 @@ typedef struct _ZyDisInstructionInfo
uint32_t flags; uint32_t flags;
/** /**
* @brief The instruction mnemonic. * @brief The instruction mnemonic.
* @see ZyDisInstructionMnemonic * @see ZydisInstructionMnemonic
*/ */
uint16_t mnemonic; uint16_t mnemonic;
/** /**
@ -351,11 +349,11 @@ typedef struct _ZyDisInstructionInfo
/** /**
* @brief The decoded operands. * @brief The decoded operands.
*/ */
ZyDisOperandInfo operand[4]; ZydisOperandInfo operand[4];
/** /**
* @brief The segment register. This value will default to @c NONE, if no segment register * @brief The segment register. This value will default to @c NONE, if no segment register
* prefix is present. * prefix is present.
* @see ZyDisRegister * @see ZydisRegister
*/ */
uint16_t segment; uint16_t segment;
/** /**
@ -527,7 +525,7 @@ typedef struct _ZyDisInstructionInfo
/** /**
* @brief The instruction definition. * @brief The instruction definition.
*/ */
const ZyDisInstructionDefinition *instrDefinition; const void* instrDefinition; /* TODO: Port instruction definition types */
/** /**
* @brief The instruction address points to the current instruction (relative to the * @brief The instruction address points to the current instruction (relative to the
* initial instruction pointer). * initial instruction pointer).
@ -539,10 +537,10 @@ typedef struct _ZyDisInstructionInfo
* This field is used to properly format relative instructions. * This field is used to properly format relative instructions.
*/ */
uint64_t instrPointer; uint64_t instrPointer;
} ZyDisInstructionInfo; } ZydisInstructionInfo;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _VDE_ZyDisDISASSEMBLERTYPESC_H_ */ #endif /* _ZYDIS_TYPES_H_ */

46
Bindings/C/ZydisUtils.cpp Normal file
View File

@ -0,0 +1,46 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#include "ZydisUtils.h"
#include "ZydisUtils.hpp"
static_assert(
sizeof(ZydisInstructionInfo) == sizeof(Zydis::InstructionInfo),
"struct size mismatch");
static_assert(
sizeof(ZydisOperandInfo) == sizeof(Zydis::OperandInfo),
"struct size mismatch");
uint64_t ZydisCalcAbsoluteTarget(const ZydisInstructionInfo *info, const ZydisOperandInfo *operand)
{
return Zydis::CalcAbsoluteTarget(
*reinterpret_cast<const Zydis::InstructionInfo*>(info),
*reinterpret_cast<const Zydis::OperandInfo*>(operand));
}

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : athre0z Modifications : Joel Höner
Last change : 04. February 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,40 +26,29 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#ifndef _VDE_ZyDisDISASSEMBLERUTILSC_H_ #ifndef _ZYDIS_UTILS_H_
#define _VDE_ZyDisDISASSEMBLERUTILSC_H_ #define _ZYDIS_UTILS_H_
#include "ZyDisDisassemblerTypes.h"
#include "ZyDisInternalConfig.h"
#include <stdint.h> #include <stdint.h>
#include "ZydisTypes.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
typedef struct _ZyDisContextDescriptor
{
uint8_t type;
void *ptr;
} ZyDisContextDescriptor;
/** /**
* @brief Calculates the absolute target address of a relative instruction operand. * @brief Calculates the absolute target address of a relative instruction operand.
* @param info The instruction info. * @param info The instruction info.
* @param operand The operand. * @param operand The operand.
* @return The absolute target address. * @return The absolute target address.
*/ */
ZYDIS_EXPORT uint64_t ZyDisCalcAbsoluteTarget( uint64_t ZydisCalcAbsoluteTarget(const ZydisInstructionInfo* info, const ZydisOperandInfo* operand);
const ZyDisInstructionInfo *info,
const ZyDisOperandInfo *operand);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _VDE_ZyDisDISASSEMBLERUTILSC_H_ */ #endif /* _ZYDIS_UTILS_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 2.8.12)
include(GenerateExportHeader) include(GenerateExportHeader)
project(VerteronDisassemblerEngine) project(ZyanDisassemblerEngine)
option(BUILD_SHARED_LIBS "Build shared libraries rather than static ones" FALSE) option(BUILD_SHARED_LIBS "Build shared libraries rather than static ones" FALSE)
option(FORCE_SHARED_CRT option(FORCE_SHARED_CRT

View File

@ -0,0 +1,86 @@
#include <Zydis.h>
#include <stdio.h>
#include <stdint.h>
int main()
{
uint8_t data32[] =
{
0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x6A, 0xFE, 0x68, 0xD8, 0x18, 0x09, 0x77, 0x68, 0x85, 0xD2,
0x09, 0x77, 0x64, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0xEC, 0x14, 0x53, 0x56, 0x57,
0xA1, 0x68, 0xEE, 0x13, 0x77, 0x31, 0x45, 0xF8, 0x33, 0xC5, 0x50, 0x8D, 0x45, 0xF0, 0x64,
0xA3, 0x00, 0x00, 0x00, 0x00, 0x89, 0x65, 0xE8, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00,
0x8B, 0x5D, 0x08, 0xF6, 0xC3, 0x04, 0x0F, 0x85, 0x57, 0x74, 0x00, 0x00, 0x53, 0x6A, 0x00,
0xFF, 0x35, 0xA0, 0xE3, 0x13, 0x77, 0xFF, 0x15, 0x00, 0x10, 0x14, 0x77, 0x85, 0xC0, 0x0F,
0x84, 0xC6, 0x48, 0x04, 0x00, 0xC7, 0x45, 0x08, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xFC,
0xFE, 0xFF, 0xFF, 0xFF, 0x33, 0xC0, 0x8B, 0x4D, 0xF0, 0x64, 0x89, 0x0D, 0x00, 0x00, 0x00,
0x00, 0x59, 0x5F, 0x5E, 0x5B, 0x8B, 0xE5, 0x5D, 0xC2, 0x04, 0x00
};
uint8_t data64[] =
{
0x48, 0x89, 0x5C, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x89, 0x4C, 0x24, 0x08, 0x57,
0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x83, 0xEC, 0x40, 0x4C, 0x8B, 0xF2,
0x8B, 0xD9, 0x48, 0xC7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x33, 0xF6, 0x48, 0x89,
0x74, 0x24, 0x30, 0x45, 0x33, 0xFF, 0xF7, 0xC1, 0x8D, 0xF0, 0xFF, 0xFF, 0x0F, 0x85, 0xAA,
0x53, 0x08, 0x00, 0xF6, 0xC1, 0x40, 0x8B, 0xFE, 0x41, 0xBD, 0x08, 0x00, 0x00, 0x00, 0x41,
0x0F, 0x45, 0xFD, 0xF6, 0xC1, 0x02, 0x48, 0x8B, 0x0D, 0x10, 0xD4, 0x0E, 0x00, 0x0F, 0x85,
0x40, 0xE1, 0x01, 0x00, 0x8B, 0x15, 0x4C, 0xD5, 0x0E, 0x00, 0x81, 0xC2, 0x00, 0x00, 0x14,
0x00, 0x0B, 0xD7, 0x4D, 0x8B, 0xC6, 0xFF, 0x15, 0x3B, 0x2F, 0x10, 0x00, 0x48, 0x8B, 0xD8,
0x48, 0x85, 0xC0, 0x0F, 0x84, 0x93, 0x78, 0x0A, 0x00, 0x48, 0x8B, 0xC3, 0x48, 0x8B, 0x5C,
0x24, 0x78, 0x48, 0x8B, 0xB4, 0x24, 0x80, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x40, 0x41,
0x5F, 0x41, 0x5E, 0x41, 0x5D, 0x41, 0x5C, 0x5F, 0xC3
};
ZydisInstructionInfo info;
ZydisInstructionDecoderContext* decoder = NULL;
ZydisBaseInstructionFormatterContext* formatter = NULL;
ZydisBaseInputContext* input32 = NULL;
ZydisBaseInputContext* input64 = NULL;
decoder = ZydisInstructionDecoder_Create();
formatter = ZydisIntelInstructionFormatter_Create();
input32 = ZydisMemoryInput_Create(&data32[0], sizeof(data32));
input64 = ZydisMemoryInput_Create(&data64[0], sizeof(data64));
ZydisInstructionDecoder_SetDisassemblerMode(decoder, DM_M32BIT);
ZydisInstructionDecoder_SetDataSource(decoder, input32);
ZydisInstructionDecoder_SetInstructionPointer(decoder, 0x77091852);
puts("32 bit test ...\n\n");
while (ZydisInstructionDecoder_DecodeInstruction(decoder, &info))
{
printf("%08X ", (uint32_t)(info.instrAddress & 0xFFFFFFFF));
if (info.flags & ZYDIS_IF_ERROR_MASK)
{
printf("db %02X\n", info.data[0]);
}
else
{
printf("%s\n", ZydisBaseInstructionFormatter_FormatInstruction(formatter, &info));
}
}
puts("\n");
ZydisInstructionDecoder_SetDisassemblerMode(decoder, DM_M64BIT);
ZydisInstructionDecoder_SetDataSource(decoder, input64);
ZydisInstructionDecoder_SetInstructionPointer(decoder, 0x00007FFA39A81930ull);
puts("64 bit test ...\n\n");
while (ZydisInstructionDecoder_DecodeInstruction(decoder, &info))
{
printf("%016llX ", info.instrAddress);
if (info.flags & ZYDIS_IF_ERROR_MASK)
{
printf("db %02X", info.data[0]);
}
else
{
printf("%s\n", ZydisBaseInstructionFormatter_FormatInstruction(formatter, &info));
}
}
getchar();
return 0;
}

View File

@ -1,115 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications :
Last change : 29. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#include <stdint.h>
#include <iostream>
#include <iomanip>
#include <ZyDisDisassembler.hpp>
using namespace Verteron;
int main(int argc, char* argv[])
{
(void)argc; (void)argv;
uint8_t data32[] =
{
0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x6A, 0xFE, 0x68, 0xD8, 0x18, 0x09, 0x77, 0x68, 0x85, 0xD2,
0x09, 0x77, 0x64, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0xEC, 0x14, 0x53, 0x56, 0x57,
0xA1, 0x68, 0xEE, 0x13, 0x77, 0x31, 0x45, 0xF8, 0x33, 0xC5, 0x50, 0x8D, 0x45, 0xF0, 0x64,
0xA3, 0x00, 0x00, 0x00, 0x00, 0x89, 0x65, 0xE8, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00,
0x8B, 0x5D, 0x08, 0xF6, 0xC3, 0x04, 0x0F, 0x85, 0x57, 0x74, 0x00, 0x00, 0x53, 0x6A, 0x00,
0xFF, 0x35, 0xA0, 0xE3, 0x13, 0x77, 0xFF, 0x15, 0x00, 0x10, 0x14, 0x77, 0x85, 0xC0, 0x0F,
0x84, 0xC6, 0x48, 0x04, 0x00, 0xC7, 0x45, 0x08, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xFC,
0xFE, 0xFF, 0xFF, 0xFF, 0x33, 0xC0, 0x8B, 0x4D, 0xF0, 0x64, 0x89, 0x0D, 0x00, 0x00, 0x00,
0x00, 0x59, 0x5F, 0x5E, 0x5B, 0x8B, 0xE5, 0x5D, 0xC2, 0x04, 0x00
};
uint8_t data64[] =
{
0x48, 0x89, 0x5C, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x89, 0x4C, 0x24, 0x08, 0x57,
0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x83, 0xEC, 0x40, 0x4C, 0x8B, 0xF2,
0x8B, 0xD9, 0x48, 0xC7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x33, 0xF6, 0x48, 0x89,
0x74, 0x24, 0x30, 0x45, 0x33, 0xFF, 0xF7, 0xC1, 0x8D, 0xF0, 0xFF, 0xFF, 0x0F, 0x85, 0xAA,
0x53, 0x08, 0x00, 0xF6, 0xC1, 0x40, 0x8B, 0xFE, 0x41, 0xBD, 0x08, 0x00, 0x00, 0x00, 0x41,
0x0F, 0x45, 0xFD, 0xF6, 0xC1, 0x02, 0x48, 0x8B, 0x0D, 0x10, 0xD4, 0x0E, 0x00, 0x0F, 0x85,
0x40, 0xE1, 0x01, 0x00, 0x8B, 0x15, 0x4C, 0xD5, 0x0E, 0x00, 0x81, 0xC2, 0x00, 0x00, 0x14,
0x00, 0x0B, 0xD7, 0x4D, 0x8B, 0xC6, 0xFF, 0x15, 0x3B, 0x2F, 0x10, 0x00, 0x48, 0x8B, 0xD8,
0x48, 0x85, 0xC0, 0x0F, 0x84, 0x93, 0x78, 0x0A, 0x00, 0x48, 0x8B, 0xC3, 0x48, 0x8B, 0x5C,
0x24, 0x78, 0x48, 0x8B, 0xB4, 0x24, 0x80, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x40, 0x41,
0x5F, 0x41, 0x5E, 0x41, 0x5D, 0x41, 0x5C, 0x5F, 0xC3
};
VXInstructionInfo info;
VXInstructionDecoder decoder;
VXIntelInstructionFormatter formatter;
VXMemoryDataSource input32(&data32[0], sizeof(data32));
VXMemoryDataSource input64(&data64[0], sizeof(data64));
decoder.setDisassemblerMode(VXDisassemblerMode::M32BIT);
decoder.setDataSource(&input32);
decoder.setInstructionPointer(0x77091852);
std::cout << "32 bit test ..." << std::endl << std::endl;
while (decoder.decodeInstruction(info))
{
std::cout << std::hex << std::setw(8) << std::setfill('0') << std::uppercase
<< info.instrAddress << " ";
if (info.flags & IF_ERROR_MASK)
{
std::cout << "db " << std::setw(2) << info.data[0];
} else
{
std::cout << formatter.formatInstruction(info) << std::endl;
}
}
std::cout << std::endl;
decoder.setDisassemblerMode(VXDisassemblerMode::M64BIT);
decoder.setDataSource(&input64);
decoder.setInstructionPointer(0x00007FFA39A81930ull);
std::cout << "64 bit test ..." << std::endl << std::endl;
while (decoder.decodeInstruction(info))
{
std::cout << std::hex << std::setw(16) << std::setfill('0') << std::uppercase
<< info.instrAddress << " ";
if (info.flags & IF_ERROR_MASK)
{
std::cout << "db " << std::setw(2) << info.data[0];
} else
{
std::cout << formatter.formatInstruction(info) << std::endl;
}
}
std::cin.get();
return 0;
}

View File

@ -1,123 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : athre0z
Last change : 04. February 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#include <ZyDisDisassembler.h>
#include <stdio.h>
#include <stdint.h>
int main()
{
uint8_t data32[] =
{
0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x6A, 0xFE, 0x68, 0xD8, 0x18, 0x09, 0x77, 0x68, 0x85, 0xD2,
0x09, 0x77, 0x64, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0xEC, 0x14, 0x53, 0x56, 0x57,
0xA1, 0x68, 0xEE, 0x13, 0x77, 0x31, 0x45, 0xF8, 0x33, 0xC5, 0x50, 0x8D, 0x45, 0xF0, 0x64,
0xA3, 0x00, 0x00, 0x00, 0x00, 0x89, 0x65, 0xE8, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00,
0x8B, 0x5D, 0x08, 0xF6, 0xC3, 0x04, 0x0F, 0x85, 0x57, 0x74, 0x00, 0x00, 0x53, 0x6A, 0x00,
0xFF, 0x35, 0xA0, 0xE3, 0x13, 0x77, 0xFF, 0x15, 0x00, 0x10, 0x14, 0x77, 0x85, 0xC0, 0x0F,
0x84, 0xC6, 0x48, 0x04, 0x00, 0xC7, 0x45, 0x08, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xFC,
0xFE, 0xFF, 0xFF, 0xFF, 0x33, 0xC0, 0x8B, 0x4D, 0xF0, 0x64, 0x89, 0x0D, 0x00, 0x00, 0x00,
0x00, 0x59, 0x5F, 0x5E, 0x5B, 0x8B, 0xE5, 0x5D, 0xC2, 0x04, 0x00
};
uint8_t data64[] =
{
0x48, 0x89, 0x5C, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x89, 0x4C, 0x24, 0x08, 0x57,
0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x83, 0xEC, 0x40, 0x4C, 0x8B, 0xF2,
0x8B, 0xD9, 0x48, 0xC7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x33, 0xF6, 0x48, 0x89,
0x74, 0x24, 0x30, 0x45, 0x33, 0xFF, 0xF7, 0xC1, 0x8D, 0xF0, 0xFF, 0xFF, 0x0F, 0x85, 0xAA,
0x53, 0x08, 0x00, 0xF6, 0xC1, 0x40, 0x8B, 0xFE, 0x41, 0xBD, 0x08, 0x00, 0x00, 0x00, 0x41,
0x0F, 0x45, 0xFD, 0xF6, 0xC1, 0x02, 0x48, 0x8B, 0x0D, 0x10, 0xD4, 0x0E, 0x00, 0x0F, 0x85,
0x40, 0xE1, 0x01, 0x00, 0x8B, 0x15, 0x4C, 0xD5, 0x0E, 0x00, 0x81, 0xC2, 0x00, 0x00, 0x14,
0x00, 0x0B, 0xD7, 0x4D, 0x8B, 0xC6, 0xFF, 0x15, 0x3B, 0x2F, 0x10, 0x00, 0x48, 0x8B, 0xD8,
0x48, 0x85, 0xC0, 0x0F, 0x84, 0x93, 0x78, 0x0A, 0x00, 0x48, 0x8B, 0xC3, 0x48, 0x8B, 0x5C,
0x24, 0x78, 0x48, 0x8B, 0xB4, 0x24, 0x80, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x40, 0x41,
0x5F, 0x41, 0x5E, 0x41, 0x5D, 0x41, 0x5C, 0x5F, 0xC3
};
ZyDisInstructionInfo info;
ZyDisInstructionDecoderContext* decoder = NULL;
ZyDisBaseInstructionFormatterContext* formatter = NULL;
ZyDisBaseDataSourceContext* input32 = NULL;
ZyDisBaseDataSourceContext* input64 = NULL;
decoder = ZyDisInstructionDecoder_Create();
formatter = ZyDisIntelInstructionFormatter_Create();
input32 = ZyDisMemoryDataSource_Create(&data32[0], sizeof(data32));
input64 = ZyDisMemoryDataSource_Create(&data64[0], sizeof(data64));
ZyDisInstructionDecoder_SetDisassemblerMode(decoder, DM_M32BIT);
ZyDisInstructionDecoder_SetDataSource(decoder, input32);
ZyDisInstructionDecoder_SetInstructionPointer(decoder, 0x77091852);
puts("32 bit test ...\n\n");
while (ZyDisInstructionDecoder_DecodeInstruction(decoder, &info))
{
printf("%08X ", (uint32_t)(info.instrAddress & 0xFFFFFFFF));
if (info.flags & IF_ERROR_MASK)
{
printf("db %02X\n", info.data[0]);
}
else
{
printf("%s\n", ZyDisBaseInstructionFormatter_FormatInstruction(formatter, &info));
}
}
puts("\n");
ZyDisInstructionDecoder_SetDisassemblerMode(decoder, DM_M64BIT);
ZyDisInstructionDecoder_SetDataSource(decoder, input64);
ZyDisInstructionDecoder_SetInstructionPointer(decoder, 0x00007FFA39A81930ull);
puts("64 bit test ...\n\n");
while (ZyDisInstructionDecoder_DecodeInstruction(decoder, &info))
{
printf("%016llX ", info.instrAddress);
if (info.flags & IF_ERROR_MASK)
{
printf("db %02X", info.data[0]);
}
else
{
printf("%s\n", ZyDisBaseInstructionFormatter_FormatInstruction(formatter, &info));
}
}
ZyDisBaseDataSource_Release(input32);
ZyDisBaseDataSource_Release(input64);
ZyDisBaseInstructionFormatter_Release(formatter);
ZyDisInstructionDecoder_Release(decoder);
getchar();
return 0;
}

View File

@ -1,195 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : athre0z
Last change : 19. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#include <ZyDisDisassembler.h>
#include <Windows.h>
int main(int argc, char* argv[])
{
ZYDIS_UNUSED(argc); ZYDIS_UNUSED(argv);
// TODO: port to C
/*
// Find module base in memory
void *moduleBase = GetModuleHandle("kernel32.dll");
uintptr_t baseAddress = (uintptr_t)moduleBase;
// Parse PE headers
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)moduleBase;
if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{
return 1;
}
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(baseAddress + dosHeader->e_lfanew);
if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
{
return 1;
}
// Initialize disassembler
ZyDisInstructionInfo info;
ZyDisInstructionDecoder decoder;
ZyDisExactSymbolResolver resolver;
ZyDisIntelInstructionFormatter formatter;
#ifdef _M_X64
decoder.setDisassemblerMode(ZyDisDisassemblerMode::M64BIT);
#else
decoder.setDisassemblerMode(ZyDisDisassemblerMode::M32BIT);
#endif
formatter.setSymbolResolver(&resolver);
// Initialize output stream
std::ofstream out;
out.open(".\\output.txt");
// Find all call and jump targets
uint64_t subCount = 0;
uint64_t locCount = 0;
PIMAGE_SECTION_HEADER sectionHeader =
reinterpret_cast<PIMAGE_SECTION_HEADER>(
reinterpret_cast<uintptr_t>(ntHeaders) + sizeof(IMAGE_NT_HEADERS)
+ ntHeaders->FileHeader.SizeOfOptionalHeader - sizeof(IMAGE_OPTIONAL_HEADER));
for (unsigned int i = 0; i < ntHeaders->FileHeader.NumberOfSections; ++i)
{
if (sectionHeader->Characteristics & IMAGE_SCN_CNT_CODE)
{
ZyDisMemoryDataSource input(reinterpret_cast<const void*>(
baseAddress + sectionHeader->VirtualAddress), sectionHeader->SizeOfRawData);
decoder.setDataSource(&input);
decoder.setInstructionPointer(baseAddress + sectionHeader->VirtualAddress);
while (decoder.decodeInstruction(info))
{
// Skip invalid and non-relative instructions
if ((info.flags & IF_ERROR_MASK) || !(info.flags & IF_RELATIVE))
{
continue;
}
switch (info.mnemonic)
{
case ZyDisInstructionMnemonic::CALL:
resolver.setSymbol(VDECalcAbsoluteTarget(info, info.operand[0]),
std::string("sub_" + std::to_string(subCount)).c_str());
subCount++;
break;
case ZyDisInstructionMnemonic::JMP:
case ZyDisInstructionMnemonic::JO:
case ZyDisInstructionMnemonic::JNO:
case ZyDisInstructionMnemonic::JB:
case ZyDisInstructionMnemonic::JNB:
case ZyDisInstructionMnemonic::JE:
case ZyDisInstructionMnemonic::JNE:
case ZyDisInstructionMnemonic::JBE:
case ZyDisInstructionMnemonic::JA:
case ZyDisInstructionMnemonic::JS:
case ZyDisInstructionMnemonic::JNS:
case ZyDisInstructionMnemonic::JP:
case ZyDisInstructionMnemonic::JNP:
case ZyDisInstructionMnemonic::JL:
case ZyDisInstructionMnemonic::JGE:
case ZyDisInstructionMnemonic::JLE:
case ZyDisInstructionMnemonic::JG:
case ZyDisInstructionMnemonic::JCXZ:
case ZyDisInstructionMnemonic::JECXZ:
case ZyDisInstructionMnemonic::JRCXZ:
resolver.setSymbol(VDECalcAbsoluteTarget(info, info.operand[0]),
std::string("loc_" + std::to_string(locCount)).c_str());
locCount++;
break;
default:
break;
}
}
}
sectionHeader++;
}
// Add entry point symbol
resolver.setSymbol(baseAddress + ntHeaders->OptionalHeader.AddressOfEntryPoint, "EntryPoint");
// Add exported symbols
if (ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress > 0)
{
PIMAGE_EXPORT_DIRECTORY exports =
reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(reinterpret_cast<LPBYTE>(baseAddress) +
ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
PDWORD address =
reinterpret_cast<PDWORD>(reinterpret_cast<LPBYTE>(baseAddress) +
exports->AddressOfFunctions);
PDWORD name =
reinterpret_cast<PDWORD>(reinterpret_cast<LPBYTE>(baseAddress) +
exports->AddressOfNames);
PWORD ordinal =
reinterpret_cast<PWORD>(reinterpret_cast<LPBYTE>(baseAddress) +
exports->AddressOfNameOrdinals);
for(unsigned int i = 0; i < exports->NumberOfNames; ++i)
{
resolver.setSymbol(baseAddress + address[ordinal[i]],
reinterpret_cast<char*>(baseAddress) + name[i]);
}
}
// Disassemble
sectionHeader =
reinterpret_cast<PIMAGE_SECTION_HEADER>(
reinterpret_cast<uintptr_t>(ntHeaders) + sizeof(IMAGE_NT_HEADERS)
+ ntHeaders->FileHeader.SizeOfOptionalHeader - sizeof(IMAGE_OPTIONAL_HEADER));
for (unsigned int i = 0; i < ntHeaders->FileHeader.NumberOfSections; ++i)
{
if (sectionHeader->Characteristics & IMAGE_SCN_CNT_CODE)
{
ZyDisMemoryDataSource input(reinterpret_cast<const void*>(
baseAddress + sectionHeader->VirtualAddress), sectionHeader->SizeOfRawData);
decoder.setDataSource(&input);
decoder.setInstructionPointer(baseAddress + sectionHeader->VirtualAddress);
while (decoder.decodeInstruction(info))
{
uint64_t offset;
const char *symbol = resolver.resolveSymbol(info, info.instrAddress, offset);
if (symbol)
{
out << symbol << ": " << std::endl;
}
out << " " << std::hex << std::setw(16) << std::setfill('0')
<< info.instrAddress << " ";
if (info.flags & IF_ERROR_MASK)
{
out << "db " << std::hex << std::setw(2) << std::setfill('0')
<< static_cast<int>(info.data[0]) << std::endl;
} else
{
out << formatter.formatInstruction(info) << std::endl;
}
}
}
sectionHeader++;
}
out.close();
*/
return 0;
}

View File

@ -1,4 +1,4 @@
Verteron Disassembler Engine (VDE) Zyan Disassembler Engine (Zydis)
================================== ==================================
Fast and lightweight x86/x86-64 disassembler library. Fast and lightweight x86/x86-64 disassembler library.
@ -18,15 +18,15 @@ Fast and lightweight x86/x86-64 disassembler library.
## Quick Example ## ## Quick Example ##
The following example program uses VDE to disassemble a given memory buffer and prints the output to the console. The following example program uses Zydis to disassemble a given memory buffer and prints the output to the console.
```C++ ```C++
#include <tchar.h> #include <tchar.h>
#include <iostream> #include <iostream>
#include <stdint.h> #include <stdint.h>
#include "VXDisassembler.h" #include "Zydis.hpp"
using namespace Verteron; using namespace Zydis;
int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[])
{ {
@ -34,13 +34,13 @@ int _tmain(int argc, _TCHAR* argv[])
{ {
0x90, 0xE9, 0x00, 0x00, 0x00, 0x00, 0xC3 0x90, 0xE9, 0x00, 0x00, 0x00, 0x00, 0xC3
}; };
VXMemoryDataSource input(&data[0], sizeof(data)); MemoryInput input(&data[0], sizeof(data));
VXInstructionInfo info; InstructionInfo info;
VXInstructionDecoder decoder; InstructionDecoder decoder;
decoder.setDisassemblerMode(VXDisassemblerMode::M32BIT); decoder.setDisassemblerMode(ZydisMode::M32BIT);
decoder.setDataSource(&input); decoder.setDataSource(&input);
decoder.setInstructionPointer(0); decoder.setInstructionPointer(0);
VXIntelInstructionFormatter formatter; IntelInstructionFormatter formatter;
while (decoder.decodeInstruction(info)) while (decoder.decodeInstruction(info))
{ {
std::cout << formatter.formatInstruction(info) << std::endl; std::cout << formatter.formatInstruction(info) << std::endl;
@ -50,8 +50,8 @@ int _tmain(int argc, _TCHAR* argv[])
## Compilation ## ## Compilation ##
- While VDE supports other compilers in theory, compilation has not been tested with any compiler other than MSVC12 (Visual Studio 2013) - While Zydis supports other compilers in theory, compilation has not been tested with any compiler other than MSVC12 (Visual Studio 2013)
- Multi-compiler support might be added in the future - Multi-compiler support might be added in the future
## License ## ## License ##
Verteron Disassembler Engine is licensed under the MIT License. Dependencies are under their respective licenses. Zyan Disassembler Engine is licensed under the MIT License. Dependencies are under their respective licenses.

View File

@ -1,41 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : athre0z
Last change : 04. February 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#ifndef _VDE_ZyDisDISASSEMBLERC_H_
#define _VDE_ZyDisDISASSEMBLERC_H_
#include "ZyDisDisassemblerTypes.h"
#include "ZyDisInstructionDecoder.h"
#include "ZyDisInstructionFormatter.h"
#include "ZyDisDisassemblerUtils.h"
#endif /* _VDE_ZyDisDISASSEMBLERC_H_ */

View File

@ -1,74 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : athre0z
Last change : 13. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#include "ZyDisDisassemblerUtils.h"
#include <assert.h>
uint64_t ZyDisCalcAbsoluteTarget(const ZyDisInstructionInfo *info, const ZyDisOperandInfo *operand)
{
assert((operand->type == OPTYPE_REL_IMMEDIATE) ||
((operand->type == OPTYPE_MEMORY) && (operand->base == REG_RIP)));
uint64_t truncMask = 0xFFFFFFFFFFFFFFFFull;
if (!(info->flags & IF_DISASSEMBLER_MODE_64))
{
truncMask >>= (64 - info->operand_mode);
}
uint16_t size = operand->size;
if ((operand->type == OPTYPE_MEMORY) && (operand->base == REG_RIP))
{
size = operand->offset;
}
switch (size)
{
case 8:
return (info->instrPointer + operand->lval.sbyte) & truncMask;
case 16:
{
uint32_t delta = operand->lval.sword & truncMask;
if ((info->instrPointer + delta) > 0xFFFF)
{
return (info->instrPointer & 0xF0000) + ((info->instrPointer + delta) & 0xFFFF);
}
return info->instrPointer + delta;
}
case 32:
return (info->instrPointer + operand->lval.sdword) & truncMask;
default:
assert(0);
}
return 0;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,174 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : athre0z
Last change : 14. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#ifndef _VDE_ZyDisINSTRUCTIONFORMATTERC_H_
#define _VDE_ZyDisINSTRUCTIONFORMATTERC_H_
#include "ZyDisDisassemblerTypes.h"
#include "ZyDisDisassemblerUtils.h"
#ifdef __cplusplus
extern "C"
{
#endif
/* ZyDisBaseSymbolResolver ======================================================================== */
typedef struct _ZyDisBaseSymbolResolverContext
{
ZyDisContextDescriptor d;
} ZyDisBaseSymbolResolverContext;
/**
* @brief Releases a symbol resolver.
* @param ctx The context of the symbol resolver to free.
* The context may no longer used after it was released.
*/
ZYDIS_EXPORT void ZyDisBaseSymbolResolver_Release(
ZyDisBaseSymbolResolverContext *ctx);
/**
* @brief Resolves a symbol.
* @param ctx The symbol resolver context.
* @param info The instruction info.
* @param address The address.
* @param offset Pointer to an unsigned 64 bit integer that receives an offset relative to
* the base address of the symbol.
* @return The name of the symbol if the symbol was found, else @c NULL.
*/
ZYDIS_EXPORT const char* ZyDisBaseSymbolResolver_ResolveSymbol(
ZyDisBaseSymbolResolverContext *ctx,
const ZyDisInstructionInfo *info,
uint64_t address,
uint64_t *offset);
/* ZyDisCustomSymbolResolver ====================================================================== */
typedef const char* (*ZyDisCustomSymbolResolver_ResolveSymbolCallback)(
const ZyDisInstructionInfo *info,
uint64_t address,
uint64_t *offset,
void *userData);
/**
* @brief Creates a custom symbol resolver.
* @param resolverCb The resolver callback consulted when symbols need to be resolved.
* @param userData A pointer to arbitrary data passed to the resolver callback.
* May also be @c NULL.
* @return @c NULL if it fails, else a symbol resolver context.
*/
ZYDIS_EXPORT ZyDisBaseSymbolResolverContext* ZyDisCustomSymbolResolver_Create(
ZyDisCustomSymbolResolver_ResolveSymbolCallback resolverCb,
void *userData);
/* ZyDisBaseInstructionFormatter ================================================================== */
typedef struct _ZyDisBaseInstructionFormatterContext
{
ZyDisContextDescriptor d;
} ZyDisBaseInstructionFormatterContext;
typedef void(*ZyDisBaseInstructionFormatter_InternalFormatInstructionCallback)(
ZyDisBaseInstructionFormatterContext *ctx, const ZyDisInstructionInfo *info);
/**
* @brief Formats a decoded instruction.
* @param ctx The instruction formatter context.
* @param info The instruction info.
* @return Pointer to the formatted instruction string. This pointer remains valid until
* this function is called again or the context is released.
*/
ZYDIS_EXPORT const char* ZyDisBaseInstructionFormatter_FormatInstruction(
ZyDisBaseInstructionFormatterContext *ctx,
const ZyDisInstructionInfo *info);
/**
* @brief Returns a pointer to the current symbol resolver.
* @param ctx The instruction formatter context.
* @return Pointer to the current symbol resolver or @c NULL if no symbol resolver is used.
*/
ZYDIS_EXPORT ZyDisBaseSymbolResolverContext* ZyDisBaseInstructionFormatter_GetSymbolResolver(
const ZyDisBaseInstructionFormatterContext *ctx);
/**
* @brief Sets a new symbol resolver.
* @param ctx The instruction formatter context.
* @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol
* resolver should be used.
*/
ZYDIS_EXPORT void ZyDisBaseInstructionFormatter_SetSymbolResolver(
ZyDisBaseInstructionFormatterContext *ctx,
ZyDisBaseSymbolResolverContext *resolver);
/**
* @brief Releases an instruction formatter.
* @param ctx The context of the instruction formatter to release.
* The context may no longer used after it has been released.
*/
ZYDIS_EXPORT void ZyDisBaseInstructionFormatter_Release(
ZyDisBaseInstructionFormatterContext *ctx);
/* ZyDisIntelInstructionFormatter ================================================================= */
/**
* @brief Creates an Intel-syntax instruction formatter.
* @return @c NULL if it fails, else an Intel instruction formatter context.
* @see ZyDisBaseInstructionFormatter_Release
*/
ZYDIS_EXPORT ZyDisBaseInstructionFormatterContext* ZyDisIntelInstructionFormatter_Create(void);
/**
* @brief Creates an Intel-syntax instruction formatter.
* @param resolver The symbol resolver consulted to resolve symbols on formatting.
* @return @c NULL if it fails, else an Intel instruction formatter context.
* @see ZyDisBaseInstructionFormatter_Release
*/
ZYDIS_EXPORT ZyDisBaseInstructionFormatterContext* ZyDisIntelInstructionFormatter_CreateEx(
ZyDisBaseSymbolResolverContext *resolver);
/* ZyDisCustomInstructionFormatter ================================================================ */
/**
* @brief Creats a custom instruction formatter.
* @param formatInsnCb The callback formatting the instruction.
* @return @c NULL if it fails, else a custom instruction formatter context.
*/
ZYDIS_EXPORT ZyDisBaseInstructionFormatterContext* ZyDisCustomInstructionFormatter_Create(
ZyDisBaseInstructionFormatter_InternalFormatInstructionCallback formatInsnCb);
/* ============================================================================================= */
#ifdef __cplusplus
}
#endif
#endif /* _VDE_ZyDisINSTRUCTIONFORMATTERC_H_ */

View File

@ -1,50 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : athre0z
Modifications :
Last change : 16. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
/*
* Include CMake generated header defining macros im-/exporting functions statically or
* dynamically depending what the user requested from CMake.
*/
#include "ZyDisExportConfig.h"
#ifndef _VDE_ZyDisINTERNALCONFIG_H_
#define _VDE_ZyDisINTERNALCONFIG_H_
#ifdef _MSC_VER
# define ZYDIS_INLINE __inline
#else
# define ZYDIS_INLINE static inline
#endif
#define ZYDIS_UNUSED(x) ((void)x)
#endif /* _VDE_ZyDisINTERNALCONFIG_H_ */

View File

@ -1,197 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : athre0z
Modifications :
Last change : 19. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#ifndef _VDE_ZyDisINTERNALHELPERS_H_
#define _VDE_ZyDisINTERNALHELPERS_H_
#include "ZyDisInstructionDecoder.h"
#include "ZyDisInstructionFormatter.h"
#include "ZyDisInternalConfig.h"
#include <assert.h>
/* Types IDs =================================================================================== */
typedef enum _ZyDisTypeId
{
TYPE_BASEDATASOURCE,
TYPE_MEMORYDATASOURCE,
TYPE_CUSTOMDATASOURCE,
TYPE_INSTRUCTIONDECODER,
TYPE_BASESYMBOLRESOLVER,
TYPE_CUSTOMSYMBOLRESOLVER,
TYPE_BASEINSTRUCTIONFORMATTER,
TYPE_INTELINSTRUCTIONFORMATTER,
TYPE_CUSTOMINSTRUCTIONFORMATTER,
} ZyDisTypeId;
/* Context conversion helpers ================================================================== */
ZYDIS_INLINE struct _ZyDisBaseDataSource* ZyDisBaseDataSource_thiz(
ZyDisBaseDataSourceContext *ctx)
{
assert(ctx->d.type == TYPE_BASEDATASOURCE
|| ctx->d.type == TYPE_MEMORYDATASOURCE
|| ctx->d.type == TYPE_CUSTOMDATASOURCE);
return (struct _ZyDisBaseDataSource*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisBaseDataSource* ZyDisBaseDataSource_cthiz(
const ZyDisBaseDataSourceContext *ctx)
{
assert(ctx->d.type == TYPE_BASEDATASOURCE
|| ctx->d.type == TYPE_MEMORYDATASOURCE
|| ctx->d.type == TYPE_CUSTOMDATASOURCE);
return (const struct _ZyDisBaseDataSource*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisMemoryDataSource* ZyDisMemoryDataSource_thiz(
ZyDisBaseDataSourceContext *ctx)
{
assert(ctx->d.type == TYPE_MEMORYDATASOURCE);
return (struct _ZyDisMemoryDataSource*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisMemoryDataSource* ZyDisMemoryDataSource_cthiz(
const ZyDisBaseDataSourceContext *ctx)
{
assert(ctx->d.type == TYPE_MEMORYDATASOURCE);
return (const struct _ZyDisMemoryDataSource*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisCustomDataSource* ZyDisCustomDataSource_thiz(
ZyDisBaseDataSourceContext *ctx)
{
assert(ctx->d.type == TYPE_CUSTOMDATASOURCE);
return (struct _ZyDisCustomDataSource*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisCustomDataSource* ZyDisCustomDataSource_cthiz(
const ZyDisBaseDataSourceContext *ctx)
{
assert(ctx->d.type == TYPE_CUSTOMDATASOURCE);
return (const struct _ZyDisCustomDataSource*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisInstructionDecoder* ZyDisInstructionDecoder_thiz(
ZyDisInstructionDecoderContext *ctx)
{
assert(ctx->d.type == TYPE_INSTRUCTIONDECODER);
return (struct _ZyDisInstructionDecoder*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisInstructionDecoder* ZyDisInstructionDecoder_cthiz(
const ZyDisInstructionDecoderContext *ctx)
{
assert(ctx->d.type == TYPE_INSTRUCTIONDECODER);
return (const struct _ZyDisInstructionDecoder*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisBaseSymbolResolver* ZyDisBaseSymbolResolver_thiz(
ZyDisBaseSymbolResolverContext *ctx)
{
assert(ctx->d.type == TYPE_BASESYMBOLRESOLVER
|| ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (struct _ZyDisBaseSymbolResolver*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisBaseSymbolResolver* ZyDisBaseSymbolResolver_cthiz(
const ZyDisBaseSymbolResolverContext *ctx)
{
assert(ctx->d.type == TYPE_BASESYMBOLRESOLVER
|| ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (const struct _ZyDisBaseSymbolResolver*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisCustomSymbolResolver* ZyDisCustomSymbolResolver_thiz(
ZyDisBaseSymbolResolverContext *ctx)
{
assert(ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (struct _ZyDisCustomSymbolResolver*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisCustomSymbolResolver* ZyDisCustomSymbolResolver_cthiz(
const ZyDisBaseSymbolResolverContext *ctx)
{
assert(ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (const struct _ZyDisCustomSymbolResolver*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisBaseInstructionFormatter* ZyDisBaseInstructionFormatter_thiz(
ZyDisBaseInstructionFormatterContext *ctx)
{
assert(ctx->d.type == TYPE_BASEINSTRUCTIONFORMATTER
|| ctx->d.type == TYPE_INTELINSTRUCTIONFORMATTER
|| ctx->d.type == TYPE_CUSTOMINSTRUCTIONFORMATTER);
return (struct _ZyDisBaseInstructionFormatter*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisBaseInstructionFormatter* ZyDisBaseInstructionFormatter_cthiz(
const ZyDisBaseInstructionFormatterContext *ctx)
{
assert(ctx->d.type == TYPE_BASEINSTRUCTIONFORMATTER
|| ctx->d.type == TYPE_INTELINSTRUCTIONFORMATTER
|| ctx->d.type == TYPE_CUSTOMINSTRUCTIONFORMATTER);
return (const struct _ZyDisBaseInstructionFormatter*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisIntelInstructionFormatter* ZyDisIntelInstructionFormatter_thiz(
ZyDisBaseInstructionFormatterContext *ctx)
{
assert(ctx->d.type == TYPE_INTELINSTRUCTIONFORMATTER);
return (struct _ZyDisIntelInstructionFormatter*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisIntelInstructionFormatter* ZyDisIntelInstructionFormatter_cthiz(
const ZyDisBaseInstructionFormatterContext *ctx)
{
assert(ctx->d.type == TYPE_INTELINSTRUCTIONFORMATTER);
return (const struct _ZyDisIntelInstructionFormatter*)ctx->d.ptr;
}
ZYDIS_INLINE struct _ZyDisCustomInstructionFormatter* ZyDisCustomInstructionFormatter_thiz(
ZyDisBaseInstructionFormatterContext *ctx)
{
assert(ctx->d.type == TYPE_CUSTOMINSTRUCTIONFORMATTER);
return (struct _ZyDisCustomInstructionFormatter*)ctx->d.ptr;
}
ZYDIS_INLINE const struct _ZyDisCustomInstructionFormatter* ZyDisCustomInstructionFormatter_cthiz(
const ZyDisBaseInstructionFormatterContext *ctx)
{
assert(ctx->d.type == TYPE_CUSTOMINSTRUCTIONFORMATTER);
return (struct _ZyDisCustomInstructionFormatter*)ctx->d.ptr;
}
/* ============================================================================================= */
#endif /* _VDE_ZyDisINTERNALHELPERS_H_ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,313 +0,0 @@
/**************************************************************************************************
Verteron Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : athre0z
Last change : 19. March 2015
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
**************************************************************************************************/
#ifndef _VDE_ZyDisOPCODETABLEINTERNAL_H_
#define _VDE_ZyDisOPCODETABLEINTERNAL_H_
#include <stdint.h>
#include "ZyDisOpcodeTable.h"
/**
* @brief Contains all opcode tables.
* Indexed by the numeric value of the opcode.
*/
extern const ZyDisOpcodeTreeNode vxOptreeTable[][256];
/**
* @brief Contains all modrm_mod switch tables.
* Index values:
* 0 = [modrm_mod == !11]
* 1 = [modrm_mod == 11]
*/
extern const ZyDisOpcodeTreeNode vxOptreeModrmMod[][2];
/**
* @brief Contains all modrm_reg switch tables.
* Indexed by the numeric value of the modrm_reg field.
*/
extern const ZyDisOpcodeTreeNode vxOptreeModrmReg[][8];
/**
* @brief Contains all modrm_rm switch tables.
* Indexed by the numeric value of the modrm_rm field.
*/
extern const ZyDisOpcodeTreeNode vxOptreeModrmRm[][8];
/**
* @brief Contains all mandatory-prefix switch tables.
* Index values:
* 0 = none
* 1 = F2
* 2 = F3
* 3 = 66
*/
extern const ZyDisOpcodeTreeNode vxOptreeMandatory[][4];
/**
* @brief Contains all x87 opcode tables.
* Indexed by the numeric value of the 6 lowest bits of the modrm byte (modrm_mod should
* always be 11).
*/
extern const ZyDisOpcodeTreeNode vxOptreeX87[][64];
/**
* @brief Contains all address-size switch tables.
* Index values:
* 0 = 16
* 1 = 32
* 2 = 64
*/
extern const ZyDisOpcodeTreeNode vxOptreeAddressSize[][3];
/**
* @brief Contains all operand-size switch tables.
* Index values:
* 0 = 16
* 1 = 32
* 2 = 64
*/
extern const ZyDisOpcodeTreeNode vxOptreeOperandSize[][3];
/**
* @brief Contains all cpu-mode switch tables.
* Index values:
* 0 = [!= 64]
* 1 = 64
*/
extern const ZyDisOpcodeTreeNode vxOptreeMode[][2];
/**
* @brief Contains all vendor switch tables.
* Index values:
* 0 = AMD
* 1 = Intel
*/
extern const ZyDisOpcodeTreeNode vxOptreeVendor[][2];
/**
* @brief Contains all 3DNow! switch tables.
* Indexed by the numeric value of the 3DNow! opcode.
*/
extern const ZyDisOpcodeTreeNode vxOptree3dnow[][256];
/**
* @brief Contains all vex switch tables.
* Index values:
* 0 = none
* 1 = 0F
* 2 = 0F38
* 3 = 0F3A
* 4 = 66
* 5 = 66_0F
* 6 = 66_0F38
* 7 = 66_0F3A
* 8 = F3
* 9 = F3_0F
* A = F3_0F38
* B = F3_0F3A
* C = F2
* D = F2_0F
* E = F2_0F38
* F = F2_0F3A
*/
extern const ZyDisOpcodeTreeNode vxOptreeVex[][16];
/**
* @brief Contains all vex_w switch tables.
* Indexed by the numeric value of the vex_w field.
*/
extern const ZyDisOpcodeTreeNode vxOptreeVexW[][2];
/**
* @brief Contains all vex_l switch tables.
* Indexed by the numeric value of the vex_l field.
*/
extern const ZyDisOpcodeTreeNode vxOptreeVexL[][2];
/**
* @brief Contains all instruction definitions.
*/
extern const ZyDisInstructionDefinition vxInstrDefinitions[];
/**
* @brief Contains all instruction mnemonic strings.
*/
extern const char* vxInstrMnemonicStrings[];
/**
* @brief Returns the type of the specified opcode tree node.
* @param node The node.
* @return The type of the specified opcode tree node.
*/
ZYDIS_INLINE ZyDisOpcodeTreeNodeType ZyDisGetOpcodeNodeType(ZyDisOpcodeTreeNode node)
{
return (ZyDisOpcodeTreeNodeType)((node >> 12) & 0x0F);
}
/**
* @brief Returns the value of the specified opcode tree node.
* @param node The node.
* @return The value of the specified opcode tree node.
*/
ZYDIS_INLINE uint16_t ZyDisGetOpcodeNodeValue(ZyDisOpcodeTreeNode node)
{
return (node & 0x0FFF);
}
/**
* @brief Returns the root node of the opcode tree.
* @return The root node of the opcode tree.
*/
ZYDIS_INLINE ZyDisOpcodeTreeNode ZyDisGetOpcodeTreeRoot()
{
return 0x1000;
}
/**
* @brief Returns a child node of @c parent specified by @c index.
* @param parent The parent node.
* @param index The index of the child node to retrieve.
* @return The specified child node.
*/
ZYDIS_INLINE ZyDisOpcodeTreeNode ZyDisGetOpcodeTreeChild(ZyDisOpcodeTreeNode parent, uint16_t index)
{
ZyDisOpcodeTreeNodeType nodeType = ZyDisGetOpcodeNodeType(parent);
uint16_t tableIndex = ZyDisGetOpcodeNodeValue(parent);
switch (nodeType)
{
case OTNT_TABLE:
assert(index < 256);
return vxOptreeTable[tableIndex][index];
case OTNT_MODRM_MOD:
assert(index < 2);
return vxOptreeModrmMod[tableIndex][index];
case OTNT_MODRM_REG:
assert(index < 8);
return vxOptreeModrmReg[tableIndex][index];
case OTNT_MODRM_RM:
assert(index < 8);
return vxOptreeModrmRm[tableIndex][index];
case OTNT_MANDATORY:
assert(index < 4);
return vxOptreeMandatory[tableIndex][index];
case OTNT_X87:
assert(index < 64);
return vxOptreeX87[tableIndex][index];
case OTNT_ADDRESS_SIZE:
assert(index < 3);
return vxOptreeAddressSize[tableIndex][index];
case OTNT_OPERAND_SIZE:
assert(index < 3);
return vxOptreeOperandSize[tableIndex][index];
case OTNT_MODE:
assert(index < 2);
return vxOptreeMode[tableIndex][index];
case OTNT_VENDOR:
assert(index < 3);
return vxOptreeVendor[tableIndex][index];
case OTNT_AMD3DNOW:
assert(index < 256);
return vxOptree3dnow[tableIndex][index];
case OTNT_VEX:
assert(index < 16);
return vxOptreeVex[tableIndex][index];
case OTNT_VEXW:
assert(index < 2);
return vxOptreeVexW[tableIndex][index];
case OTNT_VEXL:
assert(index < 2);
return vxOptreeVexL[tableIndex][index];
default:
assert(0);
}
return 0xFFFF;
}
/**
* @brief Returns the instruction definition that is linked to the given @c node.
* @param node The instruction definition node.
* @return Pointer to the instruction definition.
*/
ZYDIS_INLINE const ZyDisInstructionDefinition* ZyDisGetInstructionDefinition(ZyDisOpcodeTreeNode node)
{
assert(ZyDisGetOpcodeNodeType(node) == OTNT_INSTRUCTION_DEFINITION);
return &vxInstrDefinitions[node & 0x0FFF];
}
/**
* @brief Returns the specified instruction mnemonic string.
* @param mnemonic The mnemonic.
* @return The instruction mnemonic string.
*/
ZYDIS_INLINE const char* ZyDisGetInstructionMnemonicString(ZyDisInstructionMnemonic mnemonic)
{
return vxInstrMnemonicStrings[(uint16_t)mnemonic];
}
/**
* @brief Returns the numeric value for a simple operand size definition.
* @param operandSize The defined operand size.
* @return The the numeric value for the simple operand size definition.
*/
ZYDIS_INLINE uint16_t ZyDisGetSimpleOperandSize(ZyDisDefinedOperandSize operandSize)
{
static const uint16_t operandSizes[8] =
{
8, 16, 32, 64, 80, 12, 128, 256
};
uint16_t index = (uint16_t)(operandSize - DOS_B);
assert(index < 8);
return operandSizes[index];
}
/**
* @brief Returns the memory-size part of a complex operand size definition.
* @param operandSize The defined operand size.
* @return The memory-size part of the operand size definition.
*/
ZYDIS_INLINE ZyDisDefinedOperandSize ZyDisGetComplexOperandMemSize(ZyDisDefinedOperandSize operandSize)
{
return (ZyDisDefinedOperandSize)(operandSize & 0x0F);
}
/**
* @brief Returns the register-size part of a complex operand size definition.
* @param operandSize The defined operand size.
* @return The register-size part of the operand size definition.
*/
ZYDIS_INLINE ZyDisDefinedOperandSize ZyDisGetComplexOperandRegSize(ZyDisDefinedOperandSize operandSize)
{
return (ZyDisDefinedOperandSize)((operandSize >> 4) & 0x0F);
}
#endif // _VDE_ZyDisOPCODETABLEINTERNAL_H_

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 29. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,11 +26,14 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#pragma once #ifndef _ZYDIS_DISASSEMBLER_HPP_
#define _ZYDIS_DISASSEMBLER_HPP_
#include "ZyDisDisassemblerTypes.hpp" #include "ZydisInstructionDecoder.hpp"
#include "ZyDisInstructionDecoder.hpp" #include "ZydisInstructionFormatter.hpp"
#include "ZyDisInstructionFormatter.hpp" #include "ZydisSymbolResolver.hpp"
#include "ZyDisDisassemblerUtils.hpp" #include "ZydisUtils.hpp"
#endif /*_ZYDIS_DISASSEMBLER_HPP_ */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 29. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,22 +26,24 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#pragma once
#ifndef _ZYDIS_INSTRUCTIONDECODER_HPP_
#define _ZYDIS_INSTRUCTIONDECODER_HPP_
#include <type_traits> #include <type_traits>
#include <istream> #include <istream>
#include "ZyDisDisassemblerTypes.hpp" #include "ZydisTypes.hpp"
namespace Verteron namespace Zydis
{ {
/////////////////////////////////////////////////////////////////////////////////////////////////// /* BaseInput ==================================================================================== */
/** /**
* @brief The base class for all data-source implementations. * @brief The base class for all data-source implementations.
*/ */
class ZyDisBaseDataSource class BaseInput
{ {
private: private:
uint8_t m_currentInput; uint8_t m_currentInput;
@ -66,12 +66,12 @@ protected:
/** /**
* @brief Default constructor. * @brief Default constructor.
*/ */
ZyDisBaseDataSource() { }; BaseInput() { };
public: public:
/** /**
* @brief Destructor. * @brief Destructor.
*/ */
virtual ~ZyDisBaseDataSource() { }; virtual ~BaseInput() { };
public: public:
/** /**
* @brief Reads the next byte from the data source. This method does NOT increase the * @brief Reads the next byte from the data source. This method does NOT increase the
@ -81,7 +81,7 @@ public:
* @c flags field of the @c info parameter for error flags. * @c flags field of the @c info parameter for error flags.
* Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
uint8_t inputPeek(ZyDisInstructionInfo &info); uint8_t inputPeek(InstructionInfo& info);
/** /**
* @brief Reads the next byte from the data source. This method increases the current * @brief Reads the next byte from the data source. This method increases the current
* input position and the @c length field of the @c info parameter. * input position and the @c length field of the @c info parameter.
@ -92,7 +92,7 @@ public:
* @c flags field of the @c info parameter for error flags. * @c flags field of the @c info parameter for error flags.
* Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
uint8_t inputNext(ZyDisInstructionInfo &info); uint8_t inputNext(InstructionInfo& info);
/** /**
* @brief Reads the next byte(s) from the data source. This method increases the current * @brief Reads the next byte(s) from the data source. This method increases the current
* input position and the @c length field of the @c info parameter. * input position and the @c length field of the @c info parameter.
@ -104,7 +104,7 @@ public:
* Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
template <typename T> template <typename T>
T inputNext(ZyDisInstructionInfo &info); T inputNext(InstructionInfo& info);
/** /**
* @brief Returns the current input byte. The current input byte is set everytime the * @brief Returns the current input byte. The current input byte is set everytime the
* @c inputPeek or @c inputNext method is called. * @c inputPeek or @c inputNext method is called.
@ -133,7 +133,7 @@ public:
virtual bool setPosition(uint64_t position) = 0; virtual bool setPosition(uint64_t position) = 0;
}; };
inline uint8_t ZyDisBaseDataSource::inputPeek(ZyDisInstructionInfo &info) inline uint8_t BaseInput::inputPeek(InstructionInfo& info)
{ {
if (info.length == 15) if (info.length == 15)
{ {
@ -149,7 +149,7 @@ inline uint8_t ZyDisBaseDataSource::inputPeek(ZyDisInstructionInfo &info)
return m_currentInput; return m_currentInput;
} }
inline uint8_t ZyDisBaseDataSource::inputNext(ZyDisInstructionInfo &info) inline uint8_t BaseInput::inputNext(InstructionInfo& info)
{ {
if (info.length == 15) if (info.length == 15)
{ {
@ -168,7 +168,7 @@ inline uint8_t ZyDisBaseDataSource::inputNext(ZyDisInstructionInfo &info)
} }
template <typename T> template <typename T>
inline T ZyDisBaseDataSource::inputNext(ZyDisInstructionInfo &info) inline T BaseInput::inputNext(InstructionInfo& info)
{ {
static_assert(std::is_integral<T>::value, "integral type required"); static_assert(std::is_integral<T>::value, "integral type required");
T result = 0; T result = 0;
@ -184,17 +184,17 @@ inline T ZyDisBaseDataSource::inputNext(ZyDisInstructionInfo &info)
return result; return result;
} }
inline uint8_t ZyDisBaseDataSource::inputCurrent() const inline uint8_t BaseInput::inputCurrent() const
{ {
return m_currentInput; return m_currentInput;
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* MemoryInput ================================================================================== */
/** /**
* @brief A memory-buffer based data source for the @c ZyDisInstructionDecoder class. * @brief A memory-buffer based data source for the @c InstructionDecoder class.
*/ */
class ZyDisMemoryDataSource : public ZyDisBaseDataSource class MemoryInput : public BaseInput
{ {
private: private:
const void* m_inputBuffer; const void* m_inputBuffer;
@ -219,7 +219,7 @@ public:
* @param buffer The input buffer. * @param buffer The input buffer.
* @param bufferLen The length of the input buffer. * @param bufferLen The length of the input buffer.
*/ */
ZyDisMemoryDataSource(const void* buffer, size_t bufferLen) MemoryInput(const void* buffer, size_t bufferLen)
: m_inputBuffer(buffer) : m_inputBuffer(buffer)
, m_inputBufferLen(bufferLen) , m_inputBufferLen(bufferLen)
, m_inputBufferPos(0) { }; , m_inputBufferPos(0) { };
@ -242,39 +242,39 @@ public:
bool setPosition(uint64_t position) override; bool setPosition(uint64_t position) override;
}; };
inline uint8_t ZyDisMemoryDataSource::internalInputPeek() inline uint8_t MemoryInput::internalInputPeek()
{ {
return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos); return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos);
} }
inline uint8_t ZyDisMemoryDataSource::internalInputNext() inline uint8_t MemoryInput::internalInputNext()
{ {
++m_inputBufferPos; ++m_inputBufferPos;
return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos - 1); return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos - 1);
} }
inline bool ZyDisMemoryDataSource::isEndOfInput() const inline bool MemoryInput::isEndOfInput() const
{ {
return (m_inputBufferPos >= m_inputBufferLen); return (m_inputBufferPos >= m_inputBufferLen);
} }
inline uint64_t ZyDisMemoryDataSource::getPosition() const inline uint64_t MemoryInput::getPosition() const
{ {
return m_inputBufferPos; return m_inputBufferPos;
} }
inline bool ZyDisMemoryDataSource::setPosition(uint64_t position) inline bool MemoryInput::setPosition(uint64_t position)
{ {
m_inputBufferPos = position; m_inputBufferPos = position;
return isEndOfInput(); return isEndOfInput();
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* StreamInput ================================================================================== */
/** /**
* @brief A stream based data source for the @c ZyDisInstructionDecoder class. * @brief A stream based data source for the @c InstructionDecoder class.
*/ */
class ZyDisStreamDataSource : public ZyDisBaseDataSource class StreamInput : public BaseInput
{ {
private: private:
std::istream* m_inputStream; std::istream* m_inputStream;
@ -296,7 +296,7 @@ public:
* @brief Constructor. * @brief Constructor.
* @param stream The input stream. * @param stream The input stream.
*/ */
explicit ZyDisStreamDataSource(std::istream *stream) explicit StreamInput(std::istream* stream)
: m_inputStream(stream) { }; : m_inputStream(stream) { };
public: public:
/** /**
@ -317,7 +317,7 @@ public:
bool setPosition(uint64_t position) override; bool setPosition(uint64_t position) override;
}; };
inline uint8_t ZyDisStreamDataSource::internalInputPeek() inline uint8_t StreamInput::internalInputPeek()
{ {
if (!m_inputStream) if (!m_inputStream)
{ {
@ -326,7 +326,7 @@ inline uint8_t ZyDisStreamDataSource::internalInputPeek()
return static_cast<uint8_t>(m_inputStream->peek()); return static_cast<uint8_t>(m_inputStream->peek());
} }
inline uint8_t ZyDisStreamDataSource::internalInputNext() inline uint8_t StreamInput::internalInputNext()
{ {
if (!m_inputStream) if (!m_inputStream)
{ {
@ -335,7 +335,7 @@ inline uint8_t ZyDisStreamDataSource::internalInputNext()
return static_cast<uint8_t>(m_inputStream->get()); return static_cast<uint8_t>(m_inputStream->get());
} }
inline bool ZyDisStreamDataSource::isEndOfInput() const inline bool StreamInput::isEndOfInput() const
{ {
if (!m_inputStream) if (!m_inputStream)
{ {
@ -346,7 +346,7 @@ inline bool ZyDisStreamDataSource::isEndOfInput() const
return !m_inputStream->good(); return !m_inputStream->good();
} }
inline uint64_t ZyDisStreamDataSource::getPosition() const inline uint64_t StreamInput::getPosition() const
{ {
if (!m_inputStream) if (!m_inputStream)
{ {
@ -355,7 +355,7 @@ inline uint64_t ZyDisStreamDataSource::getPosition() const
return m_inputStream->tellg(); return m_inputStream->tellg();
} }
inline bool ZyDisStreamDataSource::setPosition(uint64_t position) inline bool StreamInput::setPosition(uint64_t position)
{ {
if (!m_inputStream) if (!m_inputStream)
{ {
@ -365,12 +365,12 @@ inline bool ZyDisStreamDataSource::setPosition(uint64_t position)
return isEndOfInput(); return isEndOfInput();
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* Enums ======================================================================================== */
/** /**
* @brief Values that represent a disassembler mode. * @brief Values that represent a disassembler mode.
*/ */
enum class ZyDisDisassemblerMode : uint8_t enum class DisassemblerMode : uint8_t
{ {
M16BIT, M16BIT,
M32BIT, M32BIT,
@ -380,18 +380,20 @@ enum class ZyDisDisassemblerMode : uint8_t
/** /**
* @brief Values that represent an instruction-set vendor. * @brief Values that represent an instruction-set vendor.
*/ */
enum class ZyDisInstructionSetVendor : uint8_t enum class InstructionSetVendor : uint8_t
{ {
ANY, ANY,
INTEL, INTEL,
AMD AMD
}; };
/* InstructionDecoder =========================================================================== */
/** /**
* @brief The @c ZyDisInstructionDecoder class decodes x86/x86-64 assembly instructions from a * @brief The @c InstructionDecoder class decodes x86/x86-64 assembly instructions from a
* given data source. * given data source.
*/ */
class ZyDisInstructionDecoder class InstructionDecoder
{ {
private: private:
enum class RegisterClass : uint8_t enum class RegisterClass : uint8_t
@ -404,9 +406,9 @@ private:
XMM XMM
}; };
private: private:
ZyDisBaseDataSource *m_dataSource; BaseInput* m_input;
ZyDisDisassemblerMode m_disassemblerMode; DisassemblerMode m_disassemblerMode;
ZyDisInstructionSetVendor m_preferredVendor; InstructionSetVendor m_preferredVendor;
uint64_t m_instructionPointer; uint64_t m_instructionPointer;
private: private:
/** /**
@ -417,7 +419,7 @@ private:
* @c flags field of the @c info parameter for error flags. * @c flags field of the @c info parameter for error flags.
* Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
uint8_t inputPeek(ZyDisInstructionInfo &info); uint8_t inputPeek(InstructionInfo& info);
/** /**
* @brief Reads the next byte from the data source. This method increases the current * @brief Reads the next byte from the data source. This method increases the current
* input position and the @c length field of the @info parameter. * input position and the @c length field of the @info parameter.
@ -428,7 +430,7 @@ private:
* @c flags field of the @c info parameter for error flags. * @c flags field of the @c info parameter for error flags.
* Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
uint8_t inputNext(ZyDisInstructionInfo &info); uint8_t inputNext(InstructionInfo& info);
/** /**
* @brief Reads the next byte(s) from the data source. This method increases the current * @brief Reads the next byte(s) from the data source. This method increases the current
* input position and the @c length field of the @info parameter. * input position and the @c length field of the @info parameter.
@ -440,7 +442,7 @@ private:
* Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH. * Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
*/ */
template <typename T> template <typename T>
T inputNext(ZyDisInstructionInfo &info); T inputNext(InstructionInfo& info);
/** /**
* @brief Returns the current input byte. The current input byte is set everytime the * @brief Returns the current input byte. The current input byte is set everytime the
* @c inputPeek or @c inputNext method is called. * @c inputPeek or @c inputNext method is called.
@ -451,64 +453,64 @@ private:
/** /**
* @brief Decodes a register operand. * @brief Decodes a register operand.
* @param info The instruction info. * @param info The instruction info.
* @param operand The @c ZyDisOperandInfo struct that receives the decoded data. * @param operand The @c OperandInfo struct that receives the decoded data.
* @param registerClass The register class to use. * @param registerClass The register class to use.
* @param registerId The register id. * @param registerId The register id.
* @param operandSize The defined size of the operand. * @param operandSize The defined size of the operand.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeRegisterOperand(ZyDisInstructionInfo &info, ZyDisOperandInfo &operand, bool decodeRegisterOperand(InstructionInfo& info, OperandInfo& operand,
RegisterClass registerClass, uint8_t registerId, ZyDisDefinedOperandSize operandSize) const; RegisterClass registerClass, uint8_t registerId, DefinedOperandSize operandSize) const;
/** /**
* @brief Decodes a register/memory operand. * @brief Decodes a register/memory operand.
* @param info The instruction info. * @param info The instruction info.
* @param operand The @c ZyDisOperandInfo struct that receives the decoded data. * @param operand The @c OperandInfo struct that receives the decoded data.
* @param registerClass The register class to use. * @param registerClass The register class to use.
* @param operandSize The defined size of the operand. * @param operandSize The defined size of the operand.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeRegisterMemoryOperand(ZyDisInstructionInfo &info, ZyDisOperandInfo &operand, bool decodeRegisterMemoryOperand(InstructionInfo& info, OperandInfo& operand,
RegisterClass registerClass, ZyDisDefinedOperandSize operandSize); RegisterClass registerClass, DefinedOperandSize operandSize);
/** /**
* @brief Decodes an immediate operand. * @brief Decodes an immediate operand.
* @param info The instruction info. * @param info The instruction info.
* @param operand The @c ZyDisOperandInfo struct that receives the decoded data. * @param operand The @c OperandInfo struct that receives the decoded data.
* @param operandSize The defined size of the operand. * @param operandSize The defined size of the operand.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeImmediate(ZyDisInstructionInfo &info, ZyDisOperandInfo &operand, bool decodeImmediate(InstructionInfo& info, OperandInfo& operand,
ZyDisDefinedOperandSize operandSize); DefinedOperandSize operandSize);
/** /**
* @brief Decodes a displacement operand. * @brief Decodes a displacement operand.
* @param info The instruction info. * @param info The instruction info.
* @param operand The @c ZyDisOperandInfo struct that receives the decoded data. * @param operand The @c OperandInfo struct that receives the decoded data.
* @param size The size of the displacement data. * @param size The size of the displacement data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeDisplacement(ZyDisInstructionInfo &info, ZyDisOperandInfo &operand, uint8_t size); bool decodeDisplacement(InstructionInfo& info, OperandInfo& operand, uint8_t size);
private: private:
/** /**
* @brief Decodes the modrm field of the instruction. This method reads an additional * @brief Decodes the modrm field of the instruction. This method reads an additional
* input byte. * input byte.
* @param The @c ZyDisInstructionInfo struct that receives the decoded data. * @param The @c InstructionInfo struct that receives the decoded data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeModrm(ZyDisInstructionInfo &info); bool decodeModrm(InstructionInfo& info);
/** /**
* @brief Decodes the sib field of the instruction. This method reads an additional * @brief Decodes the sib field of the instruction. This method reads an additional
* input byte. * input byte.
* @param info The @c ZyDisInstructionInfo struct that receives the decoded data. * @param info The @c InstructionInfo struct that receives the decoded data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeSIB(ZyDisInstructionInfo &info); bool decodeSIB(InstructionInfo& info);
/** /**
* @brief Decodes vex prefix of the instruction. This method takes the current input byte * @brief Decodes vex prefix of the instruction. This method takes the current input byte
* to determine the vex prefix type and reads one or two additional input bytes * to determine the vex prefix type and reads one or two additional input bytes
* on demand. * on demand.
* @param info The @c ZyDisInstructionInfo struct that receives the decoded data. * @param info The @c InstructionInfo struct that receives the decoded data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeVex(ZyDisInstructionInfo &info); bool decodeVex(InstructionInfo& info);
private: private:
/** /**
* @brief Returns the effective operand size. * @brief Returns the effective operand size.
@ -516,59 +518,59 @@ private:
* @param operandSize The defined operand size. * @param operandSize The defined operand size.
* @return The effective operand size. * @return The effective operand size.
*/ */
uint16_t getEffectiveOperandSize(const ZyDisInstructionInfo &info, uint16_t getEffectiveOperandSize(const InstructionInfo& info,
ZyDisDefinedOperandSize operandSize) const; DefinedOperandSize operandSize) const;
/** /**
* @brief Decodes all instruction operands. * @brief Decodes all instruction operands.
* @param info The @c ZyDisInstructionInfo struct that receives the decoded data. * @param info The @c InstructionInfo struct that receives the decoded data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeOperands(ZyDisInstructionInfo &info); bool decodeOperands(InstructionInfo& info);
/** /**
* @brief Decodes the specified instruction operand. * @brief Decodes the specified instruction operand.
* @param info The instruction info. * @param info The instruction info.
* @param operand The @c ZyDisOperandInfo struct that receives the decoded data. * @param operand The @c OperandInfo struct that receives the decoded data.
* @param operandType The defined type of the operand. * @param operandType The defined type of the operand.
* @param operandSize The defined size of the operand. * @param operandSize The defined size of the operand.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeOperand(ZyDisInstructionInfo &info, ZyDisOperandInfo &operand, bool decodeOperand(InstructionInfo& info, OperandInfo& operand,
ZyDisDefinedOperandType operandType, ZyDisDefinedOperandSize operandSize); DefinedOperandType operandType, DefinedOperandSize operandSize);
private: private:
/** /**
* @brief Resolves the effective operand and address mode of the instruction. * @brief Resolves the effective operand and address mode of the instruction.
* This method requires a non-null value in the @c instrDefinition field of the * This method requires a non-null value in the @c instrDefinition field of the
* @c info struct. * @c info struct.
* @param info The @c ZyDisInstructionInfo struct that receives the effective operand and * @param info The @c InstructionInfo struct that receives the effective operand and
* address mode. * address mode.
*/ */
void resolveOperandAndAddressMode(ZyDisInstructionInfo &info) const; void resolveOperandAndAddressMode(InstructionInfo& info) const;
/** /**
* @brief Calculates the effective REX/VEX.w, r, x, b, l values. * @brief Calculates the effective REX/VEX.w, r, x, b, l values.
* This method requires a non-null value in the @c instrDefinition field of the * This method requires a non-null value in the @c instrDefinition field of the
* @c info struct. * @c info struct.
* @param info The @c ZyDisInstructionInfo struct that receives the effective operand and * @param info The @c InstructionInfo struct that receives the effective operand and
* address mode. * address mode.
*/ */
void calculateEffectiveRexVexValues(ZyDisInstructionInfo &info) const; void calculateEffectiveRexVexValues(InstructionInfo& info) const;
private: private:
/** /**
* @brief Collects and decodes optional instruction prefixes. * @brief Collects and decodes optional instruction prefixes.
* @param info The @c ZyDisInstructionInfo struct that receives the decoded data. * @param info The @c InstructionInfo struct that receives the decoded data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodePrefixes(ZyDisInstructionInfo &info); bool decodePrefixes(InstructionInfo& info);
/** /**
* @brief Collects and decodes the instruction opcodes using the opcode tree. * @brief Collects and decodes the instruction opcodes using the opcode tree.
* @param info The @c ZyDisInstructionInfo struct that receives the decoded data. * @param info The @c InstructionInfo struct that receives the decoded data.
* @return True if it succeeds, false if it fails. * @return True if it succeeds, false if it fails.
*/ */
bool decodeOpcode(ZyDisInstructionInfo &info); bool decodeOpcode(InstructionInfo& info);
public: public:
/** /**
* @brief Default constructor. * @brief Default constructor.
*/ */
ZyDisInstructionDecoder(); InstructionDecoder();
/** /**
* @brief Constructor. * @brief Constructor.
* @param input A reference to the input data source. * @param input A reference to the input data source.
@ -576,51 +578,51 @@ public:
* @param preferredVendor The preferred instruction-set vendor. * @param preferredVendor The preferred instruction-set vendor.
* @param instructionPointer The initial instruction pointer. * @param instructionPointer The initial instruction pointer.
*/ */
explicit ZyDisInstructionDecoder(ZyDisBaseDataSource *input, explicit InstructionDecoder(BaseInput* input,
ZyDisDisassemblerMode disassemblerMode = ZyDisDisassemblerMode::M32BIT, DisassemblerMode disassemblerMode = DisassemblerMode::M32BIT,
ZyDisInstructionSetVendor preferredVendor = ZyDisInstructionSetVendor::ANY, InstructionSetVendor preferredVendor = InstructionSetVendor::ANY,
uint64_t instructionPointer = 0); uint64_t instructionPointer = 0);
public: public:
/** /**
* @brief Decodes the next instruction from the input data source. * @brief Decodes the next instruction from the input data source.
* @param info The @c ZyDisInstructionInfo struct that receives the information about the * @param info The @c InstructionInfo struct that receives the information about the
* decoded instruction. * decoded instruction.
* @return This method returns false, if the current position has exceeded the maximum input * @return This method returns false, if the current position has exceeded the maximum input
* length. * length.
* In all other cases (valid and invalid instructions) the return value is true. * In all other cases (valid and invalid instructions) the return value is true.
*/ */
bool decodeInstruction(ZyDisInstructionInfo &info); bool decodeInstruction(InstructionInfo& info);
public: public:
/** /**
* @brief Returns a pointer to the current data source. * @brief Returns a pointer to the current data source.
* @return A pointer to the current data source. * @return A pointer to the current data source.
*/ */
ZyDisBaseDataSource* getDataSource() const; BaseInput* getDataSource() const;
/** /**
* @brief Sets a new data source. * @brief Sets a new data source.
* @param input A reference to the new input data source. * @param input A reference to the new input data source.
*/ */
void setDataSource(ZyDisBaseDataSource *input); void setDataSource(BaseInput* input);
/** /**
* @brief Returns the current disassembler mode. * @brief Returns the current disassembler mode.
* @return The current disassembler mode. * @return The current disassembler mode.
*/ */
ZyDisDisassemblerMode getDisassemblerMode() const; DisassemblerMode getDisassemblerMode() const;
/** /**
* @brief Sets the current disassembler mode. * @brief Sets the current disassembler mode.
* @param disassemblerMode The new disassembler mode. * @param disassemblerMode The new disassembler mode.
*/ */
void setDisassemblerMode(ZyDisDisassemblerMode disassemblerMode); void setDisassemblerMode(DisassemblerMode disassemblerMode);
/** /**
* @brief Returns the preferred instruction-set vendor. * @brief Returns the preferred instruction-set vendor.
* @return The preferred instruction-set vendor. * @return The preferred instruction-set vendor.
*/ */
ZyDisInstructionSetVendor getPreferredVendor() const; InstructionSetVendor getPreferredVendor() const;
/** /**
* @brief Sets the preferred instruction-set vendor. * @brief Sets the preferred instruction-set vendor.
* @param preferredVendor The new preferred instruction-set vendor. * @param preferredVendor The new preferred instruction-set vendor.
*/ */
void setPreferredVendor(ZyDisInstructionSetVendor preferredVendor); void setPreferredVendor(InstructionSetVendor preferredVendor);
/** /**
* @brief Returns the current instruction pointer. * @brief Returns the current instruction pointer.
* @return The current instruction pointer. * @return The current instruction pointer.
@ -633,86 +635,88 @@ public:
void setInstructionPointer(uint64_t instructionPointer); void setInstructionPointer(uint64_t instructionPointer);
}; };
inline uint8_t ZyDisInstructionDecoder::inputPeek(ZyDisInstructionInfo &info) inline uint8_t InstructionDecoder::inputPeek(InstructionInfo& info)
{ {
if (!m_dataSource) if (!m_input)
{ {
info.flags |= IF_ERROR_END_OF_INPUT; info.flags |= IF_ERROR_END_OF_INPUT;
return 0; return 0;
} }
return m_dataSource->inputPeek(info); return m_input->inputPeek(info);
} }
inline uint8_t ZyDisInstructionDecoder::inputNext(ZyDisInstructionInfo &info) inline uint8_t InstructionDecoder::inputNext(InstructionInfo& info)
{ {
if (!m_dataSource) if (!m_input)
{ {
info.flags |= IF_ERROR_END_OF_INPUT; info.flags |= IF_ERROR_END_OF_INPUT;
return 0; return 0;
} }
return m_dataSource->inputNext(info); return m_input->inputNext(info);
} }
template <typename T> template <typename T>
inline T ZyDisInstructionDecoder::inputNext(ZyDisInstructionInfo &info) inline T InstructionDecoder::inputNext(InstructionInfo& info)
{ {
if (!m_dataSource) if (!m_input)
{ {
info.flags |= IF_ERROR_END_OF_INPUT; info.flags |= IF_ERROR_END_OF_INPUT;
return 0; return 0;
} }
return m_dataSource->inputNext<T>(info); return m_input->inputNext<T>(info);
} }
inline uint8_t ZyDisInstructionDecoder::inputCurrent() const inline uint8_t InstructionDecoder::inputCurrent() const
{ {
if (!m_dataSource) if (!m_input)
{ {
return 0; return 0;
} }
return m_dataSource->inputCurrent(); return m_input->inputCurrent();
} }
inline ZyDisBaseDataSource* ZyDisInstructionDecoder::getDataSource() const inline BaseInput *InstructionDecoder::getDataSource() const
{ {
return m_dataSource; return m_input;
} }
inline void ZyDisInstructionDecoder::setDataSource(ZyDisBaseDataSource *input) inline void InstructionDecoder::setDataSource(BaseInput* input)
{ {
m_dataSource = input; m_input = input;
} }
inline ZyDisDisassemblerMode ZyDisInstructionDecoder::getDisassemblerMode() const inline DisassemblerMode InstructionDecoder::getDisassemblerMode() const
{ {
return m_disassemblerMode; return m_disassemblerMode;
} }
inline void ZyDisInstructionDecoder::setDisassemblerMode(ZyDisDisassemblerMode disassemblerMode) inline void InstructionDecoder::setDisassemblerMode(DisassemblerMode disassemblerMode)
{ {
m_disassemblerMode = disassemblerMode; m_disassemblerMode = disassemblerMode;
} }
inline ZyDisInstructionSetVendor ZyDisInstructionDecoder::getPreferredVendor() const inline InstructionSetVendor InstructionDecoder::getPreferredVendor() const
{ {
return m_preferredVendor; return m_preferredVendor;
} }
inline void ZyDisInstructionDecoder::setPreferredVendor(ZyDisInstructionSetVendor preferredVendor) inline void InstructionDecoder::setPreferredVendor(InstructionSetVendor preferredVendor)
{ {
m_preferredVendor = preferredVendor; m_preferredVendor = preferredVendor;
} }
inline uint64_t ZyDisInstructionDecoder::getInstructionPointer() const inline uint64_t InstructionDecoder::getInstructionPointer() const
{ {
return m_instructionPointer; return m_instructionPointer;
} }
inline void ZyDisInstructionDecoder::setInstructionPointer(uint64_t instructionPointer) inline void InstructionDecoder::setInstructionPointer(uint64_t instructionPointer)
{ {
m_instructionPointer = instructionPointer; m_instructionPointer = instructionPointer;
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* ============================================================================================== */
} }
#endif /* _ZYDIS_INSTRUCTIONDECODER_HPP_ */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 22. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,34 +26,20 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#include "ZyDisInstructionFormatter.hpp"
#include "ZyDisDisassemblerUtils.hpp" #include "ZydisInstructionFormatter.hpp"
#include "ZydisUtils.hpp"
#include <cstdarg> #include <cstdarg>
#include <cctype> #include <cctype>
#include <cstring>
#include <cstdio> #include <cstdio>
#include <string>
namespace Verteron namespace Zydis
{ {
/////////////////////////////////////////////////////////////////////////////////////////////////// /* BaseInstructionFormatter ================================================================ */
ZyDisBaseSymbolResolver::~ZyDisBaseSymbolResolver() const char *BaseInstructionFormatter::m_registerStrings[] =
{
}
const char* ZyDisBaseSymbolResolver::resolveSymbol(const ZyDisInstructionInfo &info, uint64_t address,
uint64_t &offset)
{
return nullptr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
const char* ZyDisBaseInstructionFormatter::m_registerStrings[] =
{ {
/* 8 bit general purpose registers */ /* 8 bit general purpose registers */
"al", "cl", "dl", "bl", "al", "cl", "dl", "bl",
@ -111,12 +95,12 @@ const char* ZyDisBaseInstructionFormatter::m_registerStrings[] =
"rip" "rip"
}; };
void ZyDisBaseInstructionFormatter::internalFormatInstruction(const ZyDisInstructionInfo &info) void BaseInstructionFormatter::internalFormatInstruction(const InstructionInfo& /*info*/)
{ {
// Nothing to do here // Nothing to do here
} }
ZyDisBaseInstructionFormatter::ZyDisBaseInstructionFormatter() BaseInstructionFormatter::BaseInstructionFormatter()
: m_symbolResolver(nullptr) : m_symbolResolver(nullptr)
, m_outputStringLen(0) , m_outputStringLen(0)
, m_outputUppercase(false) , m_outputUppercase(false)
@ -124,7 +108,8 @@ ZyDisBaseInstructionFormatter::ZyDisBaseInstructionFormatter()
} }
ZyDisBaseInstructionFormatter::ZyDisBaseInstructionFormatter(ZyDisBaseSymbolResolver *symbolResolver) BaseInstructionFormatter::BaseInstructionFormatter(
BaseSymbolResolver *symbolResolver)
: m_symbolResolver(symbolResolver) : m_symbolResolver(symbolResolver)
, m_outputStringLen(0) , m_outputStringLen(0)
, m_outputUppercase(false) , m_outputUppercase(false)
@ -132,7 +117,7 @@ ZyDisBaseInstructionFormatter::ZyDisBaseInstructionFormatter(ZyDisBaseSymbolReso
} }
const char* ZyDisBaseInstructionFormatter::formatInstruction(const ZyDisInstructionInfo &info) const char *BaseInstructionFormatter::formatInstruction(const InstructionInfo& info)
{ {
// Clears the internal string buffer // Clears the internal string buffer
outputClear(); outputClear();
@ -141,28 +126,28 @@ const char* ZyDisBaseInstructionFormatter::formatInstruction(const ZyDisInstruct
if (m_outputBuffer.size() == 0) if (m_outputBuffer.size() == 0)
{ {
// The basic instruction formatter only returns the instruction menmonic. // The basic instruction formatter only returns the instruction menmonic.
return Internal::VDEGetInstructionMnemonicString(info.mnemonic); return Internal::GetInstructionMnemonicString(info.mnemonic);
} }
// Return the formatted instruction string // Return the formatted instruction string
return outputString(); return outputString();
} }
ZyDisBaseInstructionFormatter::~ZyDisBaseInstructionFormatter() BaseInstructionFormatter::~BaseInstructionFormatter()
{ {
} }
void ZyDisBaseInstructionFormatter::outputClear() void BaseInstructionFormatter::outputClear()
{ {
m_outputStringLen = 0; m_outputStringLen = 0;
} }
char const* ZyDisBaseInstructionFormatter::outputString() char const *BaseInstructionFormatter::outputString()
{ {
return& m_outputBuffer[0]; return& m_outputBuffer[0];
} }
void ZyDisBaseInstructionFormatter::outputAppend(char const *text) void BaseInstructionFormatter::outputAppend(char const *text)
{ {
// Get the string length including the null-terminator char // Get the string length including the null-terminator char
size_t strLen = strlen(text) + 1; size_t strLen = strlen(text) + 1;
@ -191,7 +176,7 @@ char const* ZyDisBaseInstructionFormatter::outputString()
} }
} }
void ZyDisBaseInstructionFormatter::outputAppendFormatted(char const *format, ...) void BaseInstructionFormatter::outputAppendFormatted(char const *format, ...)
{ {
va_list arguments; va_list arguments;
va_start(arguments, format); va_start(arguments, format);
@ -218,7 +203,7 @@ char const* ZyDisBaseInstructionFormatter::outputString()
// Write the formatted text to the output buffer // Write the formatted text to the output buffer
assert((bufLen - offset) > 0); assert((bufLen - offset) > 0);
strLen = strLen =
std::vsnprintf(&m_outputBuffer[offset], bufLen - offset, format, arguments); vsnprintf_s(&m_outputBuffer[offset], bufLen - offset, _TRUNCATE, format, arguments);
} while (strLen < 0); } while (strLen < 0);
// Increase the string length // Increase the string length
m_outputStringLen = offset + strLen + 1; m_outputStringLen = offset + strLen + 1;
@ -233,7 +218,7 @@ char const* ZyDisBaseInstructionFormatter::outputString()
va_end(arguments); va_end(arguments);
} }
void ZyDisBaseInstructionFormatter::outputAppendAddress(const ZyDisInstructionInfo &info, void BaseInstructionFormatter::outputAppendAddress(const InstructionInfo& info,
uint64_t address, bool resolveSymbols) uint64_t address, bool resolveSymbols)
{ {
uint64_t offset = 0; uint64_t offset = 0;
@ -269,10 +254,10 @@ void ZyDisBaseInstructionFormatter::outputAppendAddress(const ZyDisInstructionIn
} }
} }
void ZyDisBaseInstructionFormatter::outputAppendImmediate(const ZyDisInstructionInfo &info, void BaseInstructionFormatter::outputAppendImmediate(const InstructionInfo& info,
const ZyDisOperandInfo &operand, bool resolveSymbols) const OperandInfo& operand, bool resolveSymbols)
{ {
assert(operand.type == ZyDisOperandType::IMMEDIATE); assert(operand.type == OperandType::IMMEDIATE);
uint64_t value = 0; uint64_t value = 0;
if (operand.signed_lval&& (operand.size != info.operand_mode)) if (operand.signed_lval&& (operand.size != info.operand_mode))
{ {
@ -329,11 +314,10 @@ void ZyDisBaseInstructionFormatter::outputAppendImmediate(const ZyDisInstruction
} }
} }
void ZyDisBaseInstructionFormatter::outputAppendDisplacement(const ZyDisInstructionInfo &info, void BaseInstructionFormatter::outputAppendDisplacement(const OperandInfo& operand)
const ZyDisOperandInfo &operand)
{ {
assert(operand.offset > 0); assert(operand.offset > 0);
if ((operand.base == ZyDisRegister::NONE) && (operand.index == ZyDisRegister::NONE)) if ((operand.base == Register::NONE)&& (operand.index == Register::NONE))
{ {
// Assume the displacement value is unsigned // Assume the displacement value is unsigned
assert(operand.scale == 0); assert(operand.scale == 0);
@ -378,16 +362,15 @@ void ZyDisBaseInstructionFormatter::outputAppendDisplacement(const ZyDisInstruct
outputAppendFormatted("-%.2lX", -value); outputAppendFormatted("-%.2lX", -value);
} else } else
{ {
outputAppendFormatted("%s%.2lX", (operand.base != ZyDisRegister::NONE || outputAppendFormatted("%s%.2lX", (operand.base != Register::NONE ||
operand.index != ZyDisRegister::NONE) ? "+" : "", value); operand.index != Register::NONE) ? "+" : "", value);
} }
} }
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* IntelInstructionFormatter =============================================================== */
void ZyDisIntelInstructionFormatter::outputAppendOperandCast(const ZyDisInstructionInfo &info, void IntelInstructionFormatter::outputAppendOperandCast(const OperandInfo& operand)
const ZyDisOperandInfo &operand)
{ {
switch(operand.size) switch(operand.size)
{ {
@ -417,33 +400,33 @@ void ZyDisIntelInstructionFormatter::outputAppendOperandCast(const ZyDisInstruct
} }
} }
void ZyDisIntelInstructionFormatter::formatOperand(const ZyDisInstructionInfo &info, void IntelInstructionFormatter::formatOperand(const InstructionInfo& info,
const ZyDisOperandInfo &operand) const OperandInfo& operand)
{ {
switch (operand.type) switch (operand.type)
{ {
case ZyDisOperandType::REGISTER: case OperandType::REGISTER:
outputAppend(registerToString(operand.base)); outputAppend(registerToString(operand.base));
break; break;
case ZyDisOperandType::MEMORY: case OperandType::MEMORY:
if (info.flags& IF_PREFIX_SEGMENT) if (info.flags& IF_PREFIX_SEGMENT)
{ {
outputAppendFormatted("%s:", registerToString(info.segment)); outputAppendFormatted("%s:", registerToString(info.segment));
} }
outputAppend("["); outputAppend("[");
if (operand.base == ZyDisRegister::RIP) if (operand.base == Register::RIP)
{ {
// TODO: Add option // TODO: Add option
outputAppendAddress(info, VDECalcAbsoluteTarget(info, operand), true); outputAppendAddress(info, CalcAbsoluteTarget(info, operand), true);
} else } else
{ {
if (operand.base != ZyDisRegister::NONE) if (operand.base != Register::NONE)
{ {
outputAppend(registerToString(operand.base)); outputAppend(registerToString(operand.base));
} }
if (operand.index != ZyDisRegister::NONE) if (operand.index != Register::NONE)
{ {
outputAppendFormatted("%s%s", operand.base != ZyDisRegister::NONE ? "+" : "", outputAppendFormatted("%s%s", operand.base != Register::NONE ? "+" : "",
registerToString(operand.index)); registerToString(operand.index));
if (operand.scale) if (operand.scale)
{ {
@ -452,12 +435,12 @@ void ZyDisIntelInstructionFormatter::formatOperand(const ZyDisInstructionInfo &i
} }
if (operand.offset) if (operand.offset)
{ {
outputAppendDisplacement(info, operand); outputAppendDisplacement(operand);
} }
} }
outputAppend("]"); outputAppend("]");
break; break;
case ZyDisOperandType::POINTER: case OperandType::POINTER:
// TODO: resolve symbols // TODO: resolve symbols
switch (operand.size) switch (operand.size)
{ {
@ -472,21 +455,21 @@ void ZyDisIntelInstructionFormatter::formatOperand(const ZyDisInstructionInfo &i
assert(0); assert(0);
} }
break; break;
case ZyDisOperandType::IMMEDIATE: case OperandType::IMMEDIATE:
{ {
outputAppendImmediate(info, operand, true); outputAppendImmediate(info, operand, true);
} }
break; break;
case ZyDisOperandType::REL_IMMEDIATE: case OperandType::REL_IMMEDIATE:
{ {
if (operand.size == 8) if (operand.size == 8)
{ {
outputAppend("short "); outputAppend("short ");
} }
outputAppendAddress(info, VDECalcAbsoluteTarget(info, operand), true); outputAppendAddress(info, CalcAbsoluteTarget(info, operand), true);
} }
break; break;
case ZyDisOperandType::CONSTANT: case OperandType::CONSTANT:
outputAppendFormatted("%.2X", operand.lval.udword); outputAppendFormatted("%.2X", operand.lval.udword);
break; break;
default: default:
@ -495,7 +478,7 @@ void ZyDisIntelInstructionFormatter::formatOperand(const ZyDisInstructionInfo &i
} }
} }
void ZyDisIntelInstructionFormatter::internalFormatInstruction(const ZyDisInstructionInfo &info) void IntelInstructionFormatter::internalFormatInstruction(const InstructionInfo& info)
{ {
// Append string prefixes // Append string prefixes
if (info.flags& IF_PREFIX_LOCK) if (info.flags& IF_PREFIX_LOCK)
@ -510,32 +493,32 @@ void ZyDisIntelInstructionFormatter::internalFormatInstruction(const ZyDisInstru
outputAppend("repne "); outputAppend("repne ");
} }
// Append the instruction mnemonic // Append the instruction mnemonic
outputAppend(Internal::VDEGetInstructionMnemonicString(info.mnemonic)); outputAppend(Internal::GetInstructionMnemonicString(info.mnemonic));
// Append the first operand // Append the first operand
if (info.operand[0].type != ZyDisOperandType::NONE) if (info.operand[0].type != OperandType::NONE)
{ {
outputAppend(" "); outputAppend(" ");
bool cast = false; bool cast = false;
if (info.operand[0].type == ZyDisOperandType::MEMORY) if (info.operand[0].type == OperandType::MEMORY)
{ {
if (info.operand[1].type == ZyDisOperandType::IMMEDIATE || if (info.operand[1].type == OperandType::IMMEDIATE ||
info.operand[1].type == ZyDisOperandType::CONSTANT || info.operand[1].type == OperandType::CONSTANT ||
info.operand[1].type == ZyDisOperandType::NONE || info.operand[1].type == OperandType::NONE ||
(info.operand[0].size != info.operand[1].size)) (info.operand[0].size != info.operand[1].size))
{ {
cast = true; cast = true;
} else if (info.operand[1].type == ZyDisOperandType::REGISTER && } else if (info.operand[1].type == OperandType::REGISTER&&
info.operand[1].base == ZyDisRegister::CL) info.operand[1].base == Register::CL)
{ {
switch (info.mnemonic) switch (info.mnemonic)
{ {
case ZyDisInstructionMnemonic::RCL: case InstructionMnemonic::RCL:
case ZyDisInstructionMnemonic::ROL: case InstructionMnemonic::ROL:
case ZyDisInstructionMnemonic::ROR: case InstructionMnemonic::ROR:
case ZyDisInstructionMnemonic::RCR: case InstructionMnemonic::RCR:
case ZyDisInstructionMnemonic::SHL: case InstructionMnemonic::SHL:
case ZyDisInstructionMnemonic::SHR: case InstructionMnemonic::SHR:
case ZyDisInstructionMnemonic::SAR: case InstructionMnemonic::SAR:
cast = true; cast = true;
break; break;
default: default:
@ -545,114 +528,75 @@ void ZyDisIntelInstructionFormatter::internalFormatInstruction(const ZyDisInstru
} }
if (cast) if (cast)
{ {
outputAppendOperandCast(info, info.operand[0]); outputAppendOperandCast(info.operand[0]);
} }
formatOperand(info, info.operand[0]); formatOperand(info, info.operand[0]);
} }
// Append the second operand // Append the second operand
if (info.operand[1].type != ZyDisOperandType::NONE) if (info.operand[1].type != OperandType::NONE)
{ {
outputAppend(", "); outputAppend(", ");
bool cast = false; bool cast = false;
if (info.operand[1].type == ZyDisOperandType::MEMORY && if (info.operand[1].type == OperandType::MEMORY&&
info.operand[0].size != info.operand[1].size&& info.operand[0].size != info.operand[1].size&&
((info.operand[0].type != ZyDisOperandType::REGISTER) || ((info.operand[0].type != OperandType::REGISTER) ||
((info.operand[0].base != ZyDisRegister::ES) && ((info.operand[0].base != Register::ES)&&
(info.operand[0].base != ZyDisRegister::CS) && (info.operand[0].base != Register::CS)&&
(info.operand[0].base != ZyDisRegister::SS) && (info.operand[0].base != Register::SS)&&
(info.operand[0].base != ZyDisRegister::DS) && (info.operand[0].base != Register::DS)&&
(info.operand[0].base != ZyDisRegister::FS) && (info.operand[0].base != Register::FS)&&
(info.operand[0].base != ZyDisRegister::GS)))) (info.operand[0].base != Register::GS))))
{ {
cast = true; cast = true;
} }
if (cast) if (cast)
{ {
outputAppendOperandCast(info, info.operand[1]); outputAppendOperandCast(info.operand[1]);
} }
formatOperand(info, info.operand[1]); formatOperand(info, info.operand[1]);
} }
// Append the third operand // Append the third operand
if (info.operand[2].type != ZyDisOperandType::NONE) if (info.operand[2].type != OperandType::NONE)
{ {
outputAppend(", "); outputAppend(", ");
bool cast = false; bool cast = false;
if (info.operand[2].type == ZyDisOperandType::MEMORY && if (info.operand[2].type == OperandType::MEMORY&&
(info.operand[2].size != info.operand[1].size)) (info.operand[2].size != info.operand[1].size))
{ {
cast = true; cast = true;
} }
if (cast) if (cast)
{ {
outputAppendOperandCast(info, info.operand[2]); outputAppendOperandCast(info.operand[2]);
} }
formatOperand(info, info.operand[2]); formatOperand(info, info.operand[2]);
} }
// Append the fourth operand // Append the fourth operand
if (info.operand[3].type != ZyDisOperandType::NONE) if (info.operand[3].type != OperandType::NONE)
{ {
outputAppend(", "); outputAppend(", ");
formatOperand(info, info.operand[3]); formatOperand(info, info.operand[3]);
} }
} }
ZyDisIntelInstructionFormatter::ZyDisIntelInstructionFormatter() IntelInstructionFormatter::IntelInstructionFormatter()
: ZyDisBaseInstructionFormatter() : BaseInstructionFormatter()
{ {
} }
ZyDisIntelInstructionFormatter::ZyDisIntelInstructionFormatter(ZyDisBaseSymbolResolver* symbolResolver) IntelInstructionFormatter::IntelInstructionFormatter(
: ZyDisBaseInstructionFormatter(symbolResolver) BaseSymbolResolver *symbolResolver)
: BaseInstructionFormatter(symbolResolver)
{ {
} }
ZyDisIntelInstructionFormatter::~ZyDisIntelInstructionFormatter() IntelInstructionFormatter::~IntelInstructionFormatter()
{ {
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* ============================================================================================== */
ZyDisExactSymbolResolver::~ZyDisExactSymbolResolver()
{
}
const char* ZyDisExactSymbolResolver::resolveSymbol(const ZyDisInstructionInfo &info, uint64_t address,
uint64_t &offset)
{
std::unordered_map<uint64_t, std::string>::const_iterator iterator = m_symbolMap.find(address);
if (iterator != m_symbolMap.cend())
{
offset = 0;
return iterator->second.c_str();
}
return nullptr;
}
bool ZyDisExactSymbolResolver::containsSymbol(uint64_t address) const
{
std::unordered_map<uint64_t, std::string>::const_iterator iterator = m_symbolMap.find(address);
return (iterator != m_symbolMap.end());
}
void ZyDisExactSymbolResolver::setSymbol(uint64_t address, const char* name)
{
m_symbolMap[address].assign(name);
}
void ZyDisExactSymbolResolver::removeSymbol(uint64_t address)
{
m_symbolMap.erase(address);
}
void ZyDisExactSymbolResolver::clear()
{
m_symbolMap.clear();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
} }

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 22. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,52 +26,28 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#pragma once
#ifndef _ZYDIS_INSTRUCTIONFORMATTER_HPP_
#define _ZYDIS_INSTRUCTIONFORMATTER_HPP_
#include <vector> #include <vector>
#include <unordered_map> #include "ZydisTypes.hpp"
#include <string> #include "ZydisSymbolResolver.hpp"
#include "ZyDisDisassemblerTypes.hpp"
namespace Verteron namespace Zydis
{ {
/////////////////////////////////////////////////////////////////////////////////////////////////// /* BaseInstructionFormatter ===================================================================== */
/**
* @brief Base class for all symbol resolver implementations.
*/
class ZyDisBaseSymbolResolver
{
public:
/**
* @brief Destructor.
*/
virtual ~ZyDisBaseSymbolResolver();
public:
/**
* @brief Resolves a symbol.
* @param info The instruction info.
* @param address The address.
* @param offset Reference to an unsigned 64 bit integer that receives an offset
* relative to the base address of the symbol.
* @return The name of the symbol, if the symbol was found, @c NULL if not.
*/
virtual const char* resolveSymbol(const ZyDisInstructionInfo &info, uint64_t address,
uint64_t &offset);
};
///////////////////////////////////////////////////////////////////////////////////////////////////
/** /**
* @brief Base class for all instruction formatter implementations. * @brief Base class for all instruction formatter implementations.
*/ */
class ZyDisBaseInstructionFormatter class BaseInstructionFormatter
{ {
private: private:
static const char* m_registerStrings[]; static const char* m_registerStrings[];
ZyDisBaseSymbolResolver *m_symbolResolver; BaseSymbolResolver* m_symbolResolver;
std::vector<char> m_outputBuffer; std::vector<char> m_outputBuffer;
size_t m_outputStringLen; size_t m_outputStringLen;
bool m_outputUppercase; bool m_outputUppercase;
@ -109,7 +83,7 @@ protected:
* @param resolveSymbols If this parameter is true, the method will try to display a * @param resolveSymbols If this parameter is true, the method will try to display a
* smybol name instead of the numeric value. * smybol name instead of the numeric value.
*/ */
void outputAppendAddress(const ZyDisInstructionInfo &info, uint64_t address, void outputAppendAddress(const InstructionInfo& info, uint64_t address,
bool resolveSymbols = true); bool resolveSymbols = true);
/** /**
* @brief Appends a formatted immediate value to the output string buffer. * @brief Appends a formatted immediate value to the output string buffer.
@ -118,21 +92,20 @@ protected:
* @param resolveSymbols If this parameter is true, the method will try to display a * @param resolveSymbols If this parameter is true, the method will try to display a
* smybol name instead of the numeric value. * smybol name instead of the numeric value.
*/ */
void outputAppendImmediate(const ZyDisInstructionInfo &info, const ZyDisOperandInfo &operand, void outputAppendImmediate(const InstructionInfo& info, const OperandInfo& operand,
bool resolveSymbols = false); bool resolveSymbols = false);
/** /**
* @brief Appends a formatted memory displacement value to the output string buffer. * @brief Appends a formatted memory displacement value to the output string buffer.
* @param info The instruction info.
* @param operand The memory operand. * @param operand The memory operand.
*/ */
void outputAppendDisplacement(const ZyDisInstructionInfo &info, const ZyDisOperandInfo &operand); void outputAppendDisplacement(const OperandInfo& operand);
protected: protected:
/** /**
* @brief Returns the string representation of a given register. * @brief Returns the string representation of a given register.
* @param reg The register. * @param reg The register.
* @return The string representation of the given register. * @return The string representation of the given register.
*/ */
const char* registerToString(ZyDisRegister reg) const; const char *registerToString(Register reg) const;
/** /**
* @brief Resolves a symbol. * @brief Resolves a symbol.
* @param info The instruction info. * @param info The instruction info.
@ -141,7 +114,7 @@ protected:
* relative to the base address of the symbol. * relative to the base address of the symbol.
* @return The name of the symbol, if the symbol was found, @c NULL if not. * @return The name of the symbol, if the symbol was found, @c NULL if not.
*/ */
const char* resolveSymbol(const ZyDisInstructionInfo &info, uint64_t address, const char* resolveSymbol(const InstructionInfo& info, uint64_t address,
uint64_t& offset) const; uint64_t& offset) const;
protected: protected:
/** /**
@ -150,58 +123,58 @@ protected:
* string buffer. * string buffer.
* @param info The instruction info. * @param info The instruction info.
*/ */
virtual void internalFormatInstruction(const ZyDisInstructionInfo &info); virtual void internalFormatInstruction(const InstructionInfo& info);
/** /**
* @brief Default constructor. * @brief Default constructor.
*/ */
ZyDisBaseInstructionFormatter(); BaseInstructionFormatter();
/** /**
* @brief Constructor. * @brief Constructor.
* @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol * @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol
* resolver should be used. * resolver should be used.
*/ */
explicit ZyDisBaseInstructionFormatter(ZyDisBaseSymbolResolver *symbolResolver); explicit BaseInstructionFormatter(BaseSymbolResolver* symbolResolver);
public: public:
/** /**
* @brief Destructor. * @brief Destructor.
*/ */
virtual ~ZyDisBaseInstructionFormatter(); virtual ~BaseInstructionFormatter();
public: public:
/** /**
* @brief Formats a decoded instruction. * @brief Formats a decoded instruction.
* @param info The instruction info. * @param info The instruction info.
* @return Pointer to the formatted instruction string. * @return Pointer to the formatted instruction string.
*/ */
const char* formatInstruction(const ZyDisInstructionInfo &info); const char *formatInstruction(const InstructionInfo& info);
public: public:
/** /**
* @brief Returns a pointer to the current symbol resolver. * @brief Returns a pointer to the current symbol resolver.
* @return Pointer to the current symbol resolver or @c NULL, if no symbol resolver is used. * @return Pointer to the current symbol resolver or @c NULL, if no symbol resolver is used.
*/ */
ZyDisBaseSymbolResolver* getSymbolResolver() const; BaseSymbolResolver* getSymbolResolver() const;
/** /**
* @brief Sets a new symbol resolver. * @brief Sets a new symbol resolver.
* @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol * @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol
* resolver should be used. * resolver should be used.
*/ */
void setSymbolResolver(ZyDisBaseSymbolResolver *symbolResolver); void setSymbolResolver(BaseSymbolResolver* symbolResolver);
}; };
inline void ZyDisBaseInstructionFormatter::outputSetUppercase(bool uppercase) inline void BaseInstructionFormatter::outputSetUppercase(bool uppercase)
{ {
m_outputUppercase = uppercase; m_outputUppercase = uppercase;
} }
inline char const* ZyDisBaseInstructionFormatter::registerToString(ZyDisRegister reg) const inline char const *BaseInstructionFormatter::registerToString(Register reg) const
{ {
if (reg == ZyDisRegister::NONE) if (reg == Register::NONE)
{ {
return "error"; return "error";
} }
return m_registerStrings[static_cast<uint16_t>(reg) - 1]; return m_registerStrings[static_cast<uint16_t>(reg) - 1];
} }
inline char const* ZyDisBaseInstructionFormatter::resolveSymbol(const ZyDisInstructionInfo &info, inline char const* BaseInstructionFormatter::resolveSymbol(const InstructionInfo& info,
uint64_t address, uint64_t& offset) const uint64_t address, uint64_t& offset) const
{ {
if (m_symbolResolver) if (m_symbolResolver)
@ -211,110 +184,62 @@ inline char const* ZyDisBaseInstructionFormatter::resolveSymbol(const ZyDisInstr
return nullptr; return nullptr;
} }
inline ZyDisBaseSymbolResolver* ZyDisBaseInstructionFormatter::getSymbolResolver() const inline BaseSymbolResolver* BaseInstructionFormatter::getSymbolResolver() const
{ {
return m_symbolResolver; return m_symbolResolver;
} }
inline void ZyDisBaseInstructionFormatter::setSymbolResolver(ZyDisBaseSymbolResolver *symbolResolver) inline void BaseInstructionFormatter::setSymbolResolver(
BaseSymbolResolver* symbolResolver)
{ {
m_symbolResolver = symbolResolver; m_symbolResolver = symbolResolver;
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// /* IntelInstructionFormatter ==================================================================== */
/** /**
* @brief Intel syntax instruction formatter. * @brief Intel syntax instruction formatter.
*/ */
class ZyDisIntelInstructionFormatter : public ZyDisBaseInstructionFormatter class IntelInstructionFormatter : public BaseInstructionFormatter
{ {
private: private:
/** /**
* @brief Appends an operand cast to the output string buffer. * @brief Appends an operand cast to the output string buffer.
* @param info The instruction info.
* @param operand The operand. * @param operand The operand.
*/ */
void outputAppendOperandCast(const ZyDisInstructionInfo &info, const ZyDisOperandInfo &operand); void outputAppendOperandCast(const OperandInfo& operand);
/** /**
* @brief Formats the specified operand and appends the resulting string to the output * @brief Formats the specified operand and appends the resulting string to the output
* buffer. * buffer.
* @param info The instruction info. * @param info The instruction info.
* @param operand The operand. * @param operand The operand.
*/ */
void formatOperand(const ZyDisInstructionInfo &info, const ZyDisOperandInfo &operand); void formatOperand(const InstructionInfo& info, const OperandInfo& operand);
protected: protected:
/** /**
* @brief Fills the internal string buffer with an intel style formatted instruction string. * @brief Fills the internal string buffer with an intel style formatted instruction string.
* @param info The instruction info. * @param info The instruction info.
*/ */
void internalFormatInstruction(const ZyDisInstructionInfo &info) override; void internalFormatInstruction(const InstructionInfo& info) override;
public: public:
/** /**
* @brief Default constructor. * @brief Default constructor.
*/ */
ZyDisIntelInstructionFormatter(); IntelInstructionFormatter();
/** /**
* @brief Constructor. * @brief Constructor.
* @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol * @param symbolResolver Pointer to a symbol resolver instance or @c NULL, if no smybol
* resolver should be used. * resolver should be used.
*/ */
explicit ZyDisIntelInstructionFormatter(ZyDisBaseSymbolResolver *symbolResolver); explicit IntelInstructionFormatter(BaseSymbolResolver* symbolResolver);
/** /**
* @brief Destructor. * @brief Destructor.
*/ */
~ZyDisIntelInstructionFormatter() override; ~IntelInstructionFormatter() override;
}; };
/////////////////////////////////////////////////////////////////////////////////////////////////// /* ============================================================================================== */
/**
* @brief Simple symbol resolver that only matches exact addresses.
*/
class ZyDisExactSymbolResolver : public ZyDisBaseSymbolResolver
{
private:
std::unordered_map<uint64_t, std::string> m_symbolMap;
public:
/**
* @brief Destructor.
*/
~ZyDisExactSymbolResolver() override;
public:
/**
* @brief Resolves a symbol.
* @param info The instruction info.
* @param address The address.
* @param offset Reference to an unsigned 64 bit integer that receives an offset
* relative to the base address of the symbol.
* @return The name of the symbol, if the symbol was found, @c NULL if not.
*/
const char* resolveSymbol(const ZyDisInstructionInfo &info, uint64_t address,
uint64_t &offset) override;
public:
/**
* @brief Query if the given address is a known symbol.
* @param address The address.
* @return True if the address is known, false if not.
*/
bool containsSymbol(uint64_t address) const;
/**
* @brief Adds or changes a symbol.
* @param address The address.
* @param name The symbol name.
*/
void setSymbol(uint64_t address, const char* name);
/**
* @brief Removes the symbol described by address. This will invalidate all char pointers
* to the specific symbol name.
* @param address The address.
*/
void removeSymbol(uint64_t address);
/**
* @brief Clears the symbol tree.
*/
void clear();
};
///////////////////////////////////////////////////////////////////////////////////////////////////
} }
#endif /* _ZYDIS_INSTRUCTIONFORMATTER_HPP_ */

9654
Zydis/ZydisOpcodeTable.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 29. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,19 +26,21 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#pragma once
#ifndef _ZYDIS_OPCODETABLE_HPP_
#define _ZYDIS_OPCODETABLE_HPP_
#include <stdint.h> #include <stdint.h>
#include <cassert> #include <cassert>
namespace Verteron namespace Zydis
{ {
/** /**
* @brief Values that represent an instruction mnemonic. * @brief Values that represent an instruction mnemonic.
*/ */
enum class ZyDisInstructionMnemonic : uint16_t enum class InstructionMnemonic : uint16_t
{ {
/* 000 */ INVALID, /* 000 */ INVALID,
/* 001 */ AAA, /* 001 */ AAA,
@ -922,8 +922,8 @@ enum class ZyDisInstructionMnemonic : uint16_t
/* 36D */ VUNPCKHPS, /* 36D */ VUNPCKHPS,
/* 36E */ VUNPCKLPD, /* 36E */ VUNPCKLPD,
/* 36F */ VUNPCKLPS, /* 36F */ VUNPCKLPS,
/* 370 */ ZyDisORPD, /* 370 */ VXORPD,
/* 371 */ ZyDisORPS, /* 371 */ VXORPS,
/* 372 */ VZEROALL, /* 372 */ VZEROALL,
/* 373 */ VZEROUPPER, /* 373 */ VZEROUPPER,
/* 374 */ WAIT, /* 374 */ WAIT,
@ -953,12 +953,12 @@ enum class ZyDisInstructionMnemonic : uint16_t
* @brief Defines an alias representing an opcode tree node. An opcode tree node is a 16 bit * @brief Defines an alias representing an opcode tree node. An opcode tree node is a 16 bit
* unsigned integer value with its first 4 bits reserved for the node type. * unsigned integer value with its first 4 bits reserved for the node type.
*/ */
typedef uint16_t ZyDisOpcodeTreeNode; typedef uint16_t OpcodeTreeNode;
/** /**
* @brief Values that represent the type of an opcode tree node. * @brief Values that represent the type of an opcode tree node.
*/ */
enum class ZyDisOpcodeTreeNodeType : uint8_t enum class OpcodeTreeNodeType : uint8_t
{ {
/** /**
* @brief Reference to a concrete instruction definition. * @brief Reference to a concrete instruction definition.
@ -1025,7 +1025,7 @@ enum class ZyDisOpcodeTreeNodeType : uint8_t
/** /**
* @brief Values that represent the type of an operand in the instruction definition. * @brief Values that represent the type of an operand in the instruction definition.
*/ */
enum class ZyDisDefinedOperandType : uint8_t enum class DefinedOperandType : uint8_t
{ {
/* /*
* @brief No operand. * @brief No operand.
@ -1286,7 +1286,7 @@ enum class ZyDisDefinedOperandType : uint8_t
* @brief Values that represent the size of an operand in the instruction definition. * @brief Values that represent the size of an operand in the instruction definition.
* Do not change the order or the values of this enum! * Do not change the order or the values of this enum!
*/ */
enum class ZyDisDefinedOperandSize : uint8_t enum class DefinedOperandSize : uint8_t
{ {
/** /**
* @brief No operand. * @brief No operand.
@ -1386,7 +1386,7 @@ enum class ZyDisDefinedOperandSize : uint8_t
* @brief Values that represent optional flags in the instruction definition. * @brief Values that represent optional flags in the instruction definition.
* Do not change the order or the values of this enum! * Do not change the order or the values of this enum!
*/ */
enum ZyDisInstructionDefinitionFlags : uint16_t enum InstructionDefinitionFlags : uint16_t
{ {
/** /**
* @brief The instruction accepts the rex.b prefix value. * @brief The instruction accepts the rex.b prefix value.
@ -1454,30 +1454,30 @@ enum ZyDisInstructionDefinitionFlags : uint16_t
/** /**
* @brief An operand definition. * @brief An operand definition.
*/ */
struct ZyDisOperandDefinition struct OperandDefinition
{ {
/** /**
* @brief The defined operand type. * @brief The defined operand type.
*/ */
ZyDisDefinedOperandType type; DefinedOperandType type;
/** /**
* @brief The defined operand size. * @brief The defined operand size.
*/ */
ZyDisDefinedOperandSize size; DefinedOperandSize size;
}; };
/** /**
* @brief An instruction definition. * @brief An instruction definition.
*/ */
struct ZyDisInstructionDefinition struct InstructionDefinition
{ {
/** /**
* @brief The instruction mnemonic. * @brief The instruction mnemonic.
*/ */
ZyDisInstructionMnemonic mnemonic; InstructionMnemonic mnemonic;
/** /**
* @brief The operand definitions for all four possible operands. * @brief The operand definitions for all four possible operands.
*/ */
ZyDisOperandDefinition operand[4]; OperandDefinition operand[4];
/** /**
* @brief Additional flags for the instruction definition. * @brief Additional flags for the instruction definition.
*/ */
@ -1492,24 +1492,24 @@ namespace Internal
* @brief Contains all opcode tables. * @brief Contains all opcode tables.
* Indexed by the numeric value of the opcode. * Indexed by the numeric value of the opcode.
*/ */
extern const ZyDisOpcodeTreeNode optreeTable[][256]; extern const OpcodeTreeNode optreeTable[][256];
/** /**
* @brief Contains all modrm_mod switch tables. * @brief Contains all modrm_mod switch tables.
* Index values: * Index values:
* 0 = [modrm_mod == !11] * 0 = [modrm_mod == !11]
* 1 = [modrm_mod == 11] * 1 = [modrm_mod == 11]
*/ */
extern const ZyDisOpcodeTreeNode optreeModrmMod[][2]; extern const OpcodeTreeNode optreeModrmMod[][2];
/** /**
* @brief Contains all modrm_reg switch tables. * @brief Contains all modrm_reg switch tables.
* Indexed by the numeric value of the modrm_reg field. * Indexed by the numeric value of the modrm_reg field.
*/ */
extern const ZyDisOpcodeTreeNode optreeModrmReg[][8]; extern const OpcodeTreeNode optreeModrmReg[][8];
/** /**
* @brief Contains all modrm_rm switch tables. * @brief Contains all modrm_rm switch tables.
* Indexed by the numeric value of the modrm_rm field. * Indexed by the numeric value of the modrm_rm field.
*/ */
extern const ZyDisOpcodeTreeNode optreeModrmRm[][8]; extern const OpcodeTreeNode optreeModrmRm[][8];
/** /**
* @brief Contains all mandatory-prefix switch tables. * @brief Contains all mandatory-prefix switch tables.
* Index values: * Index values:
@ -1518,13 +1518,13 @@ extern const ZyDisOpcodeTreeNode optreeModrmRm[][8];
* 2 = F3 * 2 = F3
* 3 = 66 * 3 = 66
*/ */
extern const ZyDisOpcodeTreeNode optreeMandatory[][4]; extern const OpcodeTreeNode optreeMandatory[][4];
/** /**
* @brief Contains all x87 opcode tables. * @brief Contains all x87 opcode tables.
* Indexed by the numeric value of the 6 lowest bits of the modrm byte (modrm_mod should * Indexed by the numeric value of the 6 lowest bits of the modrm byte (modrm_mod should
* always be 11). * always be 11).
*/ */
extern const ZyDisOpcodeTreeNode optreeX87[][64]; extern const OpcodeTreeNode optreeX87[][64];
/** /**
* @brief Contains all address-size switch tables. * @brief Contains all address-size switch tables.
* Index values: * Index values:
@ -1532,7 +1532,7 @@ extern const ZyDisOpcodeTreeNode optreeX87[][64];
* 1 = 32 * 1 = 32
* 2 = 64 * 2 = 64
*/ */
extern const ZyDisOpcodeTreeNode optreeAddressSize[][3]; extern const OpcodeTreeNode optreeAddressSize[][3];
/** /**
* @brief Contains all operand-size switch tables. * @brief Contains all operand-size switch tables.
* Index values: * Index values:
@ -1540,26 +1540,26 @@ extern const ZyDisOpcodeTreeNode optreeAddressSize[][3];
* 1 = 32 * 1 = 32
* 2 = 64 * 2 = 64
*/ */
extern const ZyDisOpcodeTreeNode optreeOperandSize[][3]; extern const OpcodeTreeNode optreeOperandSize[][3];
/** /**
* @brief Contains all cpu-mode switch tables. * @brief Contains all cpu-mode switch tables.
* Index values: * Index values:
* 0 = [!= 64] * 0 = [!= 64]
* 1 = 64 * 1 = 64
*/ */
extern const ZyDisOpcodeTreeNode optreeMode[][2]; extern const OpcodeTreeNode optreeMode[][2];
/** /**
* @brief Contains all vendor switch tables. * @brief Contains all vendor switch tables.
* Index values: * Index values:
* 0 = AMD * 0 = AMD
* 1 = Intel * 1 = Intel
*/ */
extern const ZyDisOpcodeTreeNode optreeVendor[][2]; extern const OpcodeTreeNode optreeVendor[][2];
/** /**
* @brief Contains all 3dnow! switch tables. * @brief Contains all 3dnow! switch tables.
* Indexed by the numeric value of the 3dnow! opcode. * Indexed by the numeric value of the 3dnow! opcode.
*/ */
extern const ZyDisOpcodeTreeNode optree3dnow[][256]; extern const OpcodeTreeNode optree3dnow[][256];
/** /**
* @brief Contains all vex switch tables. * @brief Contains all vex switch tables.
* Index values: * Index values:
@ -1580,21 +1580,21 @@ extern const ZyDisOpcodeTreeNode optree3dnow[][256];
* E = F2_0F38 * E = F2_0F38
* F = F2_0F3A * F = F2_0F3A
*/ */
extern const ZyDisOpcodeTreeNode optreeVex[][16]; extern const OpcodeTreeNode optreeVex[][16];
/** /**
* @brief Contains all vex_w switch tables. * @brief Contains all vex_w switch tables.
* Indexed by the numeric value of the vex_w field. * Indexed by the numeric value of the vex_w field.
*/ */
extern const ZyDisOpcodeTreeNode optreeVexW[][2]; extern const OpcodeTreeNode optreeVexW[][2];
/** /**
* @brief Contains all vex_l switch tables. * @brief Contains all vex_l switch tables.
* Indexed by the numeric value of the vex_l field. * Indexed by the numeric value of the vex_l field.
*/ */
extern const ZyDisOpcodeTreeNode optreeVexL[][2]; extern const OpcodeTreeNode optreeVexL[][2];
/** /**
* @brief Contains all instruction definitions. * @brief Contains all instruction definitions.
*/ */
extern const ZyDisInstructionDefinition instrDefinitions[]; extern const InstructionDefinition instrDefinitions[];
/** /**
* @brief Contains all instruction mnemonic strings. * @brief Contains all instruction mnemonic strings.
*/ */
@ -1605,9 +1605,9 @@ extern const char* instrMnemonicStrings[];
* @param node The node. * @param node The node.
* @return The type of the specified opcode tree node. * @return The type of the specified opcode tree node.
*/ */
inline ZyDisOpcodeTreeNodeType VDEGetOpcodeNodeType(ZyDisOpcodeTreeNode node) inline OpcodeTreeNodeType GetOpcodeNodeType(OpcodeTreeNode node)
{ {
return static_cast<ZyDisOpcodeTreeNodeType>((node >> 12) & 0x0F); return static_cast<OpcodeTreeNodeType>((node >> 12)& 0x0F);
} }
/** /**
@ -1615,7 +1615,7 @@ inline ZyDisOpcodeTreeNodeType VDEGetOpcodeNodeType(ZyDisOpcodeTreeNode node)
* @param node The node. * @param node The node.
* @return The value of the specified opcode tree node. * @return The value of the specified opcode tree node.
*/ */
inline uint16_t VDEGetOpcodeNodeValue(ZyDisOpcodeTreeNode node) inline uint16_t GetOpcodeNodeValue(OpcodeTreeNode node)
{ {
return (node& 0x0FFF); return (node& 0x0FFF);
} }
@ -1624,7 +1624,7 @@ inline uint16_t VDEGetOpcodeNodeValue(ZyDisOpcodeTreeNode node)
* @brief Returns the root node of the opcode tree. * @brief Returns the root node of the opcode tree.
* @return The root node of the opcode tree. * @return The root node of the opcode tree.
*/ */
inline ZyDisOpcodeTreeNode VDEGetOpcodeTreeRoot() inline OpcodeTreeNode GetOpcodeTreeRoot()
{ {
return 0x1000; return 0x1000;
} }
@ -1635,53 +1635,53 @@ inline ZyDisOpcodeTreeNode VDEGetOpcodeTreeRoot()
* @param index The index of the child node to retrieve. * @param index The index of the child node to retrieve.
* @return The specified child node. * @return The specified child node.
*/ */
inline ZyDisOpcodeTreeNode VDEGetOpcodeTreeChild(ZyDisOpcodeTreeNode parent, uint16_t index) inline OpcodeTreeNode GetOpcodeTreeChild(OpcodeTreeNode parent, uint16_t index)
{ {
using namespace Internal; using namespace Internal;
ZyDisOpcodeTreeNodeType nodeType = VDEGetOpcodeNodeType(parent); OpcodeTreeNodeType nodeType = GetOpcodeNodeType(parent);
uint16_t tableIndex = VDEGetOpcodeNodeValue(parent); uint16_t tableIndex = GetOpcodeNodeValue(parent);
switch (nodeType) switch (nodeType)
{ {
case ZyDisOpcodeTreeNodeType::TABLE: case OpcodeTreeNodeType::TABLE:
assert(index < 256); assert(index < 256);
return optreeTable[tableIndex][index]; return optreeTable[tableIndex][index];
case ZyDisOpcodeTreeNodeType::MODRM_MOD: case OpcodeTreeNodeType::MODRM_MOD:
assert(index < 2); assert(index < 2);
return optreeModrmMod[tableIndex][index]; return optreeModrmMod[tableIndex][index];
case ZyDisOpcodeTreeNodeType::MODRM_REG: case OpcodeTreeNodeType::MODRM_REG:
assert(index < 8); assert(index < 8);
return optreeModrmReg[tableIndex][index]; return optreeModrmReg[tableIndex][index];
case ZyDisOpcodeTreeNodeType::MODRM_RM: case OpcodeTreeNodeType::MODRM_RM:
assert(index < 8); assert(index < 8);
return optreeModrmRm[tableIndex][index]; return optreeModrmRm[tableIndex][index];
case ZyDisOpcodeTreeNodeType::MANDATORY: case OpcodeTreeNodeType::MANDATORY:
assert(index < 4); assert(index < 4);
return optreeMandatory[tableIndex][index]; return optreeMandatory[tableIndex][index];
case ZyDisOpcodeTreeNodeType::X87: case OpcodeTreeNodeType::X87:
assert(index < 64); assert(index < 64);
return optreeX87[tableIndex][index]; return optreeX87[tableIndex][index];
case ZyDisOpcodeTreeNodeType::ADDRESS_SIZE: case OpcodeTreeNodeType::ADDRESS_SIZE:
assert(index < 3); assert(index < 3);
return optreeAddressSize[tableIndex][index]; return optreeAddressSize[tableIndex][index];
case ZyDisOpcodeTreeNodeType::OPERAND_SIZE: case OpcodeTreeNodeType::OPERAND_SIZE:
assert(index < 3); assert(index < 3);
return optreeOperandSize[tableIndex][index]; return optreeOperandSize[tableIndex][index];
case ZyDisOpcodeTreeNodeType::MODE: case OpcodeTreeNodeType::MODE:
assert(index < 2); assert(index < 2);
return optreeMode[tableIndex][index]; return optreeMode[tableIndex][index];
case ZyDisOpcodeTreeNodeType::VENDOR: case OpcodeTreeNodeType::VENDOR:
assert(index < 3); assert(index < 3);
return optreeVendor[tableIndex][index]; return optreeVendor[tableIndex][index];
case ZyDisOpcodeTreeNodeType::AMD3DNOW: case OpcodeTreeNodeType::AMD3DNOW:
assert(index < 256); assert(index < 256);
return optree3dnow[tableIndex][index]; return optree3dnow[tableIndex][index];
case ZyDisOpcodeTreeNodeType::VEX: case OpcodeTreeNodeType::VEX:
assert(index < 16); assert(index < 16);
return optreeVex[tableIndex][index]; return optreeVex[tableIndex][index];
case ZyDisOpcodeTreeNodeType::VEXW: case OpcodeTreeNodeType::VEXW:
assert(index < 2); assert(index < 2);
return optreeVexW[tableIndex][index]; return optreeVexW[tableIndex][index];
case ZyDisOpcodeTreeNodeType::VEXL: case OpcodeTreeNodeType::VEXL:
assert(index < 2); assert(index < 2);
return optreeVexL[tableIndex][index]; return optreeVexL[tableIndex][index];
default: default:
@ -1695,9 +1695,9 @@ inline ZyDisOpcodeTreeNode VDEGetOpcodeTreeChild(ZyDisOpcodeTreeNode parent, uin
* @param node The instruction definition node. * @param node The instruction definition node.
* @return Pointer to the instruction definition. * @return Pointer to the instruction definition.
*/ */
inline const ZyDisInstructionDefinition* VDEGetInstructionDefinition(ZyDisOpcodeTreeNode node) inline const InstructionDefinition* GetInstructionDefinition(OpcodeTreeNode node)
{ {
assert(VDEGetOpcodeNodeType(node) == ZyDisOpcodeTreeNodeType::INSTRUCTION_DEFINITION); assert(GetOpcodeNodeType(node) == OpcodeTreeNodeType::INSTRUCTION_DEFINITION);
return& instrDefinitions[node& 0x0FFF]; return& instrDefinitions[node& 0x0FFF];
} }
@ -1706,7 +1706,7 @@ inline const ZyDisInstructionDefinition* VDEGetInstructionDefinition(ZyDisOpcode
* @param mnemonic The mnemonic. * @param mnemonic The mnemonic.
* @return The instruction mnemonic string. * @return The instruction mnemonic string.
*/ */
inline const char* VDEGetInstructionMnemonicString(ZyDisInstructionMnemonic mnemonic) inline const char* GetInstructionMnemonicString(InstructionMnemonic mnemonic)
{ {
return instrMnemonicStrings[static_cast<uint16_t>(mnemonic)]; return instrMnemonicStrings[static_cast<uint16_t>(mnemonic)];
} }
@ -1716,14 +1716,14 @@ inline const char* VDEGetInstructionMnemonicString(ZyDisInstructionMnemonic mnem
* @param operandSize The defined operand size. * @param operandSize The defined operand size.
* @return The the numeric value for the simple operand size definition. * @return The the numeric value for the simple operand size definition.
*/ */
inline uint16_t VDEGetSimpleOperandSize(ZyDisDefinedOperandSize operandSize) inline uint16_t GetSimpleOperandSize(DefinedOperandSize operandSize)
{ {
static uint16_t operandSizes[8] = static uint16_t operandSizes[8] =
{ {
8, 16, 32, 64, 80, 12, 128, 256 8, 16, 32, 64, 80, 12, 128, 256
}; };
uint16_t index = uint16_t index =
static_cast<uint8_t>(operandSize) - static_cast<uint8_t>(ZyDisDefinedOperandSize::B); static_cast<uint8_t>(operandSize) - static_cast<uint8_t>(DefinedOperandSize::B);
assert(index < 8); assert(index < 8);
return operandSizes[index]; return operandSizes[index];
} }
@ -1733,9 +1733,9 @@ inline uint16_t VDEGetSimpleOperandSize(ZyDisDefinedOperandSize operandSize)
* @param operandSize The defined operand size. * @param operandSize The defined operand size.
* @return The memory-size part of the operand size definition. * @return The memory-size part of the operand size definition.
*/ */
inline ZyDisDefinedOperandSize VDEGetComplexOperandMemSize(ZyDisDefinedOperandSize operandSize) inline DefinedOperandSize GetComplexOperandMemSize(DefinedOperandSize operandSize)
{ {
return static_cast<ZyDisDefinedOperandSize>(static_cast<uint8_t>(operandSize) & 0x0F); return static_cast<DefinedOperandSize>(static_cast<uint8_t>(operandSize)& 0x0F);
} }
/** /**
@ -1743,11 +1743,13 @@ inline ZyDisDefinedOperandSize VDEGetComplexOperandMemSize(ZyDisDefinedOperandSi
* @param operandSize The defined operand size. * @param operandSize The defined operand size.
* @return The register-size part of the operand size definition. * @return The register-size part of the operand size definition.
*/ */
inline ZyDisDefinedOperandSize VDEGetComplexOperandRegSize(ZyDisDefinedOperandSize operandSize) inline DefinedOperandSize GetComplexOperandRegSize(DefinedOperandSize operandSize)
{ {
return static_cast<ZyDisDefinedOperandSize>((static_cast<uint8_t>(operandSize) >> 4) & 0x0F); return static_cast<DefinedOperandSize>((static_cast<uint8_t>(operandSize) >> 4)& 0x0F);
} }
} }
} }
#endif /* _ZYDIS_OPCODETABLE_HPP_ */

View File

@ -0,0 +1,91 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#include "ZydisSymbolResolver.hpp"
namespace Zydis
{
/* BaseSymbolResolver ====================================================================== */
BaseSymbolResolver::~BaseSymbolResolver()
{
}
const char *BaseSymbolResolver::resolveSymbol(const InstructionInfo& info,
uint64_t address, uint64_t& offset)
{
return nullptr;
}
/* ExactSymbolResolver ===================================================================== */
ExactSymbolResolver::~ExactSymbolResolver()
{
}
const char *ExactSymbolResolver::resolveSymbol(const InstructionInfo& info,
uint64_t address, uint64_t& offset)
{
std::unordered_map<uint64_t, std::string>::const_iterator iterator = m_symbolMap.find(address);
if (iterator != m_symbolMap.cend())
{
offset = 0;
return iterator->second.c_str();
}
return nullptr;
}
bool ExactSymbolResolver::containsSymbol(uint64_t address) const
{
std::unordered_map<uint64_t, std::string>::const_iterator iterator = m_symbolMap.find(address);
return (iterator != m_symbolMap.end());
}
void ExactSymbolResolver::setSymbol(uint64_t address, const char *name)
{
m_symbolMap[address].assign(name);
}
void ExactSymbolResolver::removeSymbol(uint64_t address)
{
m_symbolMap.erase(address);
}
void ExactSymbolResolver::clear()
{
m_symbolMap.clear();
}
/* ============================================================================================== */
}

View File

@ -0,0 +1,119 @@
/***************************************************************************************************
Zyan Disassembler Engine
Version 1.0
Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd
Modifications : Joel Höner
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
***************************************************************************************************/
#ifndef _ZYDIS_SYMBOLRESOLVER_HPP_
#define _ZYDIS_SYMBOLRESOLVER_HPP_
#include <unordered_map>
#include "ZydisTypes.hpp"
namespace Zydis
{
/* BaseSymbolResolver =========================================================================== */
/**
* @brief Base class for all symbol resolver implementations.
*/
class BaseSymbolResolver
{
public:
/**
* @brief Destructor.
*/
virtual ~BaseSymbolResolver();
public:
/**
* @brief Resolves a symbol.
* @param info The instruction info.
* @param address The address.
* @param offset Reference to an unsigned 64 bit integer that receives an offset
* relative to the base address of the symbol.
* @return The name of the symbol, if the symbol was found, @c NULL if not.
*/
virtual const char *resolveSymbol(const InstructionInfo& info, uint64_t address,
uint64_t& offset);
};
/* ExactSymbolResolver ========================================================================== */
/**
* @brief Simple symbol resolver that only matches exact addresses.
*/
class ExactSymbolResolver : public BaseSymbolResolver
{
private:
std::unordered_map<uint64_t, std::string> m_symbolMap;
public:
/**
* @brief Destructor.
*/
~ExactSymbolResolver() override;
public:
/**
* @brief Resolves a symbol.
* @param info The instruction info.
* @param address The address.
* @param offset Reference to an unsigned 64 bit integer that receives an offset
* relative to the base address of the symbol.
* @return The name of the symbol, if the symbol was found, @c NULL if not.
*/
const char* resolveSymbol(const InstructionInfo& info, uint64_t address,
uint64_t& offset) override;
public:
/**
* @brief Query if the given address is a known symbol.
* @param address The address.
* @return True if the address is known, false if not.
*/
bool containsSymbol(uint64_t address) const;
/**
* @brief Adds or changes a symbol.
* @param address The address.
* @param name The symbol name.
*/
void setSymbol(uint64_t address, const char *name);
/**
* @brief Removes the symbol described by address. This will invalidate all char pointers
* to the specific symbol name.
* @param address The address.
*/
void removeSymbol(uint64_t address);
/**
* @brief Clears the symbol tree.
*/
void clear();
};
/* ============================================================================================== */
}
#endif /* _ZYDIS_SYMBOLRESOLVER_HPP_ */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 22. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,15 +26,19 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#pragma once
#ifndef _ZYDIS_TYPES_HPP_
#define _ZYDIS_TYPES_HPP_
#include <stdint.h> #include <stdint.h>
#include "ZyDisOpcodeTable.hpp" #include "ZydisOpcodeTable.hpp"
namespace Verteron namespace Zydis
{ {
/* InstructionFlags ============================================================================= */
/** /**
* @brief Values that represent additional flags of a decoded instruction. * @brief Values that represent additional flags of a decoded instruction.
*/ */
@ -125,10 +127,12 @@ enum InstructionFlags : uint32_t
IF_ERROR_OPERAND = 0x01000000 IF_ERROR_OPERAND = 0x01000000
}; };
/* Register ===================================================================================== */
/** /**
* @brief Values that represent a cpu register. * @brief Values that represent a cpu register.
*/ */
enum class ZyDisRegister : uint16_t enum class Register : uint16_t
{ {
NONE, NONE,
/* 8 bit general purpose registers */ /* 8 bit general purpose registers */
@ -185,10 +189,12 @@ enum class ZyDisRegister : uint16_t
RIP RIP
}; };
/* OperandType ================================================================================== */
/** /**
* @brief Values that represent the type of a decoded operand. * @brief Values that represent the type of a decoded operand.
*/ */
enum class ZyDisOperandType : uint8_t enum class OperandType : uint8_t
{ {
/** /**
* @brief The operand is not used. * @brief The operand is not used.
@ -220,10 +226,12 @@ enum class ZyDisOperandType : uint8_t
CONSTANT CONSTANT
}; };
/* ZydisOperandAccessMode ============================================================================ */
/** /**
* @brief Values that represent the operand access mode. * @brief Values that represent the operand access mode.
*/ */
enum class ZyDisOperandAccessMode : uint8_t enum class OperandAccessMode : uint8_t
{ {
NA, NA,
/** /**
@ -240,15 +248,17 @@ enum class ZyDisOperandAccessMode : uint8_t
READWRITE READWRITE
}; };
/* OperandInfo ================================================================================== */
/** /**
* @brief This struct holds information about a decoded operand. * @brief This struct holds information about a decoded operand.
*/ */
struct ZyDisOperandInfo struct OperandInfo
{ {
/** /**
* @brief The type of the operand. * @brief The type of the operand.
*/ */
ZyDisOperandType type; OperandType type;
/** /**
* @brief The size of the operand. * @brief The size of the operand.
*/ */
@ -256,15 +266,15 @@ struct ZyDisOperandInfo
/** /**
* @brief The operand access mode. * @brief The operand access mode.
*/ */
ZyDisOperandAccessMode access_mode; OperandAccessMode access_mode;
/** /**
* @brief The base register. * @brief The base register.
*/ */
ZyDisRegister base; Register base;
/** /**
* @brief The index register. * @brief The index register.
*/ */
ZyDisRegister index; Register index;
/** /**
* @brief The scale factor. * @brief The scale factor.
*/ */
@ -297,10 +307,12 @@ struct ZyDisOperandInfo
} lval; } lval;
}; };
/* InstructionInfo ============================================================================== */
/** /**
* @brief This struct holds information about a decoded instruction. * @brief This struct holds information about a decoded instruction.
*/ */
struct ZyDisInstructionInfo struct InstructionInfo
{ {
/** /**
* @brief The instruction flags. * @brief The instruction flags.
@ -309,7 +321,7 @@ struct ZyDisInstructionInfo
/** /**
* @brief The instruction mnemonic. * @brief The instruction mnemonic.
*/ */
ZyDisInstructionMnemonic mnemonic; InstructionMnemonic mnemonic;
/** /**
* @brief The total length of the instruction. * @brief The total length of the instruction.
*/ */
@ -337,12 +349,12 @@ struct ZyDisInstructionInfo
/** /**
* @brief The decoded operands. * @brief The decoded operands.
*/ */
ZyDisOperandInfo operand[4]; OperandInfo operand[4];
/** /**
* @brief The segment register. This value will default to @c NONE, if no segment register * @brief The segment register. This value will default to @c NONE, if no segment register
* prefix is present. * prefix is present.
*/ */
ZyDisRegister segment; Register segment;
/** /**
* @brief The rex prefix byte. * @brief The rex prefix byte.
*/ */
@ -512,7 +524,7 @@ struct ZyDisInstructionInfo
/** /**
* @brief The instruction definition. * @brief The instruction definition.
*/ */
const ZyDisInstructionDefinition *instrDefinition; const InstructionDefinition* instrDefinition;
/** /**
* @brief The instruction address points to the current instruction (relative to the * @brief The instruction address points to the current instruction (relative to the
* initial instruction pointer). * initial instruction pointer).
@ -527,3 +539,5 @@ struct ZyDisInstructionInfo
}; };
} }
#endif /* _ZYDIS_TYPES_HPP_ */

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 30. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,17 +26,18 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#include "ZyDisDisassemblerUtils.hpp"
#include "ZydisUtils.hpp"
#include <cassert> #include <cassert>
namespace Verteron namespace Zydis
{ {
uint64_t VDECalcAbsoluteTarget(const ZyDisInstructionInfo &info, const ZyDisOperandInfo &operand) uint64_t CalcAbsoluteTarget(const InstructionInfo& info, const OperandInfo& operand)
{ {
assert((operand.type == ZyDisOperandType::REL_IMMEDIATE) || assert((operand.type == OperandType::REL_IMMEDIATE) ||
((operand.type == ZyDisOperandType::MEMORY) && (operand.base == ZyDisRegister::RIP))); ((operand.type == OperandType::MEMORY)&& (operand.base == Register::RIP)));
uint64_t truncMask = 0xFFFFFFFFFFFFFFFFull; uint64_t truncMask = 0xFFFFFFFFFFFFFFFFull;
if (!(info.flags& IF_DISASSEMBLER_MODE_64)) if (!(info.flags& IF_DISASSEMBLER_MODE_64))
@ -46,7 +45,7 @@ uint64_t VDECalcAbsoluteTarget(const ZyDisInstructionInfo &info, const ZyDisOper
truncMask >>= (64 - info.operand_mode); truncMask >>= (64 - info.operand_mode);
} }
uint16_t size = operand.size; uint16_t size = operand.size;
if ((operand.type == ZyDisOperandType::MEMORY) && (operand.base == ZyDisRegister::RIP)) if ((operand.type == OperandType::MEMORY)&& (operand.base == Register::RIP))
{ {
size = operand.offset; size = operand.offset;
} }

View File

@ -1,14 +1,12 @@
/************************************************************************************************** /***************************************************************************************************
Verteron Disassembler Engine Zyan Disassembler Engine
Version 1.0 Version 1.0
Remarks : Freeware, Copyright must be included Remarks : Freeware, Copyright must be included
Original Author : Florian Bernd Original Author : Florian Bernd
Modifications : Modifications : Joel Höner
Last change : 30. October 2014
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,13 +26,15 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
**************************************************************************************************/ ***************************************************************************************************/
#pragma once
#ifndef _ZYDIS_UTILS_HPP_
#define _ZYDIS_UTILS_HPP_
#include <stdint.h> #include <stdint.h>
#include "ZyDisDisassemblerTypes.hpp" #include "ZydisTypes.hpp"
namespace Verteron namespace Zydis
{ {
/** /**
@ -43,6 +43,8 @@ namespace Verteron
* @param operand The operand. * @param operand The operand.
* @return The absolute target address. * @return The absolute target address.
*/ */
uint64_t VDECalcAbsoluteTarget(const ZyDisInstructionInfo &info, const ZyDisOperandInfo &operand); uint64_t CalcAbsoluteTarget(const InstructionInfo& info, const OperandInfo& operand);
} }
#endif /* _ZYDIS_UTILS_HPP_ */