selph
selph
发布于 2021-11-05 / 1273 阅读
0
0

使用汇编引擎 XEDParse 生成机器码

代码注入器有一个功能就是,在界面上写汇编代码,然后程序内部转换成二进制机器码,注入到目标进程去执行,经查阅资料了解到,这种的实际上是通过汇编引擎来进行生成的,再次经过查阅资料,找到这么一个开源的汇编引擎(实在是太难找了!!!!),下面介绍一下具体的使用

XEDParse 库简介

XED 是开源的汇编引擎,Github 地址:x64dbg/XEDParse: XEDParse: A MASM-like, single-line plaintext assembler (github.com)

官方介绍:一句话概括就是能通过指令生成机器码

XEDParse is a library to parse MASM-like plaintext instructions to the XED instruction format. The library is meant to have quick access to assembly in certain low-level programs (such as debuggers).

Currently finished:

  • Parsing instructions to an internal data structure
  • Translate the instruction base to XED2
  • Translate registers to XED2
  • Encode the translated structure
  • Translate values
  • Translate memory arguments

该库支持 x86 和 x64,使用方法极其简单,以至于官方连个使用说明都没单独写,就丢了个示例项目

XEDParse 库的使用

可以直接 clone github 的项目自己编译,这里编译总是提示我定位不到符号啥的,不会弄,就走笨办法吧:去 github 下载编译好的 release 压缩包来用

解压后内容如下:

C:.
│  XEDParse.h
│  XEDParsePython.py
│  XEDParse_x64.lib
│  XEDParse_x86.lib
│
├─x32
│      XEDParse.dll
│      XEDParseTest.exe
│
└─x64
        XEDParse.dll
        XEDParseTest.exe

接下来用 VS 创建项目,这里就是演示个怎么用,就创建控制台项目了

接下来把 dll,lib,h 后缀的文件拿走(x86 项目就拿 x86 的,x64 项目就拿 x64 的),放到项目目录下,把 h 文件添加到项目头文件里:

image.png

往头文件里最上面加一行代码,导入库:

// 用哪个调用哪个
//#pragma comment(lib,"XEDParse_x64")
#pragma comment(lib,"XEDParse_x86")

如果想把 x86 和 x64 都放在项目文件里来方便编译的话,可以通过修改 lib 二进制文件给 lib 加载的 dll 改个名字,这样就能同时把 x86 和 x64 的 dll 都放在一起了

调用代码:

构造个结构体,然后调用解析函数就行,如下:

#include <stdio.h>
#include "XEDParse.h"

int main()
{
    XEDPARSE parse;
    memset(&parse, 0, sizeof(parse));
#ifdef _WIN64
    parse.x64 = true;
#else
    parse.x64 = false;
#endif
    parse.cip = 0;
    char instr[256] = "";
    //puts("instruction (cip = 0):");
    puts("Please Enter Code:");
    fgets(instr, 256, stdin);       // 获取输入
    instr[strlen(instr) - 1] = 0;   // 最后一位清零
    strcpy(parse.instr, instr);     // 输入的str传递给结构体里
    XEDParseAssemble(&parse);       // 解析
    //printf("error:\n%s\n", parse.error);    // 打印错误
    puts("bytes:");   
    for (unsigned int i = 0; i < parse.dest_size; i++)  // 打印机器码
    printf("%.2X ", parse.dest[i]);
    puts("");
    //system("pause");
    return 0;
}

使用示例:

image.png


评论