binfmt_misc

一:binfmt_misc是什麼

  binfmt_misc是內核中的一個功能,它能將非本機的二進制文件與特定的解析器自動匹配起來,進行二進制解析。

       例如,在x86上解析arm64架構的二進制。

       通過binfmt_misc可以註冊解析器來處理指定二進制文件格式的請求。這些解析器可以是本地可執行文件,也可以是跨平臺(ARM、MIPS)可執行文件。

二:怎麼使用binfmt_misc

2.1.註冊解析器 

  註冊解析器的目的是爲了讓Linux在執行特定格式的二進制時,能夠識別並自動選擇相應的解析器來處理。

1.掛載

  首先需要掛載 binfmt_misc,並使用`mount`命令將`binfmt_misc`文件掛載到/proc/sys/fs/binfmt_misc/。

mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

2.創建解析器配置文件

      在 /proc/sys/fs/binfmt_misc/ 目錄下,可以創建一個配置文件,命名爲 register,其中 register是要註冊的二進制文件格式的標識符。

 

3.註冊

  在解釋器配置文件中,可以使用 echo 命令將相應的配置信息寫入。這些配置信息指定了二進制文件格式的特徵、解釋器的路徑以及其他相關參數。例如,對於 Windows 可執行文件的解釋器配置,可以指定其魔術數字、解釋器的路徑等。

  使用`echo`命令向`/proc/sys/fs/binfmt_misc/ `目錄中的特定文件寫入配置信息,以註冊特定的二進制文件格式和解釋器。

     註冊格式::name:type:offset:magic:mask:interpreter:flags

#/usr/bin/qemu-arm64爲解析器程序的路徑
#magic爲\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
#mask爲\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm64-static:' > register

以下是這些字段的含義:

  • name:是一個標識符字符串。指定解析器的名稱或標識。在這個例子中,解析器的名稱爲"arm";
  • type:是識別類型。給予M魔法和E擴展。
  • offset:是文件中 magic/mask 的偏移量,以字節計算。默認爲 0 :name:type::magic...使用文件擴展名匹配時忽略。
  • magic:是 binfmt_misc 匹配的字節序列。魔術字符串可能包含十六進制編碼的字符,
  • mask:是一個(可選,默認爲所有 0xff)掩碼。
  • interpreter:是應該使用二進制文件作爲第一個參數調用的程序(指定完整路徑)
  • flags:這些標誌控制解析器的行爲和操作方式。下面是一些常見的 flags 標誌及其作用:
    O:覆蓋(Override)標誌。當多個解析器的匹配規則衝突時,使用具有此標誌的解析器進行匹配和執行。
    E:可執行文件標誌。指定解析器用於執行可執行文件的功能。
    F:開啓自動刷新標誌。當啓用此標誌時,每次訪問 register 文件時都會重新加載解析器配置。
    C:關閉自動刷新標誌。當關閉此標誌時,解析器配置只在系統啓動時加載一次,之後不會自動刷新。
    B:啓用解析器的特權執行。這將允許使用具有特權的解析器執行文件。
    M:啓用魔數驗證標誌。指定解析器在匹配時必須驗證魔數。
    注意事項:offset+size(magic) 必須小於 128,解釋器字符串不得超過 127 個字符

2.2.解析器是如何自動匹配

  在Linux中,內核通過魔術數字(Magic Nmuber)來識別特定的二進制文件格式。

  具體的識別過程如下:

  1. 內核讀取二進制文件的開頭部分的字節序列,通常是文件的前幾個字節。

  2. 內核將讀取到的字節序列與已註冊解釋器的魔術數字進行比對。

  3. 如果找到與魔術數字匹配的解釋器,則選擇該解釋器來處理該二進制文件。

  4. 如果沒有找到匹配的解釋器,內核將無法執行該二進制文件,並可能會返回錯誤。

2.3.怎麼獲取二進制的魔法數字

  在 Linux 終端中,可以使用 hexdump -C <binary_file>或xxd <binary_file>等命令行工具來查看二進制文件的內容。這些工具會顯示文件的十六進制表示,並可以幫助你找到文件開頭部分的魔數。

      案例如下:

  

2.4.子網掩碼的作用

  除了magic還有一個mask這個怎麼理解?

  mask的作用是屏蔽或過濾魔數中的某些位,將魔數與掩碼進行與運算,如果不想匹配魔數某些位,則再mask中將對應位設置爲0即可。

  掩碼的主要目的是允許對魔數進行更靈活的匹配。有時候,二進制文件的魔數中的某些位是可變的或不重要的,但其他位則必須匹配。通過定義一個掩碼來屏蔽那些不重要的位,可以提高匹配的靈活性。

2.5.魔數和掩碼的與運算

與運算規則如下:

  • 如果魔數和掩碼的對應位都爲1,結果位爲1。
  • 如果魔數和掩碼的對應位有一個爲0,結果位爲0。

  如果你想要通過按位與運算得到0表示不匹配,可以將掩碼中需要匹配的位設置爲1,不需要匹配的位設置爲0。這樣,在按位與運算時,如果魔數的對應位與掩碼的對應位都爲1,結果位爲1,否則爲0。如果按位與運算的結果爲0,表示魔數與掩碼不匹配。

  示例1:最終的按位與運算結果與原始的魔數值相同,即沒有發生變化。

  

   示例2:最終的按位與運算結果後6位全部爲0,則後6位不進行比較

  

 

2.6.與運算結果與註冊表中魔數對比

1.取註冊表魔數

  使用 cat 命令讀取 /proc/sys/fs/binfmt_misc/ 目錄下的相關文件。每個註冊表都以文件的形式存在該目錄中,文件名代表了對應的架構。例如,/proc/sys/fs/binfmt_misc/arm_64,表示 ARM 架構的註冊表。

     

2.對比

   案例1:如下圖,因爲與運算結果與註冊表魔數相同,則可以調用到對應註冊表中interpreter對應的解析器文件。

  

   案例2:如下圖,與運算結果的非0位與註冊表魔數結果相同, 則可以調用到對應註冊表中interpreter對應的解析器文件。

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章