我有一个包含二进制x86_64机器代码的C数组,我需要将其转换为Linux机器上的汇编代码。我将C数组转换为二进制可执行文件没有问题,但找不到将其转换为asm代码的实用程序。
有什么想法吗?
谢谢!
答案 0 :(得分:4)
您可能正在寻找反汇编程序。反汇编程序获取机器代码(来自可执行文件或来自目标文件)并将其转换回人类可读的汇编语言。如果这就是您所需要的,请查看this list of disassemblers for Linux。
一些没有列在那里的反汇编:
IDA Pro :显然是最强大的反汇编程序之一。可能会因你的目的而过度杀伤。
ndisasm (伴随 nasm 汇编程序)
答案 1 :(得分:2)
你需要一个反汇编程序。我个人使用NASM包中的NDISASM。
答案 2 :(得分:0)
如果你有能力链接到GPL代码,你可以链接到libbfd并让它为你解组数组。如果你不能产生一个新的进程,那就这样做。
答案 3 :(得分:0)
我更喜欢libdisasm http://bastard.sourceforge.net/libdisasm.html, 但你总是可以调用objdump -D。
来自我的抖动:
#ifdef HAVE_LIBDISASM
# define LINE_SIZE 255`
char line[LINE_SIZE];
int pos = 0;
int insnsize; /* size of instruction */
x86_insn_t insn; /* one instruction */
x86_init(opt_none, NULL, NULL);
while ( pos < size ) {
insnsize = x86_disasm(code, size, 0, pos, &insn);
if ( insnsize ) {
x86_format_insn(&insn, line, LINE_SIZE, att_syntax);
printf("(code+%3x): ", pos);
for ( i = 0; i < 10; i++ ) {
if ( i < insn.size ) printf(" %02x", insn.bytes[i]);
else printf(" ");
}
printf("%s\n", line);
pos += insnsize;
} else {
printf("Invalid instruction at 0x%x. size=0x%x\n", pos, size);
pos++;
}
}
x86_cleanup();
#else
fh = fopen("run-jit.bin", "w");
fwrite(code,size,1,fh);
fclose(fh);
system("objdump -D --target=binary --architecture i386"
#ifdef JIT_CPU_AMD64
":x86-64"
#endif
" run-jit.bin");
#endif
答案 4 :(得分:0)
Linux上的标准反汇编程序是一个名为objdump
的工具,它有一个非常简单的用例:
假设我们有一个简单的hello world
ANSI C程序。
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}
在我的名为hello.c
的文件中,上面的代码就是我使用的代码。当我使用gcc
进行编译并获取hello
可执行文件时,我们将使用objdump
进行快速转储转换。使用objdump -D hello
时,我们得到以下输出:
objdump
非常适合快速反汇编C二进制文件的可执行部分。