DJI tello大疆无人机通信协议破解测试 – 作者:question

*本文原创作者:question,本文属FreeBuf原创奖励计划,未经许可禁止转载

前言

最近迷上了无人机,买了各种飞控 DJI NAZA,CCD3,F3,还不敢入手pix(穷)。玩了一圈,看到dji发布了一款可以编程的无人机TELLO,果断入手。无奈玩厌倦了,SDK只开放了起飞降落这些简单功能,秉着搞事不怕事大的原则开始了装逼的道路。

1.png

0x01:抓包

无人机支持APP控制,手机通过WIFI连接无人机进行控制。寄出上古神器 树莓派3+kali+TLWN722N开始了抓包之路。

我也是个菜鸟,列下抓包命令 ,大神就不要笑话了:

1.无线网卡进入监听模式

airmon-ng start wlan1

2.扫描周边的wifi信号

airodump-ng wlan1mon

下面是扫描的结果

image.png

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地址)

image.png

可以看到 数据非常多大概看了下应该有:

1.手机给无人机发过去的控制数据包 

2.无人机给手机发送的状态数据包(电量,高度等)

3.无人机给手机发送的图像数据包

控制数据包 :使用UDP协议 端口是8889号端口,数据长度22 不是明文ASCII。

image.png

对抓到的包如果要进行每个字段进行解密就要记录很多控制包,比如不停的对飞机进行起飞降落,抓包看那些值改变。

本人比较懒,打算穿美特斯邦威。

0x02:魔爪伸向APP

apktool 资源反编译工具,直接解压apk会导致xml乱码

dex2jar 源码反编译工具

jd-gui 源码查看工具

0x03:控制部分代码预览

写过Android app的都知道 入口当然在xml里找了哈哈

AndroidManifest.xml

image.png

第一个箭头有个有趣的东西 百度定位服务,应该是用来记录用户在哪里飞飞机的,大家请准守国家法规。

第二个箭头是app启动入口,感兴趣的自己去跟踪吧 我下面贴下关系的代码部分。

控制部分代码

image.png

全部的控制命令都会写到一个结构体,app建立了个独立的线程去完成收发功能。

0x04:命令发送部分代码

基本是很java的UDP通信代码,我们主要看数据包组包部分。

image.png

0x05:命令组包部分

image.png

这个是起飞命令的组包代码,前面是一个数组初始化 然后把控制命令复制给数组。这里有两个随机数算法应该是协议里的安全校验用的

第一个是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;
  }

0x06:验证

起飞命令里我们算出了数据格式 0xCC,0x58,0x00,0x7C,0x68,0x54,0x00

我们把数据放到Wireshark里过滤:

image.png

这里看到能过滤出一条数据,证明这条命令是OK的。

0xFF:APP里的彩蛋

image.png

image.png

看到了部分AR的游戏功能代码,这是支持对战模式了么?

*本文原创作者:question,本文属FreeBuf原创奖励计划,未经许可禁止转载

来源:freebuf.com 2018-04-08 09:30:09 by: question

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论