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网络的各类概念在此以前一无所知,若是文章中有错误欢迎指正:)