开发者

Producing x86 assembly code from a binary executable/C array

I have a C array that contains binary x86_64 machine code, which I need to convert to assembly code on a Linux machine. I have no problem in converting the C array to a binary executable, 开发者_StackOverflow中文版but can't find the utility to convert it to asm code.

Any ideas?

Thanks!


You are probably looking for a disassembler. A disassembler takes machine code (either from an executable, or from an object file) and turns it back into human-readable assembly language. If that's what you need, have a look at this list of disassemblers for Linux.


Some disassemblers that aren't listed there:

  • IDA Pro: Apparently one of the most powerful disassemblers. Probably overkill for your purposes.

  • ndisasm (accompanies the nasm assembler)


You need a disassembler. I personally use NDISASM from the NASM package.


If you can afford to link to GPL code, you could link to libbfd and have it disassemble the array for you. Do this if you can't afford to spawn a new process that does it.


I prefer libdisasm http://bastard.sourceforge.net/libdisasm.html, but you can always call objdump -D.

From my jitter:

#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


The Standard disassembler on linux is a tool called objdump and has a very simple use case:

Lets say we have a simple hello world ANSI C program.

#include <stdio.h>

int main() {

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

}

In my file called hello.c the above code is what I use. When I compile with gcc and get my hello executable, we will then use objdump to do a quick dump conversion. When using objdump -D hello we get the following output:

objdump output

objdump is very good for quick disassembly of executable portions of a C binary.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜