我需要编写类似“反汇编程序”的东西,我需要读取RAM内存(代码部分)并将其显示为格式化为
ADD rax, rbx
MOV rcx, rax
在哪里可以找到有关如何将操作码转换为相应操作/操作数的综合指南/论文?我的目标是x64程序集
答案 0 :(得分:3)
您可以查看this library - 您可以“按原样”使用它,或者只是从其来源(根据BSD许可证发布)中学习。
答案 1 :(得分: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构建系统,我已经构建了:
为了您的方便。存档包含DLL和头文件。 (从Stackoverflow上回答问题的随机陌生人下载和运行DLL是否明智是另一回事;)。
答案 2 :(得分:0)
这是我的操作码的首选列表,按数字排序:
http://ref.x86asm.net/geek64.html
该网站还有许多其他列表。但是,正如您所看到的,x86 / 64上有很多操作码,因此手动编写反汇编程序需要一段时间。
我建议您将代码提供给现有的反汇编程序。例如,请看这个问题:
答案 3 :(得分:0)
对于英特尔,您可以在http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html找到它 - 特别是您可能对第2卷感兴趣。
对于AMD处理器,它必须在此处:http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/#manuals。好像你需要第3卷。
不过,他们有很多共同点。
答案 4 :(得分:0)
如果您要创建自己的反汇编程序,则必须从...下载指令集指南(第2卷)
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
附录中的注释和表格非常宝贵。您可能会注意到许多说明都遵循类似的模式。因此,您可以构建自己的函数指针表来解码指令。填充表格可能非常耗时。
希望这有帮助。