1. 程式人生 > >Linux下分析bin檔案的10種方法

Linux下分析bin檔案的10種方法

> 這世界有10種人,一種人懂二進位制,另一種人不懂二進位制。 ——魯迅 大家好,我是良許。 二進位制檔案是我們幾乎每天都需要打交道的檔案型別,但很少人知道他們的工作原理。這裡所講的二進位制檔案,是指一些可執行檔案,包括你天天要使用的 Linux 命令,也是二進位制檔案的一種。 Linux 系統給我們提供了非常多用於分析二進位制檔案的工具,不管你在 Linux 下從事的是何種工作,知道這些工具也會讓你對你的系統更加了解。 在本文中,將介紹幾種最常用的用於分析二進位制檔案的工具及命令,這些工具在大部分發行版裡可以直接使用,如果不能直接用的話,可以自行安裝。 #### file `file 命令用於分析檔案的型別。` 如果你需要分析二進位制檔案,可以首先使用 file 命令來切入。我們知道,在 Linux 下,`一切皆檔案`,但並不是所有的檔案都具有可執行性,我們還有各種各樣的檔案,比如:文字檔案,管道檔案,連結檔案,socket檔案,等等。 在對一個檔案進行分析之前,我們可以首先使用 file 命令來分析它們的型別。當然除此之外,我們還可以看到一些其它資訊。 ``` $ file /bin/pwd /bin/pwd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0d264bacf2adc568f0e21cbcc9576df434c44380, stripped ``` #### ldd `ldd 命令可以用於分析可執行檔案的依賴`。 我們使用 file 命令來分析一個可執行檔案的時候,有時候可以看到輸出中有 `dynamically linked` 這樣的字眼。這個是啥意思呢? 大部分程式,都會使用到第三方庫,這樣就可以不用重複造輪子,節約大量時間。最簡單的,我們寫C程式程式碼的話,肯定會使用到 `libc` 或者 `glibc` 庫。當然,除此之外,還可能使用其它的庫。 那我們在什麼情況下需要分析程式的依賴庫呢?有一個場景大家肯定經歷過。你去你同事那邊拷備他寫好的程式放到自己的環境下執行,有時候可能會跑不起來。當然跑不起來的原因可能很多,但其中一個原因可能就是缺少對應的依賴庫。 這時候,ldd 就派上用場了。它可以分析程式需要一些什麼依賴庫,你只要把對應的庫放在對應的位置就可以了。 ``` $ ldd /bin/pwd linux-vdso.so.1 => (0x00007ffeb73e5000) libc.so.6 => /lib64/libc.so.6 (0x00007f908b321000) /lib64/ld-linux-x86-64.so.2 (0x00007f908b6ef000) ``` #### ltrace `ltrace的功能是能夠跟蹤程序的庫函式呼叫。` 我們可以使用 ldd 命令來找到程式的依賴庫,但是,一個庫裡少則幾個,多則幾千個函式,怎麼知道現在程式呼叫的是什麼函式呢? `ltrace` 命令就是用來做這個事的。在下面的例子裡,我們可以看到程式呼叫的函式,以及傳遞進去的引數,同時你也可以看到函式呼叫的輸出。 ``` $ ltrace /bin/pwd __libc_start_main(0x401760, 1, 0x7ffff6524cc8, 0x404a00