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
|
||||
"Enable instruction decoding and formtting functionality"
|
||||
ON)
|
||||
option(ZYDIS_FEATURE_ENCODER
|
||||
"Enable instruction encoding functionality"
|
||||
OFF)
|
||||
#option(ZYDIS_FEATURE_ENCODER
|
||||
# "Enable instruction encoding functionality"
|
||||
# OFF)
|
||||
option(ZYDIS_FEATURE_EVEX
|
||||
"Enable support for EVEX instructions"
|
||||
ON)
|
||||
|
@ -95,9 +95,9 @@ endif ()
|
|||
if (ZYDIS_FEATURE_DECODER)
|
||||
target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_DECODER")
|
||||
endif ()
|
||||
if (ZYDIS_FEATURE_ENCODER)
|
||||
target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_ENCODER")
|
||||
endif ()
|
||||
#if (ZYDIS_FEATURE_ENCODER)
|
||||
# target_compile_definitions("Zydis" PUBLIC "ZYDIS_ENABLE_FEATURE_ENCODER")
|
||||
#endif ()
|
||||
|
||||
target_sources("Zydis"
|
||||
PUBLIC
|
||||
|
@ -134,15 +134,15 @@ if (ZYDIS_FEATURE_DECODER)
|
|||
"src/FormatHelper.c")
|
||||
endif ()
|
||||
|
||||
if (ZYDIS_FEATURE_ENCODER)
|
||||
target_sources("Zydis"
|
||||
PUBLIC
|
||||
"${CMAKE_CURRENT_LIST_DIR}/include/Zydis/Encoder.h"
|
||||
PRIVATE
|
||||
"src/EncoderData.h"
|
||||
"src/Encoder.c"
|
||||
"src/EncoderData.c")
|
||||
endif ()
|
||||
#if (ZYDIS_FEATURE_ENCODER)
|
||||
# target_sources("Zydis"
|
||||
# PUBLIC
|
||||
# "${CMAKE_CURRENT_LIST_DIR}/include/Zydis/Encoder.h"
|
||||
# PRIVATE
|
||||
# "src/EncoderData.h"
|
||||
# "src/Encoder.c"
|
||||
# "src/EncoderData.c")
|
||||
#endif ()
|
||||
|
||||
if (BUILD_SHARED_LIBS AND WIN32)
|
||||
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 <errno.h>
|
||||
#include <Zydis/Zydis.h>
|
||||
#include "Zydis/Encoder.h"
|
||||
//#include "Zydis/Encoder.h"
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Entry point */
|
||||
|
|
Loading…
Reference in New Issue