【问题标题】:Formatting hex code to asm code将十六进制代码格式化为 asm 代码
【发布时间】:2012-12-30 16:31:56
【问题描述】:

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

ADD rax, rbx
MOV rcx, rax

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

【问题讨论】:

  • 我建议您要么找到现有的 x64 反汇编程序,要么自己编写。 “综合指南”将是处理器的“操作原理”,它是汇编语言编码规则。
  • 调试器通常会为您执行此操作。
  • 哪个处理器?汇编语言依赖于处理器。例如,ARM 处理器的汇编语言与 Intel Pentium 系列不同。

标签: c++ debugging assembly disassembly opcode


【解决方案1】:

您可以查看this library - 您可以“按原样”使用它,或者只是从它的源代码(在 BSD 许可下发布)学习。

【讨论】:

    【解决方案2】:

    我真的建议您只使用获得 BSD 许可的 udis86 library,而不是编写另一个 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 是否明智是另一回事;)。

    【讨论】:

      【解决方案3】:

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

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

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

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

      How do I disassemble raw x86 code?

      【讨论】:

        【解决方案4】:
        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 卷。

        不过,他们有很多共同点。

        【讨论】:

          【解决方案5】:

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

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

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

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2019-01-01
            • 2014-01-15
            • 2018-10-13
            • 2019-08-21
            • 1970-01-01
            • 2022-01-20
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多