Получение root на китайской IP камере V380

Приобрёл IP камеру V380E, плата MVR3313S-A4-V3.8. Подключиться через telnet не удалось, т.к. пароль на рута найти не вышло. Распаял UART и подключился к консоли

screen /dev/ttyUSB0 115200


Так я получил адреса образов в памяти. Так же можно получить их утилитой binwalk.

Считал дамп из SPI flash программатором на CH341

341spi -r V380E.bin

Далее отделил образ squashfs

dd if=V380E.bin of=V380E-A.bin bs=1 count=1966080 skip=2490368

Распаковал ФС

unsquashfs V380E-A.bin

Сгенерированный хэш пароля сохранил в etc/shadow и упаковал обратно в squashfs образ

cd squashfs-root
mksquashfs . ../V380E-A.squashfs -comp xz -progress -Xbcj armthumb

Если указать иную архитектуру, будет ошибка

SQUASHFS error: Filesystem uses "unknown" compression. This is not supported
No filesystem could mount root, tried:  squashfs

Затем нужно переписать в дампе памяти образ

cd ..
dd status=progress if=V380E-A.squashfs of=V380E.bin seek=2490368 bs=1 conv=notrunc

И залить обратно в память, предварительно стерев на всякий случай память, а после прошивки проверить содержимое

341spi -e
341spi -w /home/demonust/V380E.bin
341spi -r V380E.tmp
diff V380E.tmp V380E.bin

После загрузки можно войти в систему и удалить или заменить противные звуки, которые находятся в /mnt/mtd/mvsound, доступной для записи.

Слитый дамп до смены пароля.

Linux GPIO Interrupt Python on Orange Pi zero

Скрипт работает через прерывания от inotify. Проверялся на GPIO10.

import inotify.adapters
import inotify.constants
from threading import Thread
status=" "
def gpio():
  global status
  gpio_export  = open('/sys/class/gpio/export', 'w')
  gpio_export.write('10')
  #gpio_export.close()
  gpio_edge  = open('/sys/class/gpio/gpio10/edge', 'w')
  gpio_edge.write('both')                              #both - любое изменение, rising - по высокому уровню, falling - низкий уровень, none - отключено
  #gpio_edge.close()

  i = inotify.adapters.Inotify()
  i.add_watch(b'/sys/class/gpio/gpio10/value', mask=inotify.constants.IN_MODIFY)
  while True:
    for event in i.event_gen():
      if event is not None:
        
        gpio_r = open('/sys/class/gpio/gpio10/value', 'r')
        status=gpio_r.read(1)
        #print(status)  

def main():
  global status
  statusold=" "
  while True:
    if status != statusold:
      print(status)

Светодиодная лампа с BLE модулем JDY-08

Подключение к лампе модуля JDY-08 с питанием от бестрансформаторного источника питания.
Читать далее Светодиодная лампа с BLE модулем JDY-08

Драйвер светодиодного фонаря на SX1308 (MT3608)

Купил как-то в одном магазине со всяким хламом по одной цене фонарь примерно за 50р.

Всё в нём довольно хорошо, кроме одного: на боковые светодиоды нет даже резистора для ограничения тока. Когда батарейки немного сядут, светодиоды светят тускло, а то и вовсе перестают светиться.
Читать далее Драйвер светодиодного фонаря на SX1308 (MT3608)

ATTINY13 ADC-UART

Трёхканальный АЦП выполнен на микроконтроллере ATTINY13 и передаёт данные один раз в секунду через программный UART на скорости 9600 бод. Данные приходят в шестнадцатиричном виде, каждый канал разделяется пробелом, после чего следует конец строки \r\n.

Читать далее ATTINY13 ADC-UART

Тестер датчиков температуры DS1820, DS18S20 и DS18B20


Устройство предназначено для проверки датчиков температуры DS1820, DS18S20 и DS18B20, читая из одного датчика адрес и температуру. Собрано на ATMEGA8535 (Частота 8МГц) и дисплее на совместимом с HD44780 контроллере, 1602 с aliexpress без кириллицы. Читать далее Тестер датчиков температуры DS1820, DS18S20 и DS18B20

DS3231 на Raspberry Pi и Orange Pi без использования модуля ядра

При использовании модуля ядра у меня возникла странная проблема. Данные в RTC DS3231 записывались не совсем корректные. Например, вместо 23.09.16 было такое (подключено к ATmega328). Подозрение упало на ntpd.
15-ccNVYcdc
Читать далее DS3231 на Raspberry Pi и Orange Pi без использования модуля ядра

Термометр на attiny24 с датчиком TMP35/TMP36

Термометр измеряет температуру от 0 до 99 С° с погрешностью не более ±2 С°. Выбор датчика осуществляется запаиванием перемычки на выводе 5 (PB2) U1. При подключении датчика TMP36 перемычку следует запаять между PB2 и Vcc, а при подключении TMP35 перемычку следует запаять между PB2 и GND. Питание термометра от 3 до 5 Вольт, ток потребления около 40 мА.
Читать далее Термометр на attiny24 с датчиком TMP35/TMP36

Питание мультиметра от литиевого аккумулятора

Чтобы не оказаться в ситуации, что «Крона» села, а работать нужно, удобно использовать аккумуляторы. Готовые аккумуляторы можно купить в магазине, но они заряжаются вне самого прибора. То есть пользоваться им во время зарядки не выйдет, а время заряда достаточно большое.
Читать далее Питание мультиметра от литиевого аккумулятора

Аварийное освещение на литиевом аккумуляторе

Такой фонарь работает без проблем уже года 3.

Читать далее Аварийное освещение на литиевом аккумуляторе