Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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_Reverse Engineering_Pseudocode_Hopper - Fatal编程技术网

C 不了解料斗反编译器输出

C 不了解料斗反编译器输出,c,assembly,reverse-engineering,pseudocode,hopper,C,Assembly,Reverse Engineering,Pseudocode,Hopper,我懂一些C语言和一点汇编语言,想开始学习逆向工程,所以我下载了Mac版Hopper反汇编程序的试用版。我创建了一个超级基本C程序: int main() { int a = 5; return 0; } 并用-g标志编译了它(因为我以前看到过,不确定它是否重要): 然后,我在Hopper反汇编程序中打开a.out文件,点击伪代码按钮,它给了我: int _main() { rax = 0x0; var_4 = 0x0; var_8 = 0x5;

我懂一些C语言和一点汇编语言,想开始学习逆向工程,所以我下载了Mac版Hopper反汇编程序的试用版。我创建了一个超级基本C程序:

int main() {
    int a = 5;
    return 0;
}
并用-g标志编译了它(因为我以前看到过,不确定它是否重要):

然后,我在Hopper反汇编程序中打开
a.out
文件,点击伪代码按钮,它给了我:

int _main() {
    rax = 0x0;
    var_4 = 0x0;
    var_8 = 0x5;
    rsp = rsp + 0x8;
    rbp = stack[2047];
    return 0x0;
}
我在这里理解的唯一一行是将变量设置为
0x5
。对于这样一个简单的程序,我无法理解所有这些额外的行(例如
rsp=rsp+0x8;
)的用途。有人愿意向我解释一下吗


另外,如果有人知道反向工程入门的好资料/教程,那也会很有帮助。谢谢。

看起来它在生成“反汇编伪代码”方面做得特别差(不管是什么——它是反汇编程序还是反汇编程序?无法决定)

在本例中,它看起来有堆栈帧设置(函数prolog),但没有清理(函数epilog)。因此,通过使用实际的反汇编程序查看实际的反汇编代码,您将更好地了解正在发生的事情:

$ gcc -c simple.c
$ objdump -d simple.o

simple.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 fc 05 00 00 00    movl   $0x5,-0x4(%rbp)
   b:   b8 00 00 00 00          mov    $0x0,%eax
  10:   5d                      pop    %rbp
  11:   c3                      retq   
$gcc-c simple.c
$objdump-d simple.o
simple.o:文件格式elf64-x86-64
第节的分解。正文:
0000000000000000 :
0:55推送%rbp
1:48 89 e5 mov%rsp,%rbp
4:c7 45 fc 05 00移动$0x5,-0x4(%rbp)
b:b8 00 mov$0x0,%eax
10:5d流行百分比rbp
11:c3 retq
我们这里的代码是设置堆栈帧(地址0-1),赋值(4),设置返回值(b),分解帧(10),然后返回(11)。由于使用不同版本的gcc或不同的目标,您可能会看到一些不同的情况


在拆卸的情况下,拆卸器删除了第一部分(作为一项无趣的内务管理任务忽略),但从第二部分到最后一部分(撤消第一部分)尚未删除。

优化已禁用?您是否阅读了系统的ABI?你检查过什么是rax、rsp和rbp吗?也许这是值得一读的,如果你打开优化,你会得到空的存根,因为编译器会意识到你没有在代码中做任何事情(这个变量是未使用的)。因此,在您的情况下使用-O0和-g实际上更明智。如果您想了解汇编代码,您需要阅读系统的ABI(应用程序二进制接口)。它告诉您有关寄存器使用、堆栈使用、函数调用、参数传递等的详细信息。除非您确实知道ABI是特定于操作系统和CPU的,否则汇编代码(可能)是没有意义的。实际上更具体的是,如果您考虑例如32 BMS Windows和64 BMS Windows是相同的操作系统(仅在不同的变体中),但是它们具有完全不同的ABI和本地二进制文件(32字节二进制文件在某些类型的包装层中运行在64 B Win中,这使得它们在32 B环境中运行)。编译器生成的asm的问题是,和人工编写的asm(故意以干净的方式编写)相比,if感觉非常隐晦。这就像是另一个难度等级,在你管理“人类”ASM之后。
$ gcc -c simple.c
$ objdump -d simple.o

simple.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 fc 05 00 00 00    movl   $0x5,-0x4(%rbp)
   b:   b8 00 00 00 00          mov    $0x0,%eax
  10:   5d                      pop    %rbp
  11:   c3                      retq