0

我有一个包含二进制 x86_64 机器代码的 C 数组,我需要在 Linux 机器上将其转换为汇编代码。我将 C 数组转换为二进制可执行文件没有问题,但找不到将其转换为 asm 代码的实用程序。

有任何想法吗?

谢谢!

4

5 回答 5

4

您可能正在寻找反汇编程序。反汇编程序获取机器代码(来自可执行文件或目标文件)并将其转换回人类可读的汇编语言。如果这是您需要的,请查看此 Linux 反汇编程序列表


一些未在此处列出的反汇编程序:

  • IDA Pro:显然是最强大的反汇编程序之一。可能为您的目的矫枉过正。

  • ndisasm(伴随nasm汇编器)

于 2010-05-08T14:57:12.453 回答
2

你需要一个反汇编程序。我个人使用 NASM 包中的 NDISASM。

于 2010-05-08T14:58:02.380 回答
0

如果您负担得起链接到 GPL 代码的费用,则可以链接到 libbfd 并让它为您反汇编数组。如果您负担不起产生一个新进程来执行此操作,请执行此操作。

于 2010-05-14T16:51:16.550 回答
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
于 2010-12-19T19:08:21.093 回答
0

Linux 上的标准反汇编器是一个名为的工具objdump,它有一个非常简单的用例:

假设我们有一个简单的hello worldANSI C 程序。

#include <stdio.h>

int main() {

   printf("Hello world!\n");
   return 0;

}

在我的文件hello.c中,上面的代码就是我使用的。当我编译gcc并获得我的hello可执行文件时,我们将使用它objdump来进行快速转储转换。使用时objdump -D hello我们得到以下输出:

objdump 输出

objdump非常适合快速反汇编 C 二进制文件的可执行部分。

于 2017-03-27T08:22:32.843 回答