SCAT:信令收集和分析工具
SCAT是一個由python編寫的信令收集和分析工具,它會通過USB解析Qualcomm和Samsung基帶的診斷資訊,並生成包含蜂窩控制平面訊息的GSMTAP資料包流。
安裝要求
PC
目前僅在Linux上測試過,且多數為Ubuntu的各種衍生版本。Python版本不得低於python 3,另外還需要安裝以下外部模組:
要正確解碼SCAT生成的GSMTAP資料包,需要Wireshark 2.6.0或更高版本。對於老版本的Wireshark,我們提供了一個Wireshark Lua外掛來幫助其擴充套件GSMTAP解碼功能。SCAT使用的GSMTAP定義基於libosmocore 0.11.0。
智慧手機
蜂窩裝置必須通過USB暴露診斷埠。這主要取決於所使用的裝置,我們無法為所有裝置提供一個通用的解決方案。使用關鍵字(你的裝置名稱)qpst在網上搜索獲取,基於Qualcomm的智慧手機暴露診斷埠的方法。
三星:在撥號器中輸入*#0808#,選擇包含DM的任意USB模式條目;
韓版:在撥號器中輸入3197123580,密碼為9964127764320821。
2018年以後的某些版本的韌體,將會阻止使用上述程式碼訪問隱藏選單。目前並無解決方案。
LG:在撥號器中輸入277634#*#(TODO:USB測試選單的確切位置)
在某些LG裝置上,即使啟用USB測試模式診斷埠也不會在Linux中暴露。這是由於使用了多個USB裝置配置導致的;建議在此類裝置中更改當前USB配置的udev規則。
索尼:需要root。獲取一個有root許可權的adb shell,並輸入命令setprop persist.usb.eng 1。
Nexus:需要root。獲取一個有root許可權的adb shell,並輸入命令setprop sys.usb.config diag,adb。
不適用於Pixel裝置!
Sailfish OS:( TODO:如何修改usb-moded設定)
使用
雖然我們建議大家直接使用USB來訪問診斷埠,但如果你的智慧手機的診斷埠可以通過串列埠訪問,那也是個不錯的選擇。所有基於Qualcomm的智慧手機的qcserial核心模組並沒有包含有關診斷埠的資訊,而基於三星的智慧手機也沒有這樣的模組。
通過USB訪問基帶診斷:
$ scat.py -t qc -u -a 001:010 -i 2
-t qc 定義我們正在解析Qualcomm基帶。對於Samsung基帶需要將qc替換為sec,且需要我們手動提供型號,如下所示:
$ scat.py -t sec -m e333 -u -a 001:006 -i 2
可用型號型別如下:
-m cmc221s:CMC221S,用於早期的三星LTE調變解調器/智慧手機;
-m e303:調變解調器晶片Exynos Modem 303;
-m e333:調變解調器晶片Exynos Modem 333
較新的Exynos調變解調器可與-m e333選項一起使用,YMMV。
-u 指定我們通過USB訪問的診斷裝置
雖然有啟發式演算法可以確定連線的裝置,但還是建議大家能明確指定診斷節點的USB裝置地址和介面編號。-a 001:010 指定地址,該地址遵循lsusb命令中可見的相同語法。-i 2 指定診斷節點的介面編號,該編號也是特定於裝置的。
通過串列埠訪問基帶診斷:
$ scat.py -t qc -s /dev/ttyUSB0
將/dev/ttyUSB0替換為你的診斷裝置。
預設情況下,scat將包傳送到127.0.0.1,控制平面包作為gsmtap傳送到udp埠4729,使用者平面包作為ip傳送到udp埠47290。
使用Ctrl+C退出應用程式。
高階選項
可以使用-H 127.0.0.2開關更改傳送GSMTAP資料包的目的地。例如,以下命令將所有資料包傳送到127.0.0.2:
$ scat.py -t sec -m e333 -u -a 001:006 -i 2 -H 127.0.0.2
使用以下命令,以便能夠使用Wireshark輕鬆對其進行排序:
ifconfig ethUSB 127.0.0.2 netmask 255.255.255.0 up
sudo route add -net 127.0.0.0 netmask 255.255.255.0 gw 127.0.0.1
可以使用其他命令的輸出自動確定USB匯流排地址。以下示例適用於三星Galaxy S5 Mini:
val=$(lsusb | awk '/Samsung/ {print substr($4, 1, length($4)-1)}')
sudo ./scat.py -t sec -m e303 -u -a 001:$val -i 4 -H 127.0.0.2
已測試過的裝置
以下裝置已由作者和貢獻者進行測試:
裝置名稱/型號 | 處理器 | 基帶 | 必要引數 | 是/否需要root | |
---|---|---|---|---|---|
Nokia 8110 4G (TA-1048) | Snapdragon 205 MSM8905 | X5 | -t qc | Yes | |
Google Nexus 5 (LG-D821) | Snapdragon 800 MSM8974 | MDM9x25 | -t qc | Yes | |
Google Nexus 5X (LG-H791) | Snapdragon 808 MSM8992 | X10 | -t qc | Yes | |
Google Pixel 2 (G011A) | Snapdragon 835 MSM8998 | X16 | -t qc | Yes | 還需修改系統分割槽 |
LG G Flex 2 (LG-H955) | Snapdragon 810 MSM8994 | X10 | -t qc | No | |
Sierra Wireless EM7455 | - | X7 (MDM9635) | -t qc | - | |
Sony Xperia X (F5122) | Snapdragon 650 MSM8956 | X8 | -t qc | Yes | |
Samsung Galaxy S III LTE (SHW-M210K) | Exynos 4412 | CMC221S | -t sec -m cmc221s | No | |
Samsung Galaxy S4 LTE (GT-I9505) | Snapdragon APQ8064T | Qualcomm MDM9215 | -t qc | No | |
Samsung Galaxy S5 Mini (SM-G800F) | Exynos 3470 | Exynos Modem 303 | -t sec -m e303 | No | |
Samsung Galaxy S6 (SM-G920F) | Exynos 7420 | Exynos Modem 333 | -t sec -m e333 | No/Yes | |
Samsung Galaxy S6 Edge+ (SM-G928F) | Exynos 7420 | Exynos Modem 333 | -t sec -m e333 | No/Yes | |
Samsung Galaxy S8 (SM-G950F) | Exynos 8895 | Exynos Modem 355 | -t sec -m e333 | No/Yes |
注:以上列表並未列出所有基於Qualcomm的裝置。
已知錯誤
在某些Qualcomm裝置上,退出並多次啟動應用程式後初始化最終會掛起,並且不會顯示任何訊息。根本原因仍在調查中。解決方案:重啟智慧手機;
在某些三星裝置上,缺少EARFCN等元資料資訊或沒有出現控制平面訊息。如果遇到此類情況,請告知你的環境以獲取解決方案。
參考文獻
Byeongdo Hong,Shinjo Park,Hongil Kim,Dongkwan Kim,Hyunwook Hong,Hyunwoo Choi,Jean-Pierre Seifert,Sung-Ju Lee,Yongdae Kim。
窺視蜂窩圍牆花園 – 一種封閉式網路診斷方法 - IEEE Transactions on Mobile Computing(2018.2)