前言
最近迷上了无人机, 买了各种飞控 DJI NAZA,CCD3,F3, 还不敢入手 pix(穷). 玩了一圈, 看到 dji 发布了一款可以编程的无人机 TELLO, 果断入手. 无奈玩厌倦了, SDK 只开放了起飞降落这些简单功能, 秉着搞事不怕事大的原则开始了装逼的道路.
0×01: 抓包
无人机支持 APP 控制, 手机通过 WIFI 连接无人机进行控制. 寄出上古神器 树莓派 3+kali+TLWN722N 开始了抓包之路.
我也是个菜鸟, 列下抓包命令 , 大神就不要笑话了:
1. 无线网卡进入监听模式
airmon-ng start wlan1
2. 扫描周边的 wifi 信号
airodump-ng wlan1mon
下面是扫描的结果
TELLO 是无人机释放的 wifi 信号 这里主要关心下信道
3. 修改无线网卡信道
iwconfig wlan1 channel 11
4. 打开 Wireshark 开始抓包
通过 app 遥控无人机进行了一个起飞降落后停止抓包 , 在手机上可以看到无人机的 IP 这个时候过滤下 IP 或者通过 SSID 进行过滤也可以, 我这里通过 IP 过滤: ip.src == 192.168.10.2 or ip.src == 192.168.10.1 (192.168.10.2 是手机获取到的 IP 地址)
可以看到 数据非常多大概看了下应该有:
手机给无人机发过去的控制数据包
无人机给手机发送的状态数据包 (电量, 高度等)
无人机给手机发送的图像数据包
控制数据包 : 使用 UDP 协议 端口是 8889 号端口, 数据长度 22 不是明文 ASCII.
对抓到的包如果要进行每个字段进行解密就要记录很多控制包, 比如不停的对飞机进行起飞降落, 抓包看那些值改变.
本人比较懒, 打算穿美特斯邦威.
0×02: 魔爪伸向 APP
apktool 资源反编译工具, 直接解压 apk 会导致 xml 乱码
dex2jar 源码反编译工具
jd-gui 源码查看工具
0×03: 控制部分代码预览
写过 Android app 的都知道 入口当然在 xml 里找了哈哈
AndroidManifest.xml
第一个箭头有个有趣的东西 百度定位服务, 应该是用来记录用户在哪里飞飞机的, 大家请准守国家法规.
第二个箭头是 app 启动入口, 感兴趣的自己去跟踪吧 我下面贴下关系的代码部分.
控制部分代码
全部的控制命令都会写到一个结构体, app 建立了个独立的线程去完成收发功能.
0×04: 命令发送部分代码
基本是很 java 的 UDP 通信代码, 我们主要看数据包组包部分.
0×05: 命令组包部分
这个是起飞命令的组包代码, 前面是一个数组初始化 然后把控制命令复制给数组. 这里有两个随机数算法应该是协议里的安全校验用的
第一个是 0-255 的乱序数组, 下面是算法 贴上来大家看看:
- //0-255 乱序列表
- public static final short[] a = { 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 };
- public static int a(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
- //paramArrayOfByte[0]=0xcc paramArrayOfByte[0]=0x58 paramArrayOfByte[0]=0x00 , 3 , 119)
- {
- int j = 0;
- int i = paramInt2;
- paramInt2 = j;
- while (paramInt1 != 0)
- {
- j = paramArrayOfByte[paramInt2] ^ i;
- i = j;
- if (j < 0) {
- i = j + 256;
- }
- i = a[i];
- paramInt2 += 1;
- paramInt1 -= 1;
- }
- return i;
- }
0×06: 验证
起飞命令里我们算出了数据格式 0xCC,0×58,0×00,0x7C,0×68,0×54,0×00
我们把数据放到 Wireshark 里过滤:
这里看到能过滤出一条数据, 证明这条命令是 OK 的.
0xFF:APP 里的彩蛋
来源: http://www.tuicool.com/articles/FziEVzI