Outils pour utilisateurs

Outils du site


misc:miband

Xiaomi MiBand bracelet

L'application est disponible sur le Playstore : https://play.google.com/store/apps/details?id=com.xiaomi.hm.health&hl=fr_FR.

Extraction de l'apk :

[tlk:~/CTF/MiBand]$ adb shell pm list packages | grep xiaomi
package:com.xiaomi.hm.health
[tlk:~/CTF/MiBand]$ adb shell pm path com.xiaomi.hm.health                                                           
package:/data/app/com.xiaomi.hm.health-1/base.apk
[tlk:~/CTF/MiBand]$ adb pull /data/app/com.xiaomi.hm.health-1/base.apk
5592 KB/s (7210288 bytes in 1.258s)

On passe un coup d'apktool, de dex2jar, de procyon et on est prêt pour reverse tout ça :-)

Bluetooth services

J'ai développé une petite application android permettant de lire/écrire les différentes caractéristiques du bracelet : MibandGrepper. Vous trouverez ci-dessous le résumé de toutes ces caractéristiques. Certaines sont documentés officiellement https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx et communes à tous les équipements bluetooth low energy, d'autres sont spécifiques à ce bracelet. Le format de ces dernières a été retrouvé en reversant l'application android officielle.

Mili Service

UUID : 0000fee0-0000-1000-8000-00805f9b34fb

Battery infos characteristic

UUID : 0000ff0c-0000-1000-8000-00805f9b34fb

Droits : read

Contient la date de dernière charge, le nombre de charge, le niveau de batterie et le statut actuel de la charge. (10 octets en tout)

  • byte[0] : pourcentage de charge
  • byte[1] : année de la dernière charge (2000 + byte[1])
  • byte[2] : mois de la dernière charge
  • byte[3] : jour de la dernière charge
  • byte[4] : heure de la dernière charge
  • byte[5] : minutes de la dernière charge
  • byte[6] : secondes de la dernière charge
  • byte[7] et byte[8] : nombre de charge. byte[8] est l'octet de poids fort, et byte[7] celui de poids faible.
  • byte[9] : statut actuel de la charge

Device infos characteristic

UUID : 0000ff01-0000-1000-8000-00805f9b34fb

Droits : read

Contient les informations sur le produit. Identifiant, différentes versions … (16 octets en tout)

  • byte[0..7] : identifiant du device. Il y a une sorte de checksum entre le octets pour que cet identifiant soit valide.
    public static int checksum(final byte[] array) {
        int i = 0;
        int n = 0;
        while (i < array.length) {
            n ^= (0xFF & array[i]);
            for (int j = 0; j < 8; ++j) {
                if ((n & 0x1) != 0x0) {
                    n = (0x8C ^ (0xFF & n >> 1));
                }
                else {
                    n = (0xFF & n >> 1);
                }
            }
            ++i;
        }
        return n;
    }
 

La fonction est appelée sur les 7 premiers octets de l'identifiant. Le retour est xoré avec le 4eme octet. Le résultat final doit être égal au 8eme octet. Ca ressemble à un CRC8, mais je ne suis pas totalement sûr.

  • byte[8..11] : version du profile
  • byte[11..15] : version du firmware

Dans les numéros de version, le premier octet est la version majeure, le second la version mineure, le troisième la révision et le premier le numéro de build.

Device name characteristic

UUID : 0000ff02-0000-1000-8000-00805f9b34fb

Droits : read, write

Rien de spécial, les données répresentent le nom du device.

Notification characteristic

UUID : 0000ff03-0000-1000-8000-00805f9b34fb

Droits : notification

User infos characteristic

UUID : 0000ff04-0000-1000-8000-00805f9b34fb

Droits : read, write

Generic informations

UUID : 00001800-0000-1000-8000-00805f9b34fb

Generic attributes

UUID : 00001801-0000-1000-8000-00805f9b34fb

Immediate alert

UUID : 00001802-0000-1000-8000-00805f9b34fb

Firmware

Le firmware se trouve dans les assets de l'application : assets/Mili.fw. Il contient quelques chaines intéressantes :

RIVIERAWAVES-BLE
DA14580-01
*notify
realtimedata
Battery
fulldata
wx indicate

DA14580-01 permet de vérifier ce qui est dit sur le site : http://www.mi.com/my/miband/#08

The DA14580 low-energy Bluetooth 4.0 chip manufactured by Dialog can run
for over 4 years on a single 225mAh button power cell. This incredibly
low energy consumption means Mi Band can go up to 30 days between charges.

J'ai réussi à trouver toutes les documentations directement sur le site du constructeur : http://support.dialog-semiconductor.com/. Il faut cependant s'inscrire et se faire valider son compte, dites que vous êtes étudiant et ça passera ;-) Vous aurez alors accès à toutes les docs et au … SDK !!

Je n'ai pas fais plus de recherches que ça sur le firmware, ça devrait arriver une fois la partie bluetooth finie ;)

misc/miband.txt · Dernière modification: 2015/02/18 15:08 par tlk