Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反汇编C代码_C_Assembly_Nasm - Fatal编程技术网

反汇编C代码

反汇编C代码,c,assembly,nasm,C,Assembly,Nasm,如何能够反汇编C代码?我已经在这里读了一些问题(stackoverflow)。但是如果你想反汇编,你需要一个机器代码,那么如何使用nasm呢?所以,如果我用C语言为ex.创建一个Hello World,怎么能做到这一点呢?Nasm是个坏主意。有几个选择。IDA pro给了我一些成功,但如果你真的了解你的汇编,你可以nm的符号,然后hexdump从那里的代码,并手动使汇编出来。不过,使用nasm生成可重新编译的代码并不是唯一的方法 otool(或objdump)将产生装配 如果您需要一些示例:这里

如何能够反汇编C代码?我已经在这里读了一些问题(stackoverflow)。但是如果你想反汇编,你需要一个机器代码,那么如何使用nasm呢?所以,如果我用C语言为ex.创建一个Hello World,怎么能做到这一点呢?

Nasm是个坏主意。有几个选择。IDA pro给了我一些成功,但如果你真的了解你的汇编,你可以nm的符号,然后hexdump从那里的代码,并手动使汇编出来。不过,使用nasm生成可重新编译的代码并不是唯一的方法

otool(或objdump)将产生装配

如果您需要一些示例:这里:

#include <stdio.h>
main(argc, argv)
int argc; char * * argv;
{
    printf("Hello, World\n");
}
耳蜗输出:

hydrogen:tmp phyrrus9$ otool -tv a.out
a.out:
(__TEXT,__text) section
_main:
0000000100000f40    pushq   %rbp
0000000100000f41    movq    %rsp, %rbp
0000000100000f44    subq    $0x10, %rsp
0000000100000f48    leaq    0x37(%rip), %rdi         ; this is our string
0000000100000f4f    movb    $0x0, %al
0000000100000f51    callq   0x100000f66              ; call printf
0000000100000f56    movl    $0x0, %ecx
0000000100000f5b    movl    %eax, 0xfffffffffffffffc(%rbp)
0000000100000f5e    movl    %ecx, %eax
0000000100000f60    addq    $0x10, %rsp
0000000100000f64    popq    %rbp
0000000100000f65    ret
未显示hextump输出

实际装配:

hydrogen:tmp phyrrus9$ cat tmp.s
.section    __TEXT,__text,regular,pure_instructions
.globl  _main
.align  4, 0x90
_main:                                  ## @main
.cfi_startproc
## BB#0:
pushq   %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq    %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
subq    $16, %rsp
leaq    L_.str(%rip), %rdi
movb    $0, %al
callq   _printf
movl    $0, %ecx
movl    %eax, -4(%rbp)          ## 4-byte Spill
movl    %ecx, %eax
addq    $16, %rsp
popq    %rbp
ret
.cfi_endproc

.section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
.asciz   "Hello, world!\n"


.subsections_via_symbols

希望这能帮助您理解。

取决于您的C编译器。使用
gcc
,使用
-S
标志。具体取决于编译器。。啊好的
hydrogen:tmp phyrrus9$ cat tmp.s
.section    __TEXT,__text,regular,pure_instructions
.globl  _main
.align  4, 0x90
_main:                                  ## @main
.cfi_startproc
## BB#0:
pushq   %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq    %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
subq    $16, %rsp
leaq    L_.str(%rip), %rdi
movb    $0, %al
callq   _printf
movl    $0, %ecx
movl    %eax, -4(%rbp)          ## 4-byte Spill
movl    %ecx, %eax
addq    $16, %rsp
popq    %rbp
ret
.cfi_endproc

.section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
.asciz   "Hello, world!\n"


.subsections_via_symbols