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

相关推荐
肆忆_8 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星12 小时前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛2 天前
delete又未完全delete
c++
祈安_2 天前
C语言内存函数
c语言·后端
端平入洛3 天前
auto有时不auto
c++
我在人间贩卖青春4 天前
汇编之伪指令
汇编·伪指令
norlan_jame4 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20214 天前
信号量和信号
linux·c++
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
czy87874754 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言