我需要编写类似“反汇编程序”的内容,我需要读取RAM内存(代码段)并以格式化的方式显示
ADD rax, rbx
MOV rcx, rax
在哪里可以找到有关如何将操作码转换为相应的操作数的综合指南/论文?我的目标是x64组装
最佳答案
我真的建议您只使用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自动工具构建系统,我构建了:
为了您的方便。归档文件包含DLL和头文件。 (从随机的陌生人那里下载并运行DLL并回答关于Stackoverflow的问题是否明智是另一回事;)。