10.5 认识XEDParse汇编引擎

认识,xedparse,汇编,引擎 · 浏览次数 : 26

小编点评

**XEDParse 汇编库简介** XEDParse 是一款开源的 x86 指令编码库,它可以将 MASM 语法的汇编指令级转换为对等的机器码,并以 XED 格式输出。 **主要特点:** *高效 *准确 * 易于使用 **使用方法:** 1. 获取 XEDParse 库:`#include <XEDParse/XEDParse.h>` 2. 定义结构 `xed`,并通过向 `xed.cip` 内输送一条汇编指令。 3. 调用 `XEDParseAssemble(&xed)` 函数,传入结构地址。 4. 从 `xed.dest` 和 `xed.dest_size` 中获取机器码。 **示例代码:** ```c++ #include <iostream> #include <Windows.h> #include <D:/XEDParse/XEDParse.h> 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 \\", pAsm); } int main() { 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\\", xed.error); } // 输出参数 PrintOpCode(xed.instr, xed.dest, xed.dest_size); system("pause"); return 0; } ``` **效果图:** ``` xor eax,eax push eax pop eax xor edx,edx mov eax,1 endp ```

正文

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

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

#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)的方式,实现批量输出机器码的效果;

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

与10.5 认识XEDParse汇编引擎相似的内容:

10.5 认识XEDParse汇编引擎

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

华为云大咖说:开发者应用AI大模型的“道、法、术”

本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技术革命,建议就近上车。 迭代:眼下的AI大模型应用都还只是过程稿,仍在快速迭代,切忌刻舟求剑。 预判:AI大模

面试官随便问几个问题就知道你究竟做没做过微信支付宝支付

我将以面试官的角度来提问一些支付相关的问题,并做出回答,让你对企业中支付的全貌有个大概的认知,这里面有一个问题是我面试别人问过的,xdm看完了可以猜一猜是哪个。

[转帖]GoodSync Enterprise 11.10.5.5 Multilingual中文破解版

https://www.ittel.cn/archives/6854.html Goodsync 可以说是目前最好的同步文件,可以支持多任务的同步,单向工具同步的工具。本地文件同步、windows网上邻居同步、FTP同步、WebDAV同步、Amazon S3同步、sFTP同步winMobile同步

5.10 汇编语言:汇编过程与结构

过程的实现离不开堆栈的应用,堆栈是一种后进先出`(LIFO)`的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。栈是由`CPU`管理的线性内存数组,它使用两个寄存器`(SS和ESP)`来保存栈的状态,SS寄存器存放段选择符,而ESP寄存器的值通常是指向特定位置的一个32位偏移值,我们很少需要直接操作ESP寄

知识图谱(Knowledge Graph)- Neo4j 5.10.0 CentOS 安装

[知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装](https://www.cnblogs.com/vipsoft/p/17623086.html) [知识图谱(Knowledge Graph)- Neo4j 5.10.0 CentOS 安装](https

知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装

[知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装](https://www.cnblogs.com/vipsoft/p/17623086.html) [知识图谱(Knowledge Graph)- Neo4j 5.10.0 CentOS 安装](https

知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表

目录创建节点删除节点查询节点创建关系新节点无属性关系删除关系案例 -- 太极拳传承谱系表创建传承人创建师徒关系创建第N代传承人案例 -- 批量执行 看到后面的案例再实操作 删除数据库中以往的图 MATCH (n) DETACH DELETE n 创建节点 CREATE命令语法 Neo4j CQL“C

知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR

下载地址:https://neo4j.com/download/ ## 安装 ![image](https://img2023.cnblogs.com/blog/80824/202308/80824-20230816104928898-1342667053.png) 下载时会产生激活码(保存下来)

知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库

``` #输入查看数据库连接 neo4j$ :server status ``` ![image](https://img2023.cnblogs.com/blog/80824/202308/80824-20230816130548712-41133454.png) 添加 远程连接,输入连接地址 !