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