【发布时间】:2014-10-15 18:22:21
【问题描述】:
我想查看 Linux 命令的源代码,以了解每个命令中实际发生的情况。当我尝试在文本/十六进制编辑器中打开 /bin 中的命令时,我得到了一堆垃圾。查看这些命令的源代码的正确方法是什么?
提前致谢, 杰夫
编辑: 我应该更具体。基本上我有一个命令集,是由我再也无法联系到的人编写的。我想看看他的命令实际上在做什么,但是没有办法“分解”命令,我已经死在水里了。我希望有一种方法可以在操作系统中做到这一点。
【问题讨论】:
我想查看 Linux 命令的源代码,以了解每个命令中实际发生的情况。当我尝试在文本/十六进制编辑器中打开 /bin 中的命令时,我得到了一堆垃圾。查看这些命令的源代码的正确方法是什么?
提前致谢, 杰夫
编辑: 我应该更具体。基本上我有一个命令集,是由我再也无法联系到的人编写的。我想看看他的命令实际上在做什么,但是没有办法“分解”命令,我已经死在水里了。我希望有一种方法可以在操作系统中做到这一点。
【问题讨论】:
许多核心 Linux 命令是 GNU 核心实用程序的一部分。源码可以在网上找到here
您打开的文件是二进制可执行文件,它们是内核传递给 CPU 的东西。这些文件是使用编译器生成的,该编译器接收您和我理解的源代码,并通过多个阶段将其转换为这种 CPU 友好格式。
【讨论】:
您可以使用strace 找出正在进行的系统调用
strace your_command
【讨论】:
您很可能可以使用发行版的包管理器下载源代码。例如,在 Debian 和相关发行版(包括 Ubuntu)上,首先找到该命令属于哪个包:
$ dpkg -S /bin/cat
coreutils: /bin/cat
输出告诉您/bin/cat 在coreutils 包中。现在可以下载源代码了:
apt-get source coreutils
【讨论】:
这个问题与reverse engineering有关。
一些关键字是static analysis 和dynamic analysis
gdb检查二进制文件里面是否有符号表。 (如果二进制编译带有调试标志,您可以获取源代码并跳过以下步骤)strace/ltrace观察程序行为。objdump/ida-pro或其他反汇编程序编写伪代码。如果您愿意并且有时间,可以将普通的二进制文件恢复为源代码。反之,一个异常的程序就不容易做到这一点,而且只会出现在特定的 ctf 比赛中。 (一些特殊技能如strip/objcopy/packer ...等)
【讨论】:
你可以看到 /bin/cat 的汇编代码:
objdump -d /bin/cat
然后分析一下,看看能启动什么命令。
另一种接近方法是strings /bin/cat,它很有用,可以先提出一个想法,然后再反过来。
无论如何你都可以在线获取每个 linux 命令的源代码 :D
【讨论】: