GSM Sniffing入门之硬件篇

3个月前,听朋友介绍得知OsmocomBB项目。此前一直以为GSM Sniffing需要价格昂贵的专用设备,但osmocomBB的上手成本:一个25元左右的手机,外加一根USB转TTL的串口线,着实让我吃了一惊(我自己前后买了3台手机和2种串口线以测试稳定性,总共花了100元不到)

OsmocomBB教程想必很多人都看过了。写这篇文章的目的,一则是把我所遇到的问题列出来,避免以后或者其他人像我一样,被“2.5mm耳机没插到位”这种低级问题纠缠大半个月
另外,如果大家还在用GSM的2G网络,还是找机会换了吧,SMS协议在国内是明文传输的

相关链接:

https://github.com/osmocom/osmocom-bb

http://bb.osmocom.org/trac/wiki/TitleIndex

---------------------------------------------------------------------------------------------------

【第一部分-硬件篇:OsmocomBB环境准备与刷机】

一、硬件准备

工欲善其事,必先利其器。在开始编译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模块 也可以,使用前需要参考这里调整波特率

代码:

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模块,只有电源指示

3. C118数据线 (2.5mm耳机头 转 杜邦线)
   注意一头是2.5mm耳机孔的,另一边是杜邦线连接串口模块。手边有2.5mm耳机插头的可以自己做一个。淘宝只有一家卖这个线的(10¥),如果你买的是这个,请拆下电池盖观察耳机插孔是否插到位,建议买回来第一件事就是拿小刀把插头的外框狠狠的削掉一圈:

二、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。 

三、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网络的各种概念在此之前一无所知,如果文章中有错误欢迎指正:) 

时间: 2024-08-03 16:48:21

GSM Sniffing入门之硬件篇的相关文章

GSM Sniffing入门之软件篇:GSMTAP抓取与SMS(Short Message Service)

重点介绍如何利用50元左右的设备,抓包并还原SMS短信内容: ps:研究GSM Sniffing纯属个人兴趣,能抓SMS报文只是捡了个明文传输的漏子,切勿用于非法用途.就像sylvain说的,osmocomBB并不是为抓包而实现的,如果没有足够的GSM相关知识,想实现还原语音通话内容根本就无从下手. ---------------------------------------------------------------------------------------------------

土人AS入门教程语法篇

教程|入门教程|语法 AS 语法篇 ----------------------------------- 看过我的第一个教程--基础篇之后,现在你对AS的存在位子有了一定的概念了吧?如果还没有,那么去复习一下吧 土人系列AS入门教程--基础篇 接下来我要讲的是AS的语法. 首先要让大家明白的是: AS 语法的大小写是敏感的. 如: gotoAndPlay() 正确 gotoAndplay() 错误 . 关键字的拼写必须和语法一致,要做到很容易,因为在Flash的AS面板里面,关键字会有不一样的

逆向工程恶意软件入门(基础篇)

本文讲的是逆向工程恶意软件入门(基础篇), 前言 在这个系列文章中,我会向大家介绍逆向工程恶意软件的各个方面的知识.逆向工程恶意软件是一个很深奥和复杂的主题,因此很少有人掌握它,这也是这个领域的薪酬很高的主要原因. 在开始本文之前,我需要先阐述一个概念框架,并阐述与逆向工程恶意软件有关的一些策略和问题. 什么是逆向工程? 在本系列文章中,即使我无法访问源代码(通常是这种情况),我也将尝试确定该恶意软件的功能.在确定软件功能之后,我将尝试对其调整或在另一个恶意软件中重新构建相关功能. 逆向工程用于

JavaScript基础教程——入门必看篇_基础知识

JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题.     一. JavaScript 1.什么是JavaScript JavaScript是一种描述性语言,也是一种基于对象(Object)和事件驱动(Event Driven)的,并具有安全性的脚本语言. 2.JavaScript的特点 JavaScript主要用来向HTML页面添加交互行为. J

什么是docker Docker入门教程第一篇_docker

Docker是个新生的事物,概念类似虚拟化.网上关于Docker入门的东西已经很多了.不过本文探讨了Docker的特点.特性.原理,还介绍了具有中国特色的安装测试过程,另外还谈到了Docker的社区生态和Dockerfile,并使用Dockerfile构建一个nginx环境. 缘起 在几个月前听说Docker,但是一直没有时间去研究,前一段时间趁着azure免费试用,赶紧实验一下,但是卡在了ubuntu基础镜像的下载上(由于国内网络的特殊原因),所以也就搁浅了,这里把经验和体会分享一下. Doc

javascript入门教程基础篇_javascript技巧

一. 简介 1. 什么是javascript JavaScript 是网景(Netscape)公司开发的一种基于客户端浏览器.面向(基于)对象.事件驱动式的网页脚本语言. 2. 为什么要使用javascript 表单验证 网页特效 小游戏 Ajax 3.快速入门 在程序中,如果想编写js代码,有两种办法: 1)在html文件中,在一对script标记中,直接编写 <script language='javascript'> document.write('hello'); </scrip

Python 正则表达式入门(中级篇)_python

初级篇链接:http://www.jb51.net/article/99372.htm 上一篇我们说在这一篇里,我们会介绍子表达式,向前向后查找,回溯引用.到这一篇开始前除了回溯引用在一些场合不可替代以外,大部分情况下的正则表达式你应该都会写了. 1.子表达式 子表达式的概念特别好理解.其实它就是将几个字符的组合形式看做一个大的"字符".不好理解?举个栗子:我们要匹配类似IP地址这种形式的字符(暂且不考虑数值范围的合理性,这个留作学完之后的思考题吧).形如192.168.1.1这样的地

Oracle调优(入门及提高篇)

    在过去的十年中, Oracle 已经成为世界上最专业的数据库之一.对于 IT 专家来说,就是要确保利用 Oracle 的强大特性来提高他们公司的生产力.最有效的方法之一是通过 Oracle 调优.它有大量的调整参数和技术来改进你的 Oracle 数据库的性能.    Oracle 调优是一个复杂的主题.关于调优可以写整整一本书,不过,为了改善 Oracle 数据库的性能,有一些基本的概念是每个 Oracle DBA 都应该遵从的.    在这篇简介中,我们将简要地介绍以下的 Oracle

土人AS入门教程对象篇

对象|教程|入门教程 虽然AS不是真正的面向对象的编程,但是它也有对象的概念.这个概念贯穿整个AS的始终,所以,对对象的理解,比对语法或者其他的理解更为重要.现在开始吧: 首先,我们来了解一下路径,路径分两种:绝对路径和相对路径.做过html的朋友应该知道这个概念.但这里我还是要详细解释一下,我认为对路径的理解要深入,我初学的时候就是磕在路径上. 在讲路径之前,有必要先讲一下 .语法 : 举例说明,这里要表示房间里的桌子上的一本书,用 .语法这么表示: 房间.桌子.书 如果要再细到书上的页上面的