Сегодня мы представляем на рассмотрение устройство, призванное облегчить нашу жизнь.
Это устройство предназначено для управления освещением.
При подключении RGB-диодов можно управлять цветом и яркостью, а при подключении одноцветных диодных ламп — только яркостью.
В последнем случае 3 цветовых канала могут использоваться отдельно.
Кроме того, устройство имеет несколько режимов, устанавливающих либо постоянное свечение, либо мигание.
Питание устройства от 5 до 24 вольт. Устройство выдает на каналы одинаковое напряжение.
Технические характеристики:
Максимальная нагрузка: 288 Вт
Пульт дистанционного управления: 50 м
Модель: Wi-Fi контроллер WIFI100
Однако после включения моя жизнь не стала легче.
Напротив, все стало сложнее.
Причиной тому стало входящее в комплект приложение MagicColor v1.0. Несмотря на то, что эта программа работала на телефонах HTC и LG, на моих устройствах Samsung Galaxy Note 10.1 и Galaxy Nexus она не работала, что заставило ее немного разобрать, а вместе с ней и сам замечательный аппарат. Первое, что было установлено, о чем не было упомянуто в инструкции, это наличие WEB-интерфейса с логином:admin и паролем 1234, что меня конечно порадовало.
Как видно из скриншотов, по умолчанию устройство работает в режиме Ad hoc с незащищенным доступом к сети.
Протокол по умолчанию — TCP и порт 5000.
Надо сказать, что эта ситуация меня никак не устраивала.
Во-первых, безопасность есть, ее просто не существует. Любой может получить доступ к этому устройству.
Во-вторых, хотелось бы видеть это устройство в своей домашней сети, в которой уже есть свой DHCP-сервер и защита от внешних атак.
К сожалению, MagicColor не имеет возможности изменить IP-адрес устройства.
Кроме того, как выяснилось позже, программа проверяет имя сети ssid. Теперь давайте разберемся с программой.
Я использовал APK Manager v.4.9, чтобы извлечь файл MagicColor.apk. Для этого просто скопируйте .
apk в папку «place-apk-here-for-modding» и запустите скрипт Script.bat. После этих манипуляций в корневой папке программы появляется папка «projects» и в ней папка с таким же названием, как у .
apk-файла.
Теперь вам нужно получить файл .
jar из файла groups.dex, для которого использовался скрипт dex2jar. Достаточно перетащить мышкой файл .
dex на dex2jar.bat и мы получим то, что хотели.
Следующим шагом будет декомпиляция полученного файла groups_dex2jar.jar. Сначала я попробовал декомпилятор JD-gui. Но оно не оправдало ожиданий, выдавая некорректный код. Но следующий декомпилятор AndroChef полностью справился с задачей.
Давайте посмотрим на полученные источники.
Для дизассемблирования я использовал стандартную версию Eclipse Kepler с установленным на ней плагином ADT. Установить его можно из оболочки Eclipse, вызвав меню «Справка» — «Установить новое программное обеспечение…».
затем нажмите кнопку «Добавить» и введите ADT Plugin в поле «Имя» и в поле «Местоположение:».
dl-ssl.google.com/android/eclipse .
Выберите все компоненты и нажмите «Готово».
Для начала я создал пустой проект приложения Android. Где я установил Имя приложения: Color, Имя проекта: MagicColor2, Имя пакета: com.android.color. Затем я снял флажки «Создать собственный значок запуска» и «Создать активность».
Полученные при декомпиляции папки «cn» и «com» я поместил в папку src. Из «com/android/color» переносим файл R.java и заменяем его в папку «gen/com/android/color».
Не забудьте перенести все файлы из папки «res» в одноименную папку проекта.
И AndroidManifest.xml. Что я получил, используя скрипт apktool с параметрами Java -jar apktool.jar d MagicColor.apk. После запуска скрипта создается папка out, содержащая папку res и AndroidManifest.xml. Можно приступить к анализу программного кода.
Eclipse находит в программе несколько ошибок, которые необходимо исправить.
Как я это сделал, можно увидеть в исходниках, которые я прикрепил к статье ниже.
В StaticClass.java мы видим настройки программы по умолчанию.
Некоторые из этих параметров пригодятся нам позже.
В файле Protocol.java описан алгоритм генерации команды для устройства, основанный на функции getAll(), в которой генерируется команда.
На основе этих данных мы видим, что первые два байта всегда одинаковы и равны -86 и 85, образуя в двоичном виде 10101010 и 1010101 последовательность битов, позволяющую определить подлинность и правильность команды.public byte[] getAll() { this.all[0] = this.frameHead[0]; this.all[1] = this.frameHead[1]; this.all[2] = 0; this.all[3] = this.mode; this.all[4] = this.keyNumber; this.all[5] = this.keyValue; this.all[6] = this.colorRGB[0]; this.all[7] = this.colorRGB[1]; this.all[8] = this.colorRGB[2]; this.all[9] = this.checkValue; return this.all; }
Также для определения правильности в команду входит контрольная сумма, которая находится в самом конце, 9-м байте команды.
Он рассчитывается по функции getCurCheckValue(int paramInt1, int paramInt2, int paramInt3, int paramInt4, int paramInt5) следующим оригинальным способом: Key_Num + (синий +(зеленый + (красный +(bar_No + 255))) +режим)%255 Где: paramint1 – StaticClass.bar_No, paramint2 – StaticClass.red, paramint3 – StaticClass.green, paramin4 – StaticClass.blue, paramint5 – StaticClass.Key_Num Как вы уже догадались, красное, зеленое и синее поля — это значения от 1 до 255 для каналов 1,2,3 соответственно.
При подключении RGB освещения меняется цвет, а при подключении обычных диодных ламп меняется яркость.
Поле Key_Num определяет режим работы устройства.
Режимы следующие: 1 - выключение освещения, 2 - включение освещения, 3 последовательное переключение встроенных режимов устройства, от частого моргания до постоянного свечения.
Имея в своем распоряжении всего один канал с лампой, я не смог ознакомиться со всем многообразием режимов.
Поле mode = 1, поле bar_No всегда равно 50. Перед отправкой команда модифицируется функциями обменбайты И обменИнт видимо для того, чтобы слегка зашифровать протокол передачи.
Идея этих функций в том, что симметричные относительно центра части крайних байтов меняются местами, например, если у нас исходное сообщение AB CD, то после преобразования мы получим AC BD, а если 12 34 56 78 тогда получим 17 35 46 28. Как умно!! ! Теперь о проблеме, которая мешала мне использовать программу на своих устройствах Samsung. Как выяснилось при отладке приложения, SSID сети заключен в кавычки и его длина увеличивается на 2 символа, чего программа не ожидает, а при проверке длины SSID рассчитывает получить 5 вместо 7. Проверка функции, расположенные в файле ColorActivity.java, обсуждаются ниже.
Их два: частная пустота getWifiInfo() И защищенная пустота ().
Обе функции содержат следующий код: if(this.ssid != null) {
if(this.ssid.length() != 5) {
StaticClass.wifi_correct = false;
return;
}
if(!this.ssid.substring(0, 2).
equals("LN")) {
StaticClass.wifi_correct = false;
return;
}
Эти чеки Самвы я выделил жирным шрифтом.
Зачем проверять длину SSID и первых двух символов имени SSID, а они всегда одинаковые, я не знаю.
В SSID различаются только последние 3 символа, и они зависят от положения переключателя SSID на устройстве.
Положение 0 на переключателе соответствует имени SSID «LN001».
Для того чтобы программа заработала на моем телефоне достаточно было убрать эти проверки.
Далее мне удалось добавить на страницу настроек программы дополнительное поле, в которое можно ввести IP-адрес устройства.
Теперь есть возможность перевести устройство из режима «ad hoc» в режим «инфраструктура», настроить безопасность и подключить его из домашней сети, оставив возможность управлять освещением с мобильного устройства.
Готовый проект и рабочую программу в папке «bin» с добавленным в настройки полем IP-адреса устройства можно найти здесь: Проект «Магический цвет 2».
Теги: #Компьютерное оборудование #Android #wifi #LED-контроллер #MagicColor
-
Пробелы — Главный Враг Linux
19 Oct, 24 -
Добавьте Вложение К Своему Резюме
19 Oct, 24 -
Учебное Пособие По Драйверу Mongodb Go
19 Oct, 24 -
Чем Опасна Преждевременная Автоматизация?
19 Oct, 24