• 10.5 认识XEDParse汇编引擎


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

    • 官方网站:https://github.com/x64dbg/XEDParse

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

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

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

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

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

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

  • 相关阅读:
    软件测试书单/书籍推荐(整理更新中)
    云原生|kubernetes |部署k8s图形化管理组件 kuboard v3
    COCO数据集中图像的caption读取到txt文件
    半个月看完这份Java八股文,我终于面进了阿里
    Iterable、Collection、List等接口
    mybatisplus配置
    python的标识符命名规则,保留字表
    【Python常用函数】一文让你彻底掌握Python中的enumerate函数
    el-timeline时间线左右两侧显示
    一个iOS 列表头部放大工具
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/133605716