Como os alunos das escolas Hackathon da NASA fazem engenharia reversa de uma pulseira de fitness para controlar um drone



Há um ano, comprei um rastreador de fitness SONY SmartBand SWR10. Como a maioria dos outros rastreadores de fitness, o gadget não teve um grande papel na minha vida, sua principal ocupação estava na minha mesa. No entanto, este é um dispositivo eletrônico interessante e, quando um amigo me convidou para fazer parte de sua equipe no hackathon da NASA Space Apps , decidi usar o rastreador. Selecionamos a seção Não trava meu drone, onde é necessário criar uma solução para controlar o drone. Foi decidido usar este rastreador para controlar o drone.



Assim que o hackathon começou, comecei a procurar a API do meu bracelete ou ferramentas para desenvolvedores, mas nada foi encontrado. Alguns usuários do fórum disseram que a SONY possui um SDK proprietário, concedido a desenvolvedores que decidiram cooperar com a empresa, mas, nos termos do hackathon, somente soluções de código aberto poderiam ser usadas. Então decidi que era hora de criar minha própria interface de controle de drones. Iniciei o aplicativo rastreador e ativei a função “Bluetooth HCI snoop log”. Esse recurso permitiu detectar o tráfego e salvar o despejo no cartão SD.

Encontrei o log:
~ adb shell echo $ EXTERNAL_STORAGE
/ sdcard
~ adb pull /sdcard/btsnoop_hci.log


e o abri no WireShark:



Parece que a transferência de dados foi realizada usando o protocolo Bluetooth Low Energy, ou, mais precisamente, via protocolo GATT . Trata-se de uma transferência de dados bidirecional, na qual o telefone atua como servidor, “Servidor GATT”, e os periféricos recebem “Características GATT”, que podem conter dados binários.

Selecionei o primeiro UUID (00000208–37cb-11e3–8682–0002a5d5c51b) e procurei no Google. Eu esperava encontrar o serviço GATT padronizado usual, mas encontrei algo mais interessante .

Decidi que descobrimos o repositório Git de alguém criado por uma pessoa que fez a engenharia reversa do protocolo. E isso era parcialmente verdadeiro: o projeto continha várias funções de trabalho, incluindo conectar, responder aos movimentos das mãos, ler o status da bateria e manter a conexão ativa. Mas a implementação do acelerômetro foi estranha. Adicionei os dados do acelerômetro ao MPAndroidChart e obtive o seguinte:



Embora as informações nas pistas estivessem corretas, os valores não foram exibidos. Depois de estudar o código da função, verificou-se que o número de precisão única de 32 bits continha três valores de 10 bits. Isso faz sentido, uma vez que a maioria dos acelerômetros trabalha com precisão de 10 bits (como a maioria dos ADCs, conversores de analógico para digital). Aqui estão os dados de origem, preste atenção nos dois primeiros bits:

dados ACC: 0b00101110 0b10110101 0b10111100 0b10111000
dados ACC: 0b00111010 0b11110001 0b00011101 0b11101011
dados ACC: 0b00111110 0b01110110 0b10100110 0b10011001
dados ACC: 0b00001011 0b11011101 0b10111101 0b00111001


Mas a análise de dados como os três valores de 10 bits foi bastante estranho, a cada poucos graus de inclinação mudou valor 511 a -512, e o deslocamento não foi alterado (além disso, não havia problema de estouro de número inteiro aqui). Então, decidi que a SONY poderia usar algum tipo de método de empacotamento binário proprietário ou a empresa usaria codificação e compressão aritmética.

Eu tentei Protobuf, MsgPack, Thrift e vários analisadores, mas nada funcionou. Eu só tinha um dia para conectar meu dispositivo ao Wi-Fi do drone. Já desesperado, tentei a descompilação DEX do aplicativo da empresa e, após meia hora, ocorreu o seguinte:

// Aproximadamente
1: iconst_0 512 iconst_1 1023
2: r1 xor iconst_0
3: istore_0
4: iload_0
5: ifneq 8
6: r1 xor iconst_1
7: istore_0


if ((dados & 0x200)! = 0) {
dados = - ((dados ^ 1023) + 1);
}
return (((float) (-data)) * 15.625f) / GRAVITY_FACTOR;


A primeira metade [0, 512] foi invertida e, portanto, surgiu a situação descrita acima. Corrigi-o usando XOR regular e funcionou. Eu adicionei o fator de gravidade, com o resultado [-1,1] para ± 1 g, e tudo o que precisava ser feito a seguir era usar os dados do acelerômetro para controlar o drone.

Source: https://habr.com/ru/post/pt394095/


All Articles