GSM Sniffing入門之硬件篇

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網絡的各類概念在此以前一無所知,若是文章中有錯誤歡迎指正:) 

相關文章
相關標籤/搜索