3個月前,聽朋友介紹得知OsmocomBB項目。此前一直覺得GSM Sniffing須要價格昂貴的專用設備,但osmocomBB的上手成本:一個25元左右的手機,外加一根USB轉TTL的串口線,着實讓我吃了一驚(我本身先後買了3臺手機和2種串口線以測試穩定性,總共花了100元不到)linux
OsmocomBB教程想必不少人都看過了。寫這篇文章的目的,一則是把我所遇到的問題列出來,避免之後或者其餘人像我同樣,被「2.5mm耳機沒插到位」這種低級問題糾纏大半個月
另外,若是你們還在用GSM的2G網絡,仍是找機會換了吧,SMS協議在國內是明文傳輸的git
相關連接:github
http://bb.osmocom.org/trac/wiki/TitleIndex網絡
---------------------------------------------------------------------------------------------------svn
【第一部分-硬件篇:OsmocomBB環境準備與刷機】工具
1、硬件準備
工欲善其事,必先利其器。在開始編譯osmocomBB前,須要瞭解運行osmocomBB須要些什麼東西:
1. Moto C118
osmocomBB支持不少型號的手機,具體能夠在官網查到:http://bb.osmocom.org/trac/wiki/Hardware/Phones
咱們的目標C118,也就是官網首推的E88系列:MotorolaC123/C121/C118 (E88) -- our primary target
你問C118有啥優點?出了官方說的支持最好,這玩意另外一個優點是便宜。機器沒什麼講究,直接淘寶選最便宜的買就好了;國產系統爲中文,測試同樣能夠正常刷機。我買的機器+電池+線充(或者直接用萬能充)一塊兒30元。另外若是隻有1臺不建議買裸機,這個的電池徹底配不到,當時我是找人30作了塊才點亮機器的...
2. USB轉串口模塊
推薦帶TX/RX LED的 FT232模塊,雖然價格略貴(淘寶上最便宜的大概28),但有指示燈能夠清楚看到是否有數據傳輸,方便定位問題。
FT232模塊測試
CP2102模塊 也能夠,使用前須要參考這裏調整波特率ui
sudo ./cp210x-program -p -F eeprom.hex -w --set-baudrate 812500:FFE2,FFF4,1 --set-baudrate 406250:FFC5,FFE9,1 --set-baudrate 203125:FF8A,FFD3,1
用cp210x-program工具看到輸出裏有 800000 Baud, 406780 Baud, 203390 Baud, 115385 Baud 這幾個波特率就可使用了
CP2102模塊,只有電源指示this
3. C118數據線 (2.5mm耳機頭 轉 杜邦線)
注意一頭是2.5mm耳機孔的,另外一邊是杜邦線鏈接串口模塊。手邊有2.5mm耳機插頭的能夠本身作一個。淘寶只有一家賣這個線的(10¥),若是你買的是這個,請拆下電池蓋觀察耳機插孔是否插到位,建議買回來第一件事就是拿小刀把插頭的外框狠狠的削掉一圈:spa
2、ArchLinux下編譯osmocomBB
(網上其餘linux編譯的教程不少,若是不是用的Arch能夠跳過這個部分,參考其餘教程完成osmocomBB編譯)
0. 首先將texinfo替換成4.13a,源裏面texinfo5會致使gcc的文檔沒法編譯
cd ~ svn checkout --depth=empty svn://svn.archlinux.org/packages arch_packages cd arch_packages svn update texinfo -r176043 cd texinfo/repos/core-i686 makepkg
安裝編譯好的texinfo-4.13a:
sudo pacman -U texinfo-4.13a-7-i686.pkg.tar.xz
1. 安裝libosmocore:http://bb.osmocom.org/trac/wiki/libosmocore
cd ~ git clone git://git.osmocom.org/libosmocore.git cd libosmocore/ # autoreconf -i (not working)
Arch下autoreconf怎麼都過不了,直接無視之繼續編譯,後面再修復libosmocore.so.4找不到的問題
代碼:
sudo ldconfig sudo cp -Rf /usr/local/lib/* /usr/lib/
2. 編譯arm-toolchain:http://bb.osmocom.org/trac/wiki/GnuArmToolchain
代碼:
cd ~ mkdir arm_toolchain cd arm_toolchain wget http://bb.osmocom.org/trac/raw-attachment/wiki/GnuArmToolchain/gnu-arm-build.2.sh chmod +x gnu-arm-build.2.sh mkdir build install src
這是官方推薦的gcc版本,速度太慢能夠用迅雷拖下來放到src目錄裏:
cd src/ wget http://ftp.gnu.org/gnu/gcc/gcc-4.5.2/gcc-4.5.2.tar.bz2 wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.1a.tar.bz2 wget ftp://sources.redhat.com/pub/newlib/newlib-1.19.0.tar.gz
開始編譯arm的交叉編譯工具:
cd .. ./gnu-arm-build.2.sh I will build an arm-elf cross-compiler: Prefix: /root/arm_toolchain/install Sources: /root/arm_toolchain/src Build files: /root/arm_toolchain/build Press ^C now if you do NOT want to do this.
按回車繼續,時間比較長能夠先去喝杯咖啡
Build complete! Add /root/arm_toolchain/install/bin to your PATH to make arm-elf-gcc and friends
accessible directly.
編譯完成,按照提示導出安裝目錄:
export PATH=$PATH:/root/arm_toolchain/install/bin
3. 編譯osmocom-bb
git clone git://git.osmocom.org/osmocom-bb.git cd osmocom-bb git pull --rebase git checkout -b gsmmap remotes/origin/luca/gsmmap
不建議用 remotes/origin/sylvain/testing 分支,這個分支不太穩定,刷機幾回才能搜到1次信號
若是想插上SIM卡用mobile發短信,記得打開layer1的TX發送功能:
vi src/target/firmware/Makefile # Uncomment this line if you want to enable Tx (Transmit) Support. CFLAGS +=-DCONFIG_TX_ENABLE
最後編譯osmocomBB:
cd src
make
編譯成功後,參考osmocon的教程,就能夠開始對C118進行軟刷機了:
http://bb.osmocom.org/trac/wiki/osmocon
代碼:
0. 準備配置文件目錄 $ sudo mkdir /etc/osmocom/ $ sudo touch /etc/osmocom/osmocom.cfg 1. Connect your phone 2. Choose firmware (../../target/firmware/board/compal_e88/layer1.compalram.bin) 3. Load firmware $ cd host/osmocon/ $ ./osmocon -p /dev/ttyUSB0 -m c123xor ../../target/firmware/board/compal_e88/layer1.compalram.bin 4. 運行mobile,開啓新的終端 $ cd layer23/src/mobile $ ./mobile -i 127.0.0.1 5. 用wireshark抓包 $ sudo wireshark -k -i lo -f 'port 4729'
mobile完成的是普通電話的交互操做;相對的,在host/layer23的misc文件夾裏,還有cell_log,ccch_scan等工具能夠幫助抓取GSMTAP。
注意:使用cell_log和ccch_scan時,有個 GSM ARFCN 參數,這個是用於選擇小區中頻道的。若是選錯了頻道,會提示 result = 255(這個按mail list的說法是頻道中沒有收到控制響應)
用bcch_scan能夠獲得當前位置信號較強的幾個頻道編號,固然也能夠經過mobile的輸出肯定最強的ARFCN,而後使用 -a 參數傳遞給ccch_scan來捕捉其上的GSMTAP。
3、osmocomBB刷機及常見故障排除
爲杜絕一切鏈接引發的疑難雜症,刷機前先確認USB轉TTL模塊沒有問題。
用一根杜邦線,把模塊的TX/RX兩個pin腳短接。
把模塊插到USB口上,此時模塊的電源LED亮起,輸入 lsusb 查看模塊的鏈接狀況:
[root@ArchDev ~]# lsusb Bus 001 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
說明FT232模塊已經被正確識別。dmesg也能看到相似的輸出
[ 3939.433684] usb 1-1: Detected FT232RL [ 3939.433691] usb 1-1: Number of endpoints 2 [ 3939.433697] usb 1-1: Endpoint 1 MaxPacketSize 64 [ 3939.433703] usb 1-1: Endpoint 2 MaxPacketSize 64 [ 3939.433708] usb 1-1: Setting MaxPacketSize 64 [ 3939.442346] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
CP2102模塊的話,輸出稍有不一樣:
# lsusb Bus 001 Device 003: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light # dmesg [ 3421.303602] cp210x 1-1:1.0: cp210x converter detected [ 3421.554407] usb 1-1: reset full-speed USB device number 3 using uhci_hcd [ 3421.703370] usb 1-1: cp210x converter now attached to ttyUSB0
此時使用終端工具以115385波特率鏈接ttyUSB0設備(有些機器是ttyUSB1,能夠經過上面dmesg輸出肯定)。鏈接後,任何鍵入字符,應該能正確顯示在終端上。
下面以minicom爲例:
sudo pacman -S minicom (或者apt-get install minicom) sudo minicom -D /dev/ttyUSB0 -b 115385 -s
在對話框中選擇"Serial port setup",按F鍵關閉"Hardware Flow Control",最終配置如圖所示:
按回車並選"Exit"進入minicom主界面(固然也能夠保存下配置),鍵盤隨便敲些字符。可以成功顯示鍵入字符,說明模塊的TX/RX均正常,能夠鏈接機器了。按Ctrl-A接着按Z,按X退出minicom
拔下模塊接上刷機線,黑線接GND,紅色和白色分別接TXD和RXD。TX/RX常常會弄反,這裏LED指示燈就能派上用場了
sudo minicom -D /dev/ttyUSB0 -b 115385 -s
像剛纔同樣關掉"Hardware Flow Control"進入,將C118關機並短按電源鍵,鏈接正常的話會顯示下面的內容先顯示ftmtool,接着大約1秒後輸出error,看到這個說明鏈接無誤。
已經成功了一半,下面祈禱C118的硬件沒有故障。
參考osmocon的使用教程http://bb.osmocom.org/trac/wiki/osmocon
先爲osmocom建立配置文件
sudo mkdir /etc/osmocom/
sudo touch /etc/osmocom/osmocom.cfg
接着確認機器型號,C118是compal_e88的固件,使用osmocon須要刷入layer1,位於
src/target/firmware/board/compal_e88/layer1.compalram.bin
代碼:
cd ~/osmocom-bb/src/
cd host/osmocon/ # 一些在電腦上運行的工具都在host目錄下
使用下面命令啓動osmocon等待刷機:
sudo ./osmocon -p /dev/ttyUSB0 -m c123xor ../../target/firmware/board/compal_e88/layer1.compalram.bin
此時確保C118在關機狀態,將刷機線插到底後,短按電源鍵:
got 1 bytes from modem, data looks like: 04 . got 1 bytes from modem, data looks like: 81 . got 4 bytes from modem, data looks like: 1b f6 02 00 .... got 1 bytes from modem, data looks like: 41 A got 1 bytes from modem, data looks like: 01 . got 1 bytes from modem, data looks like: 40 @ Received PROMPT1 from phone, responding with CMD read_file(../../target/firmware/board/compal_e88/layer1.compalram.bin): file_size=55940, hdr_len=4, dnload_len=55947 got 1 bytes from modem, data looks like: 1b . got 1 bytes from modem, data looks like: f6 . got 1 bytes from modem, data looks like: 02 . got 1 bytes from modem, data looks like: 00 . got 1 bytes from modem, data looks like: 41 A got 1 bytes from modem, data looks like: 02 . got 1 bytes from modem, data looks like: 43 C Received PROMPT2 from phone, starting download handle_write(): 4096 bytes (4096/55947) handle_write(): 4096 bytes (8192/55947) handle_write(): 4096 bytes (12288/55947) handle_write(): 4096 bytes (16384/55947) handle_write(): 4096 bytes (20480/55947) handle_write(): 4096 bytes (24576/55947) handle_write(): 4096 bytes (28672/55947) handle_write(): 4096 bytes (32768/55947) handle_write(): 4096 bytes (36864/55947) handle_write(): 4096 bytes (40960/55947) handle_write(): 4096 bytes (45056/55947) handle_write(): 4096 bytes (49152/55947) handle_write(): 4096 bytes (53248/55947) handle_write(): 2699 bytes (55947/55947) handle_write(): finished
上面步驟一切正常的狀況下,會看到DOWNLOAD ACK和OSMOCOM Layer 1的提示,此時C118屏幕上已經顯示出layer1的界面了:
代碼:
got 1 bytes from modem, data looks like: 1b . got 1 bytes from modem, data looks like: f6 . got 1 bytes from modem, data looks like: 02 . got 1 bytes from modem, data looks like: 00 . got 1 bytes from modem, data looks like: 41 A got 1 bytes from modem, data looks like: 03 . got 1 bytes from modem, data looks like: 42 B Received DOWNLOAD ACK from phone, your code is running now! battery_compal_e88_init: starting up OSMOCOM Layer 1 (revision osmocon_v0.0.0-1351-g074c78a-modified)
由於是軟刷,按電源鍵大約2秒會關機。關機後須要從新執行上面操做刷入layer1
若是想把固件燒入手機中,能夠參考這裏:http://bb.osmocom.org/trac/wiki/flashing_new
也許是版本問題,在個人機器上老是提示crc錯誤。想一想刷完這個還不能用直充充電,仍是每次用以前軟刷好了。
----------------------------------------------------------------------------------------
然而,不是事事都那麼順利。我有幸買到一臺有問題的C118,斷電後第一次刷機,老是沒法收到DOWNLOAD ACK,直接卡死在handle_write(): finished這裏。此時屏幕不亮短按電源鍵也沒有任何反應:
雖然不是Android系統,同樣能夠祭出Android三寶絕招——拔電池。從新插上電池後,短按電源從新刷入,正常看到OSMOCOM Layer 1的提示(建議遇到各類非線纜相關的疑難雜症,都先嚐試下拔電池重刷,這個好像是osmocom不穩定致使的)
另外,這裏說下我以前犯的一個低級錯誤:模塊和鏈接都確認沒問題,但按電源鍵確輸出一堆亂碼。
這個網上Google了很久都沒有結果,甚至mail list裏還有哥們說是手機的接收模塊燒了。結果最後賣家發來張圖片:(抱歉旺信丟消息了,圖片找不到了大體就是紅圈這裏,沒有插到位)
打開電池後蓋才發現,若是不用小刀狠狠削掉一圈,這個數據線根本無法插到底。(微博上也看到2個同窗遇到相同的問題,看來數據線都是同一家買的-_-b)
另一種狀況是隻收到PROMPT1後,就出現ftmtool error了。網上有種說法是主機的時鐘頻率太慢(好比在虛擬機裏跑osmocon),致使沒有發完就超時了。但我專門用VMWARE測試,並無遇到這樣的問題。
我的理解是osmocomBB的刷機不穩定,遇到這種狀況請先檢查是否用了burst_ind分支(也就是sylvain/testing),我以前就由於用的這份老代碼,致使刷一下午只有1-2次能成功。另外還能夠把-m c123xor換成-m c123試試,有時候去掉xor方式後能夠正常刷進去。更新libosmocore並換成luca/gsmmap分支後,就再也沒有遇到這個狀況了。我並不是通訊專業出身,GSM網絡的各類概念在此以前一無所知,若是文章中有錯誤歡迎指正:)