您不必编写完整的 C 程序然后将其反汇编。
您可以编写一个只执行您想要的操作的简单 C 函数,然后让 GCC 编译但不使用-S 参数组装和链接它。
您也可以打开调试标志-g,这样程序集就会有一些调试数据,这样更容易阅读。
获取此示例代码:
#include <unistd.h>
void get_hostname() {
char buffer[100];
gethostname(buffer, 100);
}
如果这是一个完整的hn.c文件内容,可以使用以下命令生成hn.asm文件:
gcc -S -g hn.c -o hn.asm
这个文件仍然会有一堆你不需要的东西,但它也会有一个容易找到和清晰的你想要的功能的组合:
.Ltext0:
.globl get_hostname
.type get_hostname, @function
get_hostname:
.LFB0:
.file 1 "hn.c"
.loc 1 3 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $112, %rsp
.loc 1 3 0
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
.loc 1 5 0
leaq -112(%rbp), %rax
movl $100, %esi
movq %rax, %rdi
call gethostname
.loc 1 6 0
movq -8(%rbp), %rax
xorq %fs:40, %rax
je .L2
call __stack_chk_fail
.L2:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
您可以将其传递给汇编程序以生成您想要的机器代码。
注意.loc 指令:它们用于将汇编代码与原始C 代码的行号相匹配。您可以像调试器一样使用它们来了解哪些汇编行代表哪一行 C 代码。