логотип проекта fl3xbl0w

Особенности Bowflex - fl3xbl0w

Выпущено 28 мая 2022 г.

Проект по реверс-инжинирингу. Начался с беговой дорожки Bowflex Treadmill 22, но в итоге был обобщен для любого Android-устройства, продаваемого компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn).

Файл /sdcard/Pictures/nautilus

При декомпиляции NautilusLauncher можно увидеть ссылки на этот конкретный путь:

// путь: com/nautilus/nautiluslauncher/LauncherService.java
public void run() {
  if (!new File("/sdcard/Pictures/nautilus").exists()) {
    LauncherService.access$000(LauncherService.this).disableAdbDebug();
    LauncherService.access$000(LauncherService.this).enterKioskMode();
    return;
  }
  LauncherService.access$000(LauncherService.this).enableAdbDebug();
}
// путь: com/nautilus/nautiluslauncher/MainActivity.java
protected void onCreate(Bundle bundle) {
  // ...
  if (!new File("/sdcard/Pictures/nautilus").exists()) {
    this.mPlatformControl.disableAdbDebug();
    this.mPlatformControl.enterKioskMode();
  } else {
    this.mPlatformControl.enableAdbDebug();
  }
  // ...
}

Эффект от размещения файла на его месте заключается в том, что NautilusLauncher будет активировать adb после каждой перезагрузки. Если файла НЕТ на месте, NautilusLauncher будет АКТИВНО ОТКЛЮЧАТЬ adb (если он был ранее включен).

Файл /sdcard/Nautilus/redbend/Credentials.txt

Похоже, что Red Bend Software (приобретенная Harman, теперь я понимаю, почему столько ссылок на KNOX) предоставляет услуги OTA для оборудования Nautilus. Я нашел некоторые ссылки на этот файл внутри com.redbend.client.apk.

package com.redbend.client;
public class Ipl {
  protected static final String AUTO_SELF_REG_FILE_PATH = "Credentials.txt";
  // ...
  public static int iplGetAutoSelfRegDomainInfo(Context context, String[] strArr) {
    // ...
    File file = new File("/sdcard/Nautilus/redbend/");
    if (!file.exists()) {
      file.mkdirs();
    }
    copyAssets(context, "Credentials.txt", file.getCanonicalPath());
    bufferedReader = new BufferedReader(new FileReader(new File(file.getAbsoluteFile(), "Credentials.txt")));
    // ...
  }
  // ...
}

Также в com.redbend.client.ClientService мы можем найти:

// ...
public class ClientService extends SmmService {
  // ...
  @Override // com.redbend.app.SmmService, android.app.Service
  public void onCreate() {
    // ...
    if (Ipl.iplGetAutoSelfRegDomainInfo(this, strArr) == 0) {
      sendEvent(new Event("D2B_AUTO_SELF_REG_INFO").addVar(new EventVar("DMA_VAR_AUTO_SELF_REG_DOMAIN_NAME", strArr[0])).addVar(new EventVar("DMA_VAR_AUTO_SELF_REG_DOMAIN_PIN", strArr[1])));
      }
    // ...
  }
  // ...
}

Исходя из этой информации, мы можем пометить содержимое файла /sdcard/Nautilus/redbend/Credentials.txt как:

Первая строка: DOMAIN_NAME
Вторая строка: DOMAIN_PIN

DOMAIN_PIN похоже на реальный пин-код, так как это шестизначное число.

Есть некоторые учетные данные в “Сети Red Bend” для ассоциации машины с определенным брендом/продуктом для OTA обновлений. Я надеюсь, что эти учетные данные ИДЕНТИЧНЫ для всего оборудования Nautilus. Файл включен в APK com.redbend.client и извлекается при установке.

Я нашел ссылки на com.redbend.client здесь, и мне показалось довольно забавным видеть его сбои в машине. Я надеюсь, что он не сбоит так часто в наших устройствах.

Монитор сердечного ритма Bluetooth

Это было довольно просто расшифровать. Имя Bluetooth появляется как CL831-xxxxxxx (номер скрыт) от CHILEAF.

При сканировании через nRF Connect, MAC-адрес устройства и некоторые ключевые данные были раскрыты:

Сердечный ритм:
UUID: 0x180D
Измерение сердечного ритма
UUID: 0x2A37

Это казалось довольно стандартным, и пост из сообщества Home Assistant уже разобрался в этом (не та же модель, но похоже, что монитор сердечного ритма использует стандартный протокол). Я создал файл конфигурации ESPHome здесь в качестве концепции:

Скриншот Home Assistant с монитором сердечного ритма
Перевод выполнен gpt-4-1106-preview

©2022-2024 Себастьян Барренечеа. Все права защищены.

Создано с использованием Astro v4.16.13.