【问题标题】:View source for standard Linux commands e.g. cat, ls, cd查看标准 Linux 命令的源代码,例如猫,LS,CD
【发布时间】:2014-10-15 18:22:21
【问题描述】:

我想查看 Linux 命令的源代码,以了解每个命令中实际发生的情况。当我尝试在文本/十六进制编辑器中打开 /bin 中的命令时,我得到了一堆垃圾。查看这些命令的源代码的正确方法是什么?

提前致谢, 杰夫

编辑: 我应该更具体。基本上我有一个命令集,是由我再也无法联系到的人编写的。我想看看他的命令实际上在做什么,但是没有办法“分解”命令,我已经死在水里了。我希望有一种方法可以在操作系统中做到这一点。

【问题讨论】:

    标签: linux bash command


    【解决方案1】:

    许多核心 Linux 命令是 GNU 核心实用程序的一部分。源码可以在网上找到here

    您打开的文件是二进制可执行文件,它们是内核传递给 CPU 的东西。这些文件是使用编译器生成的,该编译器接收您和我理解的源代码,并通过多个阶段将其转换为这种 CPU 友好格式。

    【讨论】:

    • 嗨,安迪,我应该更具体一些。基本上我有一个命令集,它是由我无法联系到的人编写的。我想看看他的命令实际上在做什么,但是没有办法“分解”命令,我已经死在水里了。我希望有一种方法可以在操作系统中做到这一点。
    • 这要困难得多。本机代码很难编译成 c 或 c++ 源代码。您可以使用“objdump -d mycommand”之类的东西将二进制文件转换为汇编程序。然后你需要了解汇编程序才能理解它在做什么。
    • 更新了我上面的评论。如果您知道编译器(特定版本)、编译器选项以及它是如何进行转换的,那么答案并不是真正的答案,而不是 c 代码。跨度>
    • 那行得通,现在我有了程序集,现在我只需要将程序集代码反汇编成 C。感谢您让我走到这一步。如果您对将程序集转换为 C 代码有任何建议,请告诉我!
    【解决方案2】:

    您可以使用strace 找出正在进行的系统调用

    strace your_command
    

    【讨论】:

      【解决方案3】:

      您很可能可以使用发行版的包管理器下载源代码。例如,在 Debian 和相关发行版(包括 Ubuntu)上,首先找到该命令属于哪个包:

      $ dpkg -S /bin/cat 
      coreutils: /bin/cat
      

      输出告诉您/bin/catcoreutils 包中。现在可以下载源代码了:

      apt-get source coreutils
      

      【讨论】:

        【解决方案4】:

        这个问题与reverse engineering有关。

        一些关键字是static analysisdynamic analysis

        1. 使用gdb检查二进制文件里面是否有符号表。 (如果二进制编译带有调试标志,您可以获取源代码并跳过以下步骤)
        2. 通过strace/ltrace观察程序行为。
        3. 使用objdump/ida-pro或其他反汇编程序编写伪代码。
        4. 由 gdb 运行动态分析并修正伪代码。

        如果您愿意并且有时间,可以将普通的二进制文件恢复为源代码。反之,一个异常的程序就不容易做到这一点,而且只会出现在特定的 ctf 比赛中。 (一些特殊技能如strip/objcopy/packer ...等)

        【讨论】:

          【解决方案5】:

          你可以看到 /bin/cat 的汇编代码: objdump -d /bin/cat

          然后分析一下,看看能启动什么命令。

          另一种接近方法是strings /bin/cat,它很有用,可以先提出一个想法,然后再反过来。

          无论如何你都可以在线获取每个 linux 命令的源代码 :D

          【讨论】:

            猜你喜欢
            • 2010-10-27
            • 2016-06-26
            • 2023-02-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-20
            • 2014-10-17
            • 2018-05-04
            • 1970-01-01
            相关资源
            最近更新 更多