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 许可协议。转载请注明出处!

相关推荐
汉克老师2 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9923 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime3 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven3 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981033 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus14 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu21 小时前
一个通用游戏数据服务器
c++·架构
another heaven21 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++