mirror of https://github.com/x64dbg/zydis
Move encoder to `feature/encoder` branch
- Won’t be ready until v2.1
This commit is contained in:
parent
c5e418f34f
commit
c77c9f2561
|
@ -12,9 +12,9 @@ project(Zydis VERSION 2.0)
|
||||||
option(ZYDIS_FEATURE_DECODER
|
option(ZYDIS_FEATURE_DECODER
|
||||||
"Enable instruction decoding and formtting functionality"
|
"Enable instruction decoding and formtting functionality"
|
||||||
ON)
|
ON)
|
||||||
option(ZYDIS_FEATURE_ENCODER
|
#option(ZYDIS_FEATURE_ENCODER
|
||||||
"Enable instruction encoding functionality"
|
# "Enable instruction encoding functionality"
|
||||||
OFF)
|
# OFF)
|
||||||
option(ZYDIS_FEATURE_EVEX
|
option(ZYDIS_FEATURE_EVEX
|
||||||
"Enable support for EVEX instructions"
|
"Enable support for EVEX instructions"
|
||||||
ON)
|
ON)
|
||||||
|
@ -95,9 +95,9 @@ endif ()
|
||||||
if (ZYDIS_FEATURE_DECODER)
|
if (ZYDIS_FEATURE_DECODER)
|
||||||
target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_DECODER")
|
target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_DECODER")
|
||||||
endif ()
|
endif ()
|
||||||
if (ZYDIS_FEATURE_ENCODER)
|
#if (ZYDIS_FEATURE_ENCODER)
|
||||||
target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_ENCODER")
|
# target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_ENCODER")
|
||||||
endif ()
|
#endif ()
|
||||||
|
|
||||||
target_sources("Zydis"
|
target_sources("Zydis"
|
||||||
PUBLIC
|
PUBLIC
|
||||||
|
@ -134,15 +134,15 @@ if (ZYDIS_FEATURE_DECODER)
|
||||||
"src/FormatHelper.c")
|
"src/FormatHelper.c")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (ZYDIS_FEATURE_ENCODER)
|
#if (ZYDIS_FEATURE_ENCODER)
|
||||||
target_sources("Zydis"
|
# target_sources("Zydis"
|
||||||
PUBLIC
|
# PUBLIC
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/include/Zydis/Encoder.h"
|
# "${CMAKE_CURRENT_LIST_DIR}/include/Zydis/Encoder.h"
|
||||||
PRIVATE
|
# PRIVATE
|
||||||
"src/EncoderData.h"
|
# "src/EncoderData.h"
|
||||||
"src/Encoder.c"
|
# "src/Encoder.c"
|
||||||
"src/EncoderData.c")
|
# "src/EncoderData.c")
|
||||||
endif ()
|
#endif ()
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS AND WIN32)
|
if (BUILD_SHARED_LIBS AND WIN32)
|
||||||
target_sources("Zydis" PRIVATE "src/VersionInfo.rc")
|
target_sources("Zydis" PRIVATE "src/VersionInfo.rc")
|
||||||
|
|
|
@ -1,146 +0,0 @@
|
||||||
/***************************************************************************************************
|
|
||||||
|
|
||||||
Zyan Disassembler Library (Zydis)
|
|
||||||
|
|
||||||
Original Author : 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.
|
|
||||||
|
|
||||||
***************************************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* @brief Functions for (re-)encoding instructions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ZYDIS_ENCODER_H
|
|
||||||
#define ZYDIS_ENCODER_H
|
|
||||||
|
|
||||||
#include <Zydis/Defines.h>
|
|
||||||
#include <Zydis/Status.h>
|
|
||||||
#include <Zydis/Register.h>
|
|
||||||
#include <Zydis/Mnemonic.h>
|
|
||||||
#include <Zydis/SharedTypes.h>
|
|
||||||
#ifdef ZYDIS_ENABLE_FEATURE_DECODER
|
|
||||||
# include <Zydis/DecoderTypes.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Constants */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Defines a mask of attributes users may excplicitly ask for.
|
|
||||||
*/
|
|
||||||
#define ZYDIS_USER_ENCODABLE_ATTRIB_MASK ( \
|
|
||||||
ZYDIS_ATTRIB_HAS_LOCK | \
|
|
||||||
ZYDIS_ATTRIB_HAS_REP | \
|
|
||||||
ZYDIS_ATTRIB_HAS_REPE | \
|
|
||||||
ZYDIS_ATTRIB_HAS_REPNE | \
|
|
||||||
ZYDIS_ATTRIB_HAS_BOUND | \
|
|
||||||
ZYDIS_ATTRIB_HAS_XACQUIRE | \
|
|
||||||
ZYDIS_ATTRIB_HAS_XRELEASE | \
|
|
||||||
ZYDIS_ATTRIB_HAS_BRANCH_TAKEN | \
|
|
||||||
ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN \
|
|
||||||
)
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Structs */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
#define ZYDIS_ENCODER_MAX_OPERANDS (5)
|
|
||||||
|
|
||||||
typedef struct ZydisEncoderOperand_
|
|
||||||
{
|
|
||||||
ZydisOperandType type;
|
|
||||||
ZydisRegister reg;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
ZydisRegister segment;
|
|
||||||
ZydisRegister base;
|
|
||||||
ZydisRegister index;
|
|
||||||
uint8_t scale;
|
|
||||||
uint8_t dispSize;
|
|
||||||
int64_t disp;
|
|
||||||
} mem;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint16_t segment;
|
|
||||||
uint32_t offset;
|
|
||||||
} ptr;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
uint64_t u;
|
|
||||||
int64_t s;
|
|
||||||
} imm;
|
|
||||||
} ZydisEncoderOperand;
|
|
||||||
|
|
||||||
typedef struct ZydisEncoderRequest_
|
|
||||||
{
|
|
||||||
ZydisMachineMode machineMode;
|
|
||||||
ZydisMnemonic mnemonic;
|
|
||||||
ZydisInstructionAttributes attributes;
|
|
||||||
ZydisInstructionEncoding encoding;
|
|
||||||
uint8_t operandCount;
|
|
||||||
ZydisEncoderOperand operands[ZYDIS_ENCODER_MAX_OPERANDS];
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
ZydisVectorLength vectorLength;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
ZydisMaskMode mode;
|
|
||||||
ZydisRegister reg;
|
|
||||||
} mask;
|
|
||||||
} avx;
|
|
||||||
// TODO: mvex stuff
|
|
||||||
} ZydisEncoderRequest;
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Exported functions */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
#ifdef ZYDIS_ENABLE_FEATURE_DECODER
|
|
||||||
ZYDIS_EXPORT ZydisStatus ZydisEncoderDecodedInstructionToRequest(
|
|
||||||
const ZydisDecodedInstruction* in, ZydisEncoderRequest* out);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Encodes the given instruction request to byte-code.
|
|
||||||
*
|
|
||||||
* @param buffer A pointer to the output buffer.
|
|
||||||
* @param bufferLen The length of the output buffer.
|
|
||||||
* @param request A pointer to the @c ZydisEncoderRequest encode.
|
|
||||||
*
|
|
||||||
* @return A zydis status code.
|
|
||||||
*/
|
|
||||||
ZYDIS_EXPORT ZydisStatus ZydisEncoderEncodeInstruction(void* buffer, size_t* bufferLen,
|
|
||||||
const ZydisEncoderRequest* request);
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ZYDIS_ENCODER_H */
|
|
1482
src/Encoder.c
1482
src/Encoder.c
File diff suppressed because it is too large
Load Diff
|
@ -1,117 +0,0 @@
|
||||||
/***************************************************************************************************
|
|
||||||
|
|
||||||
Zyan Disassembler Library (Zydis)
|
|
||||||
|
|
||||||
Original Author : Florian Bernd
|
|
||||||
|
|
||||||
* 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 <EncoderData.h>
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Enums and types */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
// MSVC does not like types other than (un-)signed int for bitfields
|
|
||||||
#ifdef ZYDIS_MSVC
|
|
||||||
# pragma warning(push)
|
|
||||||
# pragma warning(disable:4214)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Encodable instructions */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Defines the @c ZydisEncodableInstructions struct.
|
|
||||||
*/
|
|
||||||
typedef struct ZydisEncodableInstructions_
|
|
||||||
{
|
|
||||||
uint8_t count;
|
|
||||||
uint16_t reference;
|
|
||||||
} ZydisEncodableInstructions;
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
#ifdef ZYDIS_MSVC
|
|
||||||
# pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Data tables */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Forward declarations */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Contains an item with a reference to all encodable instructions for every mnemonic.
|
|
||||||
*/
|
|
||||||
extern const ZydisEncodableInstructions mnemonicLookup[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Contains the definition-data for all encodable instructions.
|
|
||||||
*/
|
|
||||||
extern const ZydisEncodableInstruction encodableInstructions[];
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Mnemonic lookup table */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include <Generated/EncoderLookup.inc>
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Encodable instructions */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include <Generated/EncodableInstructions.inc>
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Functions */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Encodable instructions */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
uint8_t ZydisGetEncodableInstructions(ZydisMnemonic mnemonic,
|
|
||||||
const ZydisEncodableInstruction** instruction)
|
|
||||||
{
|
|
||||||
if (mnemonic >= ZYDIS_ARRAY_SIZE(mnemonicLookup))
|
|
||||||
{
|
|
||||||
*instruction = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
const ZydisEncodableInstructions* descriptor = &mnemonicLookup[mnemonic];
|
|
||||||
*instruction = &encodableInstructions[descriptor->reference];
|
|
||||||
return descriptor->count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
|
@ -1,115 +0,0 @@
|
||||||
/***************************************************************************************************
|
|
||||||
|
|
||||||
Zyan Disassembler Library (Zydis)
|
|
||||||
|
|
||||||
Original Author : Florian Bernd
|
|
||||||
|
|
||||||
* 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_ENCODERDATA_H
|
|
||||||
#define ZYDIS_ENCODERDATA_H
|
|
||||||
|
|
||||||
#include <Zydis/Defines.h>
|
|
||||||
#include <Zydis/Mnemonic.h>
|
|
||||||
#include <Zydis/SharedTypes.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Enums and types */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
// MSVC does not like types other than (un-)signed int for bitfields
|
|
||||||
#ifdef ZYDIS_MSVC
|
|
||||||
# pragma warning(push)
|
|
||||||
# pragma warning(disable:4214)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Encodable instruction */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Defines the @c ZydisEncodableInstruction struct.
|
|
||||||
*/
|
|
||||||
typedef struct ZydisEncodableInstruction_
|
|
||||||
{
|
|
||||||
uint16_t definitionReference ZYDIS_BITFIELD(13);
|
|
||||||
ZydisInstructionEncoding encoding ZYDIS_BITFIELD( 3);
|
|
||||||
uint8_t opcode ZYDIS_BITFIELD( 8);
|
|
||||||
ZydisOpcodeMap opcodeMap ZYDIS_BITFIELD( 3);
|
|
||||||
uint8_t mode ZYDIS_BITFIELD( 3);
|
|
||||||
uint8_t operandSize ZYDIS_BITFIELD( 3);
|
|
||||||
uint8_t addressSize ZYDIS_BITFIELD( 3);
|
|
||||||
uint8_t modrmMod ZYDIS_BITFIELD( 4);
|
|
||||||
ZydisBool forceModrmReg ZYDIS_BITFIELD( 1);
|
|
||||||
uint8_t modrmReg ZYDIS_BITFIELD( 8);
|
|
||||||
ZydisBool forceModrmRm ZYDIS_BITFIELD( 1);
|
|
||||||
uint8_t modrmRm ZYDIS_BITFIELD( 8);
|
|
||||||
uint8_t mandatoryPrefix ZYDIS_BITFIELD( 3);
|
|
||||||
uint8_t vectorLength ZYDIS_BITFIELD( 2);
|
|
||||||
uint8_t rexW ZYDIS_BITFIELD( 1);
|
|
||||||
uint8_t rexB ZYDIS_BITFIELD( 2);
|
|
||||||
uint8_t evexB ZYDIS_BITFIELD( 1);
|
|
||||||
uint8_t mvexE ZYDIS_BITFIELD( 2);
|
|
||||||
} ZydisEncodableInstruction;
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
#ifdef ZYDIS_MSVC
|
|
||||||
# pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
/* Functions */
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
/* Encodable instructions */
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Returns all encodable instructions matching the given `mnemonic`.
|
|
||||||
*
|
|
||||||
* @param mnemonic The mnemonic.
|
|
||||||
* @param instruction A pointer to the variable that receives a pointer to the first
|
|
||||||
* `ZydisEncodableInstruction` struct.
|
|
||||||
*
|
|
||||||
* @return The number of encodable instructions for the given mnemonic.
|
|
||||||
*/
|
|
||||||
ZYDIS_NO_EXPORT uint8_t ZydisGetEncodableInstructions(ZydisMnemonic mnemonic,
|
|
||||||
const ZydisEncodableInstruction** instruction);
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* ============================================================================================== */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ZYDIS_ENCODERDATA_H */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -31,7 +31,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <Zydis/Zydis.h>
|
#include <Zydis/Zydis.h>
|
||||||
#include "Zydis/Encoder.h"
|
//#include "Zydis/Encoder.h"
|
||||||
|
|
||||||
/* ============================================================================================== */
|
/* ============================================================================================== */
|
||||||
/* Entry point */
|
/* Entry point */
|
||||||
|
|
Loading…
Reference in New Issue