10.5 认识XEDParse汇编引擎
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 许可协议。转载请注明出处!
- 点赞
- 收藏
- 关注作者
评论(0)