1

我需要编写类似“反汇编程序”的东西,我需要读取 RAM 内存(代码部分)并将其格式化为

ADD rax, rbx
MOV rcx, rax

我在哪里可以找到关于如何将操作码转换为相应操作/操作数的综合指南/论文?我的目标是 x64 程序集

4

5 回答 5

3

你可以看看这个库——你可以“按原样”使用它,或者只是从它的源代码中学习(它是在 BSD 许可下发布的)。

于 2012-12-30T16:35:04.450 回答
2

我真的建议您只使用 BSD 许可的udis86 库,而不是编写另一个 x86 反汇编程序:

#include <stdio.h>
#include <udis86.h>

enum {
    /* Controls whether to disassemble for x86 or x64 */
    UDIS86_MODE = 64 /* 16, 32, or 64 */
};

int main()
{
    ud_t ud_obj;

    ud_init(&ud_obj);

    ud_set_input_file(&ud_obj, stdin);
    ud_set_mode(&ud_obj, UDIS86_MODE);
    ud_set_syntax(&ud_obj, UD_SYN_INTEL);

    while (ud_disassemble(&ud_obj)) {
        printf("\t%s\n", ud_insn_asm(&ud_obj));
    }

    return 0;
}

github上的Udis86版本甚至支持最新的Intel AVX指令。

使用 MinGW64 / MSYS 工具链为 x86 或 x64 Windows 构建 Udis86 非常容易。以防你不熟悉 GCC 和 GNU autotools 构建系统,我已经构建了:

  1. http://scottt.tw/mingw32-udis86.tar.gz
  2. http://scottt.tw/mingw64-udis86.tar.gz

为了您的方便。档案包含 DLL 和头文件。(从回答 Stackoverflow 问题的随机陌生人那里下载和运行 DLL 是否明智是另一回事;)。

于 2013-01-03T02:55:32.703 回答
0

这是我的操作码首选列表,按数字排序:

http://ref.x86asm.net/geek64.html

该站点还有许多其他列表。但是,如您所见,x86/64 上的操作码非常多,因此手动编写反汇编程序需要一段时间。

我建议您将代码提供给现有的反汇编程序。例如,看到这个问题:

如何反汇编原始 x86 代码?

于 2012-12-30T16:35:30.260 回答
0
  1. 对于英特尔,您可以在http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html找到它- 特别是,您可能对第 2 卷感兴趣。

  2. 对于 AMD 处理器,它必须在此处:http: //developer.amd.com/resources/documentation-articles/developer-guides-manuals/#manuals。看来你需要第3卷。

尽管如此,他们还是有很多共同点。

于 2012-12-30T16:37:03.667 回答
0

如果您正在创建自己的反汇编程序,则必须从...下载指令集指南(第 2 卷)

http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

附录中的注释和表格非常宝贵。您可能会注意到许多说明都遵循类似的模式。因此,您可以构建自己的函数指针表来解码指令。填充表格可能很耗时。

希望这可以帮助。

于 2012-12-30T19:34:35.107 回答