*本文原創作者:question,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
前言
最近迷上了無人機,買了各種飛控 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裡的彩蛋
看到了部分AR的遊戲功能程式碼,這是支援對戰模式了麼?