【问题标题】:How can I open inside shell commands, binaries, and analyze their code?如何打开内部 shell 命令、二进制文件并分析它们的代码?
【发布时间】:2020-08-25 14:00:24
【问题描述】:

出于好奇,我想检查一下这些命令中的内容。像mkdir 或adb 命令或/bin 或/sbin 文件夹中的其他内容。我知道它们是二进制文件,所以我搜索了一些答案,如下所示。我找到了 xxd -b <filename> 或 `strings 。但我想要更清晰的观点,是否可能。有没有办法我们可以知道它们是用哪种语言写的?例如对于 mac 命令,它们是用什么语言编写的?

How to view files in binary from bash?

【问题讨论】:

  • 对于 macOS 的某些部分(包括许多命令行实用程序),源代码可在opensource.apple.com 获得。

标签: macos shell


【解决方案1】:

实用答案:大多数二进制文件是用“C”编写的,有些是用“C++”编写的。请参阅下面的逻辑来判断哪一个。请注意,我不是 macos 专家 - 我相信 Linux 工具对于 macos 也同样适用

/bin 和 /usr/bin 中的大多数文件是 stripped binaries(少数是创建“别名”的符号链接,或实现现有命令的小脚本,通常使用其他二进制文件)。

二进制文件是stripped 的事实意味着调试器(gdb 或其他工具,如 ltrace 等)可以查看函数名、变量名等(执行man strip 以查看删除的内容)。可以不“剥离”的项目之一是共享库列表。

鉴于此信息,可能从共享库列表中获得一些线索。 C++ 程序通常会链接到“标准 C++”共享库(libstdc++.so.N,其中 N 是版本,目前为 6)。大多数其他语言都有自己的将被链接的运行时共享库​​。大多数“C”程序将与标准 C 运行时 (/lib.c.so.N) 链接。

底线:考虑以下过程:

  • file -L /bin/sh(或任何其他二进制文件):
  • 如果输出中包含“脚本”,则程序执行为 s 脚本
  • 如果输出指示二进制(ELF shared object 或类似):
  • 运行 'ldd /bin/sh`
  • 如果输出包含“libstdc++.so” - 代码包含一些 c++ - 最像 C++ 源代码
  • 如果输出包含“libc.so.” - 程序包含一些 c - 最像 C 程序
owner@vm1:~/Projects/SO/ff1$ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=452da38d6212b692cd80eb0dd1c99cf853da31ae, stripped
owner@vm1:~/Projects/SO/ff1$ ldd /bin/bash
    linux-vdso.so.1 (0x00007ffcb87fe000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5e7cd8e000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5e7cb8a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e7c799000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5e7d2d2000)



wner@vm1:~/Projects/SO/ff1$ file /usr/bin/zlib-flate 
/usr/bin/zlib-flate: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=bbc1bc3fbbb71c7ae3cf9ef9f2876098df3fd752, stripped
owner@vm1:~/Projects/SO/ff1$ ldd !$
ldd /usr/bin/zlib-flate
    linux-vdso.so.1 (0x00007fffeb3be000)
    libqpdf.so.21 => /usr/lib/x86_64-linux-gnu/libqpdf.so.21 (0x00007f2f8ee45000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2f8eabc000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2f8e8a4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2f8e4b3000)
    libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f2f8e24b000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2f8e02e000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2f8dc90000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2f8f313000)

注意: * 从技术上讲,可以使用静态链接“欺骗”这种逻辑,但大多数(所有)二进制文件都将使用动态链接。

【讨论】:

  • macOS 上ldd 的类似物是otool -L;主系统库是usr/lib/libSystem.B.dylib。
猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多