mirror of https://github.com/x64dbg/zydis
implemented CBindings/test.c
fixed a few bugs in the C bindings encountered while implementing the test
This commit is contained in:
parent
7af8c0e38b
commit
c672c7a9fc
|
@ -35,9 +35,9 @@
|
||||||
#ifndef _VDE_VXDISASSEMBLERC_H_
|
#ifndef _VDE_VXDISASSEMBLERC_H_
|
||||||
#define _VDE_VXDISASSEMBLERC_H_
|
#define _VDE_VXDISASSEMBLERC_H_
|
||||||
|
|
||||||
#include "VXDisassemblerTypes.h"
|
#include "VXDisassemblerTypesC.h"
|
||||||
#include "VXInstructionDecoder.h"
|
#include "VXInstructionDecoderC.h"
|
||||||
#include "VXInstructionFormatter.h"
|
#include "VXInstructionFormatterC.h"
|
||||||
#include "VXDisassemblerUtils.h"
|
#include "VXDisassemblerUtilsC.h"
|
||||||
|
|
||||||
#endif /* _VDE_VXDISASSEMBLERC_H_ */
|
#endif /* _VDE_VXDISASSEMBLERC_H_ */
|
|
@ -36,6 +36,7 @@
|
||||||
#define _VDE_VXDISASSEMBLERTYPESC_H_
|
#define _VDE_VXDISASSEMBLERTYPESC_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include "VXOpcodeTableC.h"
|
#include "VXOpcodeTableC.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -109,9 +109,9 @@ VXInstructionDecoderContext* VXInstructionDecoder_Create(void);
|
||||||
|
|
||||||
VXInstructionDecoderContext* VXInstructionDecoder_CreateEx(
|
VXInstructionDecoderContext* VXInstructionDecoder_CreateEx(
|
||||||
VXBaseDataSourceContext *input,
|
VXBaseDataSourceContext *input,
|
||||||
VXDisassemblerMode disassemblerMode = DM_M32BIT,
|
VXDisassemblerMode disassemblerMode,
|
||||||
VXInstructionSetVendor preferredVendor = ISV_ANY,
|
VXInstructionSetVendor preferredVendor,
|
||||||
uint64_t instructionPointer = 0);
|
uint64_t instructionPointer);
|
||||||
|
|
||||||
void VXInstructionDecoder_Release(
|
void VXInstructionDecoder_Release(
|
||||||
VXInstructionDecoderContext *ctx);
|
VXInstructionDecoderContext *ctx);
|
||||||
|
|
|
@ -113,13 +113,13 @@ inline const Verteron::VXBaseInstructionFormatter* VXBaseInstructionFormatter_Cp
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Verteron::VXBaseInstructionFormatter* VXIntelInstructionFormatter_CppPtr(
|
inline Verteron::VXBaseInstructionFormatter* VXIntelInstructionFormatter_CppPtr(
|
||||||
VXIntelInstructionFormatterContext *ctx)
|
VXBaseInstructionFormatterContext *ctx)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<Verteron::VXBaseInstructionFormatter*>(ctx);
|
return reinterpret_cast<Verteron::VXBaseInstructionFormatter*>(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const Verteron::VXBaseInstructionFormatter* VXIntelInstructionFormatter_CppPtr(
|
inline const Verteron::VXBaseInstructionFormatter* VXIntelInstructionFormatter_CppPtr(
|
||||||
const VXIntelInstructionFormatterContext *ctx)
|
const VXBaseInstructionFormatterContext *ctx)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<const Verteron::VXBaseInstructionFormatter*>(ctx);
|
return reinterpret_cast<const Verteron::VXBaseInstructionFormatter*>(ctx);
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,6 @@ inline const VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CPtr
|
||||||
return reinterpret_cast<const VXBaseInstructionFormatterContext*>(ctx);
|
return reinterpret_cast<const VXBaseInstructionFormatterContext*>(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* VXBaseSymbolResolver ======================================================================== */
|
/* VXBaseSymbolResolver ======================================================================== */
|
||||||
|
@ -201,6 +200,14 @@ void VXExactSymbolResolverContext_Clear(
|
||||||
|
|
||||||
/* VXBaseInstructionFormatter ================================================================== */
|
/* VXBaseInstructionFormatter ================================================================== */
|
||||||
|
|
||||||
|
const char* VXBaseInstructionFormatter_FormatInstruction(
|
||||||
|
VXBaseInstructionFormatterContext *ctx,
|
||||||
|
const VXInstructionInfo *info)
|
||||||
|
{
|
||||||
|
return VXBaseInstructionFormatter_CppPtr(ctx)->formatInstruction(
|
||||||
|
*VXInstructionInfo_CppPtr(info));
|
||||||
|
}
|
||||||
|
|
||||||
VXBaseSymbolResolverContext* VXBaseInstructionFormatter_GetSymbolResolver(
|
VXBaseSymbolResolverContext* VXBaseInstructionFormatter_GetSymbolResolver(
|
||||||
const VXBaseInstructionFormatterContext *ctx)
|
const VXBaseInstructionFormatterContext *ctx)
|
||||||
{
|
{
|
||||||
|
@ -236,9 +243,4 @@ VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
|
||||||
VXBaseSymbolResolver_CppPtr(resolver)));
|
VXBaseSymbolResolver_CppPtr(resolver)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VXIntelInstructionFormatter_Release(VXIntelInstructionFormatterContext *ctx)
|
|
||||||
{
|
|
||||||
delete VXIntelInstructionFormatter_CppPtr(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ============================================================================================= */
|
/* ============================================================================================= */
|
|
@ -87,6 +87,10 @@ typedef const char* (*VXResolveSymbol_t)(
|
||||||
|
|
||||||
typedef struct _VXBaseInstructionFormatterContext {int a;} VXBaseInstructionFormatterContext;
|
typedef struct _VXBaseInstructionFormatterContext {int a;} VXBaseInstructionFormatterContext;
|
||||||
|
|
||||||
|
const char* VXBaseInstructionFormatter_FormatInstruction(
|
||||||
|
VXBaseInstructionFormatterContext *ctx,
|
||||||
|
const VXInstructionInfo *info);
|
||||||
|
|
||||||
VXBaseSymbolResolverContext* VXBaseInstructionFormatter_GetSymbolResolver(
|
VXBaseSymbolResolverContext* VXBaseInstructionFormatter_GetSymbolResolver(
|
||||||
const VXBaseInstructionFormatterContext *ctx);
|
const VXBaseInstructionFormatterContext *ctx);
|
||||||
|
|
||||||
|
@ -98,8 +102,6 @@ void VXBaseInstructionFormatter_Release(VXBaseInstructionFormatterContext *ctx);
|
||||||
|
|
||||||
/* VXIntelInstructionFormatter ================================================================ */
|
/* VXIntelInstructionFormatter ================================================================ */
|
||||||
|
|
||||||
typedef struct _VXIntelInstructionFormatterContext {int a;} VXIntelInstructionFormatterContext;
|
|
||||||
|
|
||||||
VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_Create(void);
|
VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_Create(void);
|
||||||
|
|
||||||
VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
|
VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
|
||||||
|
|
|
@ -1354,39 +1354,39 @@ typedef enum _VXDefinedOperandSize /* : uint8_t */
|
||||||
/**
|
/**
|
||||||
* @brief B sized register or D sized memory operand.
|
* @brief B sized register or D sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_BD = (uint8_t(DOS_B) << 4) | uint8_t(DOS_D),
|
DOS_BD = (DOS_B << 4) | DOS_D,
|
||||||
/**
|
/**
|
||||||
* @brief B sized register or V sized memory operand.
|
* @brief B sized register or V sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_BV = (uint8_t(DOS_B) << 4) | uint8_t(DOS_V),
|
DOS_BV = (DOS_B << 4) | DOS_V,
|
||||||
/**
|
/**
|
||||||
* @brief W sized register or D sized memory operand.
|
* @brief W sized register or D sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_WD = (uint8_t(DOS_W) << 4) | uint8_t(DOS_D),
|
DOS_WD = (DOS_W << 4) | DOS_D,
|
||||||
/**
|
/**
|
||||||
* @brief W sized register or V sized memory operand.
|
* @brief W sized register or V sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_WV = (uint8_t(DOS_W) << 4) | uint8_t(DOS_V),
|
DOS_WV = (DOS_W << 4) | DOS_V,
|
||||||
/**
|
/**
|
||||||
* @brief W sized register or Y sized memory operand.
|
* @brief W sized register or Y sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_WY = (uint8_t(DOS_W) << 4) | uint8_t(DOS_Y),
|
DOS_WY = (DOS_W << 4) | DOS_Y,
|
||||||
/**
|
/**
|
||||||
* @brief D sized register or Y sized memory operand.
|
* @brief D sized register or Y sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_DY = (uint8_t(DOS_D) << 4) | uint8_t(DOS_Y),
|
DOS_DY = (DOS_D << 4) | DOS_Y,
|
||||||
/**
|
/**
|
||||||
* @brief W sized register or O sized memory operand.
|
* @brief W sized register or O sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_WO = (uint8_t(DOS_W) << 4) | uint8_t(DOS_O),
|
DOS_WO = (DOS_W << 4) | DOS_O,
|
||||||
/**
|
/**
|
||||||
* @brief D sized register or O sized memory operand.
|
* @brief D sized register or O sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_DO = (uint8_t(DOS_D) << 4) | uint8_t(DOS_O),
|
DOS_DO = (DOS_D << 4) | DOS_O,
|
||||||
/**
|
/**
|
||||||
* @brief Q sized register or O sized memory operand.
|
* @brief Q sized register or O sized memory operand.
|
||||||
*/
|
*/
|
||||||
DOS_QO = (uint8_t(DOS_Q) << 4) | uint8_t(DOS_O),
|
DOS_QO = (DOS_Q << 4) | DOS_O,
|
||||||
} VXDefinedOperandSize;
|
} VXDefinedOperandSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -51,6 +51,7 @@ if (BUILD_C_BINDINGS)
|
||||||
"Bindings/C/VXOpcodeTableC.cpp"
|
"Bindings/C/VXOpcodeTableC.cpp"
|
||||||
"Bindings/C/VXInstructionDecoderC.cpp")
|
"Bindings/C/VXInstructionDecoderC.cpp")
|
||||||
add_library("VerteronDisassemblerEngineC" ${vdec_headers} ${vdec_sources})
|
add_library("VerteronDisassemblerEngineC" ${vdec_headers} ${vdec_sources})
|
||||||
|
target_link_libraries("VerteronDisassemblerEngineC" "VerteronDisassemblerEngine")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Examples
|
# Examples
|
||||||
|
@ -68,6 +69,7 @@ if (BUILD_EXAMPLES)
|
||||||
|
|
||||||
if (BUILD_C_BINDINGS)
|
if (BUILD_C_BINDINGS)
|
||||||
add_executable("CBindingsTest" "Examples/CBindings/test.c")
|
add_executable("CBindingsTest" "Examples/CBindings/test.c")
|
||||||
|
include_directories("Bindings/C")
|
||||||
target_link_libraries("CBindingsTest" "VerteronDisassemblerEngineC")
|
target_link_libraries("CBindingsTest" "VerteronDisassemblerEngineC")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,89 @@
|
||||||
|
|
||||||
**************************************************************************************************/
|
**************************************************************************************************/
|
||||||
|
|
||||||
|
#include <VXDisassemblerC.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
int main()
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
VXInstructionInfo info;
|
||||||
|
VXInstructionDecoderContext* decoder = NULL;
|
||||||
|
VXBaseInstructionFormatterContext* formatter = NULL;
|
||||||
|
VXBaseDataSourceContext* input32 = NULL;
|
||||||
|
VXBaseDataSourceContext* input64 = NULL;
|
||||||
|
|
||||||
|
decoder = VXInstructionDecoder_Create();
|
||||||
|
formatter = VXIntelInstructionFormatter_Create();
|
||||||
|
|
||||||
|
input32 = VXMemoryDataSource_Create(&data32[0], sizeof(data32));
|
||||||
|
input64 = VXMemoryDataSource_Create(&data64[0], sizeof(data64));
|
||||||
|
|
||||||
|
VXInstructionDecoder_SetDisassemblerMode(decoder, DM_M32BIT);
|
||||||
|
VXInstructionDecoder_SetDataSource(decoder, input32);
|
||||||
|
VXInstructionDecoder_SetInstructionPointer(decoder, 0x77091852);
|
||||||
|
|
||||||
|
puts("32 bit test ...\n\n");
|
||||||
|
while (VXInstructionDecoder_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", VXBaseInstructionFormatter_FormatInstruction(formatter, &info));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("\n");
|
||||||
|
|
||||||
|
VXInstructionDecoder_SetDisassemblerMode(decoder, DM_M64BIT);
|
||||||
|
VXInstructionDecoder_SetDataSource(decoder, input64);
|
||||||
|
VXInstructionDecoder_SetInstructionPointer(decoder, 0x00007FFA39A81930ull);
|
||||||
|
puts("64 bit test ...\n\n");
|
||||||
|
while (VXInstructionDecoder_DecodeInstruction(decoder, &info))
|
||||||
|
{
|
||||||
|
printf("%016llX ", info.instrAddress);
|
||||||
|
if (info.flags & IF_ERROR_MASK)
|
||||||
|
{
|
||||||
|
printf("db %02X", info.data[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s\n", VXBaseInstructionFormatter_FormatInstruction(formatter, &info));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getchar();
|
||||||
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in New Issue