10.5 认识XEDParse汇编引擎

XEDParse 是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86、x64平台下的汇编编码,XEDParse的特点是高效、准确、易于使用,它可以良好地处理各种类型的指令,从而更容易地确定一段程序的指令集。XEDParse库可以集成到许多不同的应用程序和工具中,因此被广泛应用于反汇编、逆向工程、漏洞分析和入侵检测等领域。

XEDParse 引擎非常易于使用,读者在使用时只需要通过XEDPARSE xed = { 0 };定义一个结构,并通过向xed.cip内输送一条汇编指令,当调用XEDParseAssemble(&xed)函数时则可实现对特定汇编指令的编码操作,读者只需要通过输出xed.dest以及xed.instr中的值,则可实现对特定一条汇编指令的编码,这段代码可以描述为如下所示;

c 复制代码
#include <iostream>
#include <Windows.h>

extern "C"
{
    #include "D:/XEDParse/XEDParse.h"
    #pragma comment(lib, "D:/XEDParse/XEDParse_x86.lib")
}

using namespace std;

void PrintOpCode(char *pAsm, unsigned char* pOpcode, int nSize)
{
    for (int i = 0; i < nSize; ++i)
    {
        printf("%02X ", pOpcode[i]);
    }
    printf("%30s \n", pAsm);
}

int main(int argc, char *argv)
{
    XEDPARSE xed = { 0 };
    xed.x64 = FALSE;

    // 输入一条汇编指令并转换
    printf("请输入一条汇编指令: ");
    scanf_s("%llx", &xed.cip);
    gets_s(xed.instr, XEDPARSE_MAXBUFSIZE);
    
    // 执行汇编指令
    if (XEDPARSE_OK != XEDParseAssemble(&xed))
    {
        printf("指令错误: %s\n", xed.error);
    }

    // 输出参数
    PrintOpCode(xed.instr, xed.dest, xed.dest_size);

    system("pause");
    return 0;
}

编译上述代码片段,并手动将x32/XEDParse.dll中的动态链接库放入到当前程序的根目录下,运行这个程序并输入一条汇编指令,则会输出该汇编指令所对应的机器码,输出效果图如下图所示;

读者也可以通过数组的方式传递一批汇编指令,并依次循环输出这些指令的机器码,如下代码中定义了OpCode数组,该数组内可写入一些汇编指令集并以endp作为结束标志,通过循环调用XEDParseAssemble(&xed)的方式,实现批量输出机器码的效果;

c 复制代码
int main(int argc, char *argv)
{
    XEDPARSE xed = { 0 };
    xed.x64 = FALSE;

    // 针对数组的汇编编码
    char *OpCode[15] = {
        "xor eax,eax",
        "push eax",
        "pop eax",
        "xor edx,edx",
        "mov eax,1",
        "endp"
    };

    for (int x = 0; x < sizeof(OpCode) / sizeof(OpCode[0]); x++)
    {
        if (strcmp(OpCode[x], "endp") == 0)
        {
            break;
        }

        strcpy(xed.instr, OpCode[x]);
        if (XEDPARSE_OK != XEDParseAssemble(&xed))
        {
            break;
        }
        PrintOpCode(xed.instr, xed.dest, xed.dest_size);
    }

    system("pause");
    return 0;
}

这段代码运行后,读者可看到OpCode中所有汇编指令的机器码输出,效果图如下图所示;

本文作者: 王瑞

本文链接: https://www.lyshark.com/post/891116af.html

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关推荐
小成2023032026521 分钟前
C++~07补充
开发语言·c++
水饺编程30 分钟前
第2章:Linux 基础,切换用户
linux·c语言·汇编
hold?fish:palm39 分钟前
40 二叉树的直径
c++·leetcode
解决小子1 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
爱读书的小胖2 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
pipixia200332 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间
lunar_coder2 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯3 小时前
C++进阶.多态
c++
Navigator_Z3 小时前
LeetCode //C - 1300. Sum of Mutated Array Closest to Target
c语言·算法·leetcode