
我正在(Windows)可執行檔中尋找某些字串。
首先我開始於
grep -a string file
因為它將二進位檔案視為文字檔案。問題是沒有整齊的輸出,換行符偶然發生(當正確的位元組按順序出現時)等。
所以我想我應該使用字串:
strings file | grep -i string
令我驚訝的是,「strings」找不到我使用「grep -a」找到的字串。然而,「字串」的優點在於它可以輸出在新行中找到的所有內容的每一項。
我如何才能兩全其美?這意味著我想真正找到所有內容,並獲得所發現內容的合理輸出。
答案1
找不到strings
與您的字串相同的模式很可能是由於strings
找到至少 4 個字元長的模式造成的和後面跟著一個不可列印的字元。來自man strings
GNU strings
:
For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.
除此之外,strings
預設僅掃描目標檔案的初始化和載入部分,這可能會進一步減少輸出的行數。
您可以嘗試-a
和-n
選項來更改該行為:
strings -n 1 -a file | grep -i string
這應該會給你更多的字串,並且可能是你所期望的。
我的可執行檔的輸出差異python
:
$ strings $(which python) | wc
31923 68075 474068
$ strings -n 1 $(which python) | wc
501231 531837 1541204
$ strings -n 1 -a $(which python) | wc
501398 531995 1541762
答案2
為什麼不:
grep -a string file | strings
strings
列印至少 4 個字元長的可列印字元序列。因此,如果您的grep
內容少於 4 個字符,則strings
首先透過 via 處理將導致它遺失。用於strings -n 1
將最小長度設為 1。