Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Hardware Hacking Cheatsheet — Шпаргалка по аппаратному взлому | Kitploit
Инструменты/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
Безопасность встроенных системБезопасность IoTАппаратная БезопасностьОбучение и ОбразованиеПодобранные РесурсыАнализ Прошивок
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

Шпаргалка по аппаратному взлому

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
25 лет назадЕщё не проверено

Шпаргалка по аппаратному хакингу

[[TOC]]

Дисклеймер

  • Я новичок, который пытается освоить подобные вещи, так что что-то может быть не на 100% правильно
  • Простите за плохой английский

Заметки

  • Следуйте методологии «сначала самый лёгкий путь»
  • Иногда потребуется паять; здесь краткая и простая инструкция
    • Возможно, придётся припаять провода прямо к переходным отверстиям (via) на PCB (видео)
      1. Поцарапайте поверхность PCB канцелярским ножом, пока не увидите блеск под маской припоя
      2. Поцарапайте поверхность ещё раз стекловолоконным карандашом
      3. Очистите поверхность изопропиловым спиртом (IPA) и ватным тампоном
      4. Нанесите немного флюса
      5. Залудите провод и припаяйте
    • Заметки
      • Всегда залуживайте кончик жала паяльника
      • Температура: 250-350 C
      • Не трогайте PCB руками

Сбор информации и первое взаимодействие

  1. Посмотрите на этикетку на задней стороне устройства и найдите
    • Название модели
    • Серийный номер
    • Компанию, под брендом которой выпущено устройство (возможно, она не является производителем)
  2. Поищите в интернете, используя только что собранную информацию
    • Лучшие сайты с информацией
      • TechInfoDepot
      • OpenWRT
    • Поищите..., это обычно приводит к большому количеству информации
      • FCC ID (справочный сайт)
      • Название SoC
      • Название и объём чипа флеш-памяти
      • Название и объём чипа ОЗУ
      • Другие возможные источники информации
  3. Вскройте устройство
    • Поищите обучающие материалы о том, как открыть устройство
    • Некоторые устройства могут быть склеены, чтобы предотвратить вскрытие, будьте аккуратны
    • Иногда радиаторы закрывают часть схемы; если возможно, снимите их
  4. Идентифицируйте компоненты
    • Чтобы сделать обозначения на схеме более читаемыми
      • Используйте вату + спирт; когда спирт высохнет, покройте схему мелом, затем протрите; теперь обозначения должны быть читаемыми
      • Используйте увеличительное стекло
    • Ищите информацию и даташиты об этих компонентах в интернете; если ничего не найдено, попробуйте китайские поисковые системы
      • Baidu
      • Sogou
      • Haosou
    • ВАЖНО: найти компонент с хорошо доступными VCC и GND очень полезно
  5. Найдите интерфейс UART: это более или менее TTY
    • Поищите в интернете
    • Поищите на PCB GND, IN или RX, OUT или TX и VCC
    • Поищите 3/4 контакта на PCB
      1. Найдите опорную точку GND
        • Используя ранее найденные компоненты
        • Обычно металлические пластины находятся на GND
      2. Найдите опорную точку VCC
        • Используя ранее найденные компоненты
        • Поищите конденсаторы, обычно одна их ножка на VCC
      3. Проверьте кандидатов в контакты UART, заполняя таблицу ниже (пункты списка соответствуют столбцам таблицы)
        1. Проверьте сопротивление контактов UART относительно GND (мультиметр в режиме измерения сопротивления, обычно )
  6. Подключение через UART: используйте последовательный адаптер (UART -> USB) для подключения к плате через компьютер
    • Выбранный последовательный адаптер: FT232H + Focaccia Board
    1. Выберите подходящее напряжение (3.3V или 5V), иначе плата или адаптер будут повреждены
    2. Подключите RX платы к TX адаптера и TX платы к RX адаптера
      • ПРИМЕЧАНИЕ: обычно подключать контакт VCC не нужно
    3. Подключите адаптер к компьютеру
      1. sudo lsusb, чтобы найти адаптер
      2. ls -lart /dev, чтобы найти все файлы устройств; наше должно быть одним из последних, обычно ttyUSB0
      3. Для доступа к этому устройству мы должны быть в группе dialout (или быть ); чтобы проверить свои группы, используйте
  7. Найдите интерфейс JTAG
    • Что такое JTAG: интерфейс JTAG даёт производителям возможность проверять физические соединения между контактами на чипе. Когда инженеры-электрики говорят об использовании JTAG для «отладки» чипа, они имеют в виду нечто совершенно иное, чем традиционная программная отладка. Они говорят о проверке того, что контакт A на чипе A физически соединён с контактом B на чипе B, и что все эти контакты работают правильно. Поскольку JTAG даёт прямой аппаратный доступ к устройству, это также фантастический инструмент для исследований в области безопасности.
    • Свойства JTAG
      • Управляемость: установка внутренних битов в 0 или 1
      • Наблюдаемость: проверка значения внутренних битов
      • ...таким образом, чтение/запись EEPROM
      • Внутрисхемная отладка: отладка кода на схеме (например, с помощью OpenOCD и GDB)
    • Поищите в интернете
    • Поищите на PCB TCK, TDI, TDO, TMS и TRST (опционально)
      • TCK (Test Clock): барабанщик или метроном, задающий скорость контроллера. Напряжение на этом контакте просто пульсирует вверх и вниз в ритмичном, ровном темпе. На каждый «удар» тактового генератора контроллер выполняет одно действие.
      • TMS (Test Mode Select): напряжение на контакте выбора режима управляет тем, какое действие выполняет JTAG. Манипулируя напряжением на этом контакте, вы указываете JTAG, что хотите, чтобы он делал.
  8. Подключение через JTAG: используйте «последовательный адаптер» (JTAG -> USB) для подключения к плате через компьютер
    • Выбранный «последовательный адаптер»: FT232H + Focaccia Board
    1. Выберите подходящее напряжение (3.3V или 5V), иначе плата или последовательный адаптер будут повреждены
    2. Используя ранее найденную распиновку JTAG, соедините всё вместе
    3. Оставьте UART-подключение открытым (как объяснялось ранее), чтобы взаимодействовать с устройством и наблюдать за его поведением
    4. Запустите OpenOCD
      • Первое окно (OpenOCD «сервер»): openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE: справочник по плате Focaccia
        • $BOARDCONFIGFILE: конфигурационный файл взламываемой вами платы (полезно, но, возможно, у вас его не будет; необязательно)
          • Примечания
            • Конфигурационные файлы находятся внутри /usr/local; возможно, здесь вы найдёте полезный $BOARDCONFIGFILE
            • В противном случае можно поискать в интернете
            • В противном случае можно написать его самостоятельно
            • TODO (написать самостоятельно)
  9. Получите прошивку и файловую систему
    • Возможности (прошивка и файловая система могут быть зашифрованы)
      • Скачать её с сайта производителя
      • Если прошивку может скачать только само устройство (через обновление), перехватите сетевой трафик с помощью Wireshark, чтобы получить информацию
      • Прочитать EEPROM напрямую с помощью программатора микросхем флэш-памяти и тестового зажима
      • Команда дампа загрузчика
        1. Проанализируйте вывод журнала загрузки в интерфейсе UART
          • Информация, которая может выводиться и которая нас интересует (значения — примеры, но они поясняют, что мы ищем)
            • Общая информация о загрузчике
              • Ищите название и версию загрузчика (например: U-Boot 1.1.3)
            • Информация о SoC
              • Дополнительная информация о платах (Wi-Fi, Ethernet...), они могут иметь собственный загрузчик
              • Модель SoC (например: ASIC MT7621A...)
              • Частота CPU
            • Информация о RAM
              • mtd->writesize=2048: размер страницы (байт)
              • mtd->oobsize=64: данные, используемые для коррекции ошибок (байт)
              • devinfo.iowidth=8: данные, записываемые/читаемые за одну операцию (байт)
              • Объём RAM
            • Информация о EEPROM
              • mtd->erasesize=131072: оставшееся количество перезаписей EEPROM? (более или менее)
            • Информация о ядре ОС
              • Ищите информацию о загрузке загрузчика; здесь можно найти сведения о файловой системе
              • Ищите версию Buildroot; это поможет нам эмулировать устройство и проводить различные тесты

TODO SPI DUMP

TODO GDB ATTACH????

Реверс-инжиниринг

  1. Тип процесса init и конфигурационные файлы
    • Типы
      • Стиль BSD
        • Начинает выполнение скриптов в
          • /etc/rc
          • /etc/rc.local
        • Более новый
          • Смотрите информацию в /etc/rc.conf
          • Выполняет /etc/rc.d/
      • System V (самый популярный)
        • Запускается BusyBox
        • Конфигурационные файлы находятся в /etc/inittab
          • runlevel
            • 1: однопользовательский режим, root-оболочка, без пароля, без запущенных демонов
            • 3: текстовый многопользовательский режим, приглашение входа
            • 5: графический вход в систему
          • Затем приводится список действий, выполняемых при инициализации
        • Выполняет /etc/init.d/
      • Systemd (не используется во встраиваемых системах)
    • Как определить
      • Выводится при загрузке

Среда эмуляции

  • Требования
    • Знать архитектуру CPU бинарного файла
      • Тривиально определяется с помощью команды file
    • QEMU должен поддерживать эту архитектуру
  • Эмуляция QEMU (режимы)
    • Системный режим: эмуляция всей системы
      • Как
        1. Найдите формат исполняемого файла QEMU: qemu-system-$PROCESSOR$ARCHITECTURE

          • Пример: qemu-system-mipsel
        2. Если вы знаете семейство процессора, вы можете указать его, чтобы помочь QEMU лучше эмулировать среду

          • Чтобы получить список поддерживаемых семейств: $QEMUBIN -cpu help
          • Всегда лучше начинать с CPU общего семейства, а затем, если что-то не работает, копать глубже и использовать конкретные семейства CPU
        3. Нам нужны ядро и корневая файловая система

          • Примечания
            • Ядро устройства не подходит из-за отсутствующих драйверов
            • В мире IoT нет стандартизации
              • Используйте дерево устройств ядра: текстовый файл, определяющий драйверы платы
                • Ядро при загрузке загрузит этот файл и адаптирует общие драйверы к используемой плате
                • Не так часто используется
            • ИТАК.. ПЕРЕСОБЕРИТЕ ЯДРО И ФАЙЛОВУЮ СИСТЕМУ
          1. Найдите версию ядра, версию libc и список библиотек, используемых интересующим нас исполняемым файлом (readelf -d $EXECUTABLE)

            • Формат версии библиотеки: ( — версия)

Источники, авторы и благодарности

  • Спасибо Valerio Di Giampietro (@valerio) за его невероятный обучающий YouTube-канал по аппаратному взлому; всё написанное здесь в основном взято из этих видео.
  • Спасибо Luca Bongiorni (@LucaBongiorni) за его ценные советы и аппаратные инструменты.
  • Спасибо mightyohm.com за Комиксы о пайке
  • Спасибо сообществу Reddit hardwarehacking за помощь
    • [Noob] Direct PCB soldering (maybe?)
  • Спасибо Andrew Paul за обучающее видео по пайке переходных отверстий (via)
  • Руководство по Buildroot
  • Объяснение JTAG
  • OpenOCD — команды Flash
  • Информация об OpenOCD + JTAG
  • Шпаргалка по аппаратному взлому — небольшой PDF
  • OpenOCD
Скачать инструмент
200k
  • Проверьте сопротивление контактов UART относительно VCC (мультиметр в режиме измерения сопротивления, обычно 200kOhm)
  • Включите устройство и проверьте напряжение контактов UART относительно GND (мультиметр в режиме измерения напряжения, обычно 20V)
  • Включите устройство и ВО ВРЕМЯ ЗАГРУЗКИ проверьте предполагаемый контакт TX UART по напряжению относительно GND (мультиметр в режиме измерения напряжения, обычно 20V); если напряжение колеблется, то это, вероятно, TX (потому что он передаёт данные)
  • Включите устройство и ВО ВРЕМЯ ЗАГРУЗКИ проверьте предполагаемый контакт RX UART по напряжению относительно GND (мультиметр в режиме измерения напряжения, обычно 20V); если напряжение застряло на 0, то это, вероятно, RX (потому что он ждёт приёма данных)
    • Таблица

      PINсопротивление GNDсопротивление VCCVПримечания
      1
      2
      3
      4
      • Пример

  • Используйте Jtagulator
    1. Подключите его к компьютеру (скорость: 115200)
    2. ВАЖНО: H — функция печати справки, используйте её везде
    3. Подключите GND платы к GND Jtagulator, контакты платы 1,2,3 к каналам 1,2,3 Jtagulator
    4. V: установите рабочее напряжение
    5. U: войдите в меню идентификации UART
    6. U: начните идентификацию
    7. Text string to output: по умолчанию
    8. Starting channel: канал, куда мы подключили контакт 1 платы
    9. Ending channel: канал, куда мы подключили контакт 3 платы
    10. Ignore non-printable characters: Да
    11. Готово!
  • TODO: - Используйте BurtleinaBoard + Busside
  • root
    groups $USER
  • screen /dev/ttyUSB0 $BAUDRATE для подключения к TTY
    • $BAUDRATE может быть одним из тех, что указаны здесь
    • Наиболее распространённые $BAUDRATE
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • ВАЖНО: если мы облажаемся с $BAUDRATE, можем увидеть абракадабру или вообще НИЧЕГО
    • ctrl + a -> k -> y: закрыть screen
    • Если контакт RX не работает (вы печатаете и нажимаете enter, но ничего не происходит), возможно, неправильное значение "enter": \r\n или \n?
      • Чтобы решить эту проблему, используйте pyserial, библиотеку Python для последовательной связи, пример:
        root@kitploit:~
        #!/usr/bin/env python3
        
        import serial
        
        ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
        ser.write(b"HELLO\r\n")
        ser.write(b"HELLO\n")
        
      • Если проблема сохраняется, используйте логический анализатор (здесь дешёвый)
  • TDI (Test Data-In): контакт, через который данные поступают в чип. Стандарт JTAG не определяет протоколы связи через этот контакт. Это остаётся на усмотрение производителя. Для JTAG этот контакт — просто способ попадания 1 и 0 внутрь чипа. Что чип с ними делает, для JTAG не важно.
  • TDO (Test Data-Out): контакт для данных, выходящих из чипа. Как и для контакта данных на входе, протоколы связи не определяются стандартом JTAG.
  • TRST (Test Reset, опционально): этот сигнал используется для сброса JTAG в известное хорошее состояние.
  • Поищите ряд из 5/6 контактов или двойной ряд из 10, 12, 14, 20 контактов на PCB
    1. Найдите опорную точку GND
      • Используя ранее найденные компоненты
      • Обычно металлические пластины находятся на GND
    2. Найдите опорную точку VCC
      • Используя ранее найденные компоненты
      • Поищите конденсаторы, обычно одна их ножка на VCC
    3. Проверьте кандидатов в контакты JTAG, заполняя таблицу ниже (пункты списка соответствуют столбцам таблицы)
      1. Проверьте сопротивление контактов JTAG относительно GND (мультиметр в режиме измерения сопротивления, обычно 200k)
      2. Проверьте сопротивление контактов JTAG относительно VCC (мультиметр в режиме измерения сопротивления, обычно 200kOhm)
      3. Включите устройство и проверьте напряжение контактов JTAG относительно GND (мультиметр в режиме измерения напряжения, обычно 20V)
      • Таблица

    4. Сравните найденные значения с наиболее часто используемыми распиновками JTAG, доступными на jtagtest
  • Используйте Jtagulator
    1. Подключите его к компьютеру (скорость передачи: 115200)
    2. ВАЖНО: H — функция вывода помощи, используйте её везде
    3. Подключите GND платы к GND Jtagulator, контакты платы 1,2,3... к каналам Jtagulator 1,2,3...
    4. V: установите рабочее напряжение
    5. J: войдите в меню определения JTAG
    6. У нас есть два варианта
      • I: идентификация с помощью сканирования IDCODE, не найдёт TDI (быстро), лучше, если нужно идентифицировать много контактов
      • B: идентификация с помощью сканирования BYPASS, найдёт TDI (медленно), лучше, если контактов для идентификации меньше
    7. Starting channel: канал, куда мы подключили контакт 1 платы
    8. Ending channel: канал, куда мы подключили контакт n платы
    9. Already known pins: Нет, но это может ускорить процесс, если мы уже знаем некоторые контакты
    10. Запустите и подождите.. Готово!
  • TODO: - Использовать BurtleinaBoard + Busside
  • ВАЖНО
    • JTAG может быть отключён (аппаратно, удалением резистора), поэтому возможна несогласованность результатов, полученных с помощью мультиметра и Jtagulator; это можно решить, установив резистор примерно 300Ohm или 1kOhm между этим контактом и VCC
    • JTAG может быть отключён (аппаратно, удалением резистора); эту проблему можно решить, вернув резистор на место или соединив напрямую, замкнув контактные площадки резистора
    • JTAG может быть отключён (программно, установкой некоторых значений)
    • JTAG может быть отключён (аппаратно, перегоревшим предохранителем... в этом случае надежды нет)
  • Второе окно (OpenOCD «клиент»): telnet localhost 4444
    • Полезные команды
      • halt: остановить CPU (как заморозка)
        • ДОЛЖНА ВЫПОЛНЯТЬСЯ ПЕРЕД КАЖДОЙ ОПЕРАЦИЕЙ ОТЛАДКИ
      • reset: сбросить CPU
      • reg: прочитать регистры CPU
      • flash info bank $BANKID или flash info $BANKID: выводит информацию о банке флэш-памяти $BANKID (я думаю, банки = блок памяти)
      • flash list: получает список ассоциативных массивов для каждого устройства, объявленного с помощью flash bank (в $BOARDCONFIGFILE), нумерация с нуля
      • flash banks: выводит однострочную сводку по каждому устройству, объявленному с помощью flash bank (в $BOARDCONFIGFILE), нумерация с нуля
      • flash write_image erase "$BINTOWRITE" $ADDRTOSTART: записать во флэш-память
        • $BINTOWRITE: может быть bin (двоичный), ihex (Intel hex), elf (ELF-файл), s19 (Motorola s19), mem...
        • $ADDRTOSTART: адрес, с которого начать запись (я думаю, по умолчанию 0)
      • flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: дамп памяти
        • $OUTFILE: двоичный файл для сохранения дампа
        • $ADDRTOSTART: адрес, с которого начать чтение (я думаю, по умолчанию 0)
        • $SIZETODUMP: количество байт для дампа
    • Подробнее здесь:
      • OpenOCD PDF
      • OpenOCD HTML
    • TODO
  • Информация о файловой системе
    • Ищите информацию о загрузке загрузчика и процессе запуска ОС; здесь можно найти сведения о файловой системе
  • Разделы EEPROM
    • Ищите процесс запуска ОС; здесь можно найти сведения о разделах EEPROM, их именах, точках монтирования и размере в RAM
    • Если вы видите дублирующиеся разделы, это, вероятно, для обновления прошивки; вы можете догадаться, почему
  • Информация о процессе init
    • Ищите init started или что-то подобное; это, вероятно, будет рядом со строкой BusyBox или чем-то аналогичным
  • Есть ли у загрузчика CLI?
    • Ищите меню загрузчика; здесь, вероятно, мы сможем найти ответ на этот вопрос
  • Попробуйте получить оболочку загрузчика (автоматически или через меню, выводимое по UART)
  • Исследуйте оболочку загрузчика
    • Команда help — ваш друг
    • Попробуйте найти способ сбросить содержимое памяти; Python — ваш друг
    • Данные OOB (коррекция кода ошибок) не так полезны для дампа
  • Анализ сброшенных данных
    • Используйте binwalk, file и hexdump -C, чтобы проверить, в порядке ли сброшенный файл, и является ли он сжатым или зашифрованным
      • С помощью binwalk -E анализируем энтропию файла
        • Энтропия БЛИЗКА К 1: случайный, сжатый или зашифрованный файл
        • Энтропия НИЖЕ 1: обычный исполняемый файл или обычный файл
    • Используйте binwalk -e для извлечения идентифицируемых сегментов файла
  • Если binwalk не полностью понимает сброшенный образ, мы можем использовать таблицу разделов EEPROM (если она была найдена ранее), чтобы вручную разделить сброшенный образ на несколько полезных образов
    • dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITE
    • sha1sum, md5sum или binwalk -W -i для сравнения образов (если, например, мы думаем, что они могут быть одним и тем же образом)
  • Последнюю операцию можно выполнять несколько раз в зависимости от содержимого сброшенного образа; если, например, у нас есть образ ядра, мы можем ещё раз извлечь его компоненты с помощью binwalk (или dd, если мы сможем найти в интернете, как устроен наш конкретный образ ядра), чтобы прочитать корневую файловую систему
  • Извлеките файловую систему
    • Пример команды (в зависимости от типа файловой системы): fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
      • fakeroot: создаёт поддельное root-окружение; полезно для эмуляции прав на файлы, файлов устройств...
        • -s fakeroot.dat: сохранить поддельное root-окружение для последующего восстановления командой fakeroot -i fakeroot.dat bash
      • usquashfs: извлекает файловую систему squashfs (в вашем случае может отличаться)
        • -d squashfs-root: папка назначения
        • u04-sqfs.dat: образ файловой системы для извлечения
  • Проанализируйте /sbin/init, ища информацию (указанную выше), идентифицирующую типы
  • Интересующие бинарные файлы и скрипты
    • Ищите интересные файлы, запускаемые процессом init; в целом не останавливайтесь на названиях, углубляйтесь в то, какой бинарный файл выполняется, и анализируйте их; наиболее интересны нестандартные
    • Ищите строку factory mode; если нам удастся перевести устройство в заводской режим (если он существует), взломать его станет намного проще
    • Полезные команды
      • Текстовый редактор
      • grep
      • find
      • xargs
      • strings
  • libfoo.X.Y.Z
    X.Y.Z
    • X несовместимый ABI
    • Y обратно совместимый ABI
    • Z без изменений ABI
  • Итак, нам нужно, чтобы X.Y совпадало с оригинальной библиотекой
    • Допустимо: то же X, более высокое Y
  • Соберите с помощью системы сборки (выбирайте функции и автоматически отслеживайте зависимости)

    • Лучшие варианты систем сборки
      • Проект Yocto
      • Buildroot (лучший)
      • Система сборки OpenWRT
  • Начните эмуляцию

    • Скрипт эмуляции QEMU
      root@kitploit:~
      #!/bin/bash
      # This script will build an environment without password for the user root
      export QEMU_AUDIO_DRV="none" # ignore audio drivers
      
      qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
                                              -m $RAMSIZE \
                                              -kernel $KERNELPATH \
                                              -nographic \ # No GUI
                                              -hda $FILESYSTEM \
                                              -net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
                                              -net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
                                              -no-reboot \ # Terminate the machine when is halted
                                              -append "root=/dev/hda console=uart0" # Set root filesystem and console
      
    • Если при выполнении бинарного файла выводится ошибка об отсутствующих библиотеках, установите LD_LIBRARY_PATH следующим образом (внутри машины): export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • Мы также можем эмулировать NAND EEPROM
      root@kitploit:~
      #!/bin/bash
      
      # Part 1: Identify bytes for kernel module
      modprobe nandsim first_id_byte=$FIRSTBYTE \
                          second_id_byte=$SECONDBYTE \
                          third_id_byte=$THIRDBYTE \
                          fourth_id_byte=$FOURTHBYTE \
                          cache_file=/root/nandsim.bin \
                          parts=x,y,z,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
      
      # Part 2: Erase partitions created (analyze EEPROM partitions)
      flash_erase /dev/mtd0 0 8 
      flash_erase /dev/mtd1 0 20
      # ...
      
      # Part 3: Load partitions dumped from device in the ones just created
      nandwrite /dev/mtd0 part0.bin
      nandwrite /dev/mtd1 part1.bin
      # ...
      
      # Part 4: Create mountpoint for filesystem and attach (if UBIFS)
      mkdir /mnt/filesystem
      ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
      ```# Part 5: Mount
      mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
      
      1. Identify bytes for kernel module
        • During boot usually information about NAND are print, look at it (above steps) and search for NAND ID, bytes print are in order first, second and fourth byte
        • We could find those information also searching the datasheet of the EEPROM
        • We could also use writesize, oobsize, erasesize, iowidth to find here the correct command
        • Else, trial and error
      2. Analyze EEPROM partitions print on boot to find their sizes and names, the last number in the flash_erase command is their size correlated to the erasesize (same as parts=x,y,z,...)
      3. Load partitions dumped from device in the ones just created
      4. Create mountpoint for filesystem and attach
        • -O: specify the volume id header offset, if wrong the system should tell you the right value anyway you could try different values like 512, 1024, 2048 (trial and error)
        • -m: mtd device number (see point 3)
        • -d: UBI device number (see point 5)
  • User mode: like wine, execute just a binary and "translate" it to our architecture
    • Notes
      • Not so stable
      • Can give strange results
    • How to
      1. Locate QEMU executable format: qemu-$PROCESSOR$ARCHITECTURE
        • Example: qemu-mips64
      2. If QEMU complains about missing interpreter pass the path of THE FOLDER CONTAINING this interpreter with -L (or see man)
        • To know what interpreter is used by an executable use readelf -l $EXECUTABLE
  • Virtualization mode: not interesting for us
  • Kernel and root filesystem building using buildroot and docker
    • Our built kernel should have (in respect to the original kernel)
      • Same kernel version
      • Same libc version (uClibc, uClibc-ng, musl, dietlibc...)
      • Same libraries versions (of the executable we are interested in)
    1. Search the buildroot version that is the nearest to versions of our device
      • Sometimes during boot/exploring the dumped memory we could find the version of buildroot used (if the device was built using buildroot)
    2. Find a linux version compatible with the buildroot version found and create a docker container, here a sample dockerfile (packages are important to run buildroot)
    3. Download selected buildroot version from here and put it inside the docker container shared folder
    4. Run and switch to the docker container
    5. Extract buildroot and make manual to create buildroot's manual
    6. Using make help buildroot prints all supported devices (boards); make $YOURBOARDNAME to create a buildroot configuration file of your board
    7. make menuconfig (text based) or make xconfig (GUI) to select kernel modules to add to our build, we'll use make xconfig
      • Here there is an example/guideline but you will need to discover by yourself which modules in particular you will need to run your applications
      • Cheat: Edit->Find to search for modules
      • Options
        • Target options
          • Check Show options and packages that are deprecated or obsolete
          • Check Build packages with debugging symbols with highest debug level
          • Check Strip command for binaries on target to None
          • Check GCC optimization level to 0
        • Toolchain
          • Check Toolchain type to Buildroot toolchain
          • Check Kernel headers to Manually specified linux version
      • Remember to SAVE
    8. To permanently save the configuration just defined use make savedconfig
    9. Configure the kernel with make linux-menuconfig (text based) or make linux-xconfig (GUI), here we'll use CLI version
      • Here there is an example/guideline but you will need to discover by yourself which modules in particular you will need to run your applications
      • Options
        • Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulator
        • Kernel type -> Device drivers -> -> ->
    10. Configure uClibc (or your c lib) using uclibc-menuconfig (as always)
      • Enable debugging: Development/Debugging options -> Enable debugging symbols, if this doesn't work (compiling errors) then Development/Debugging options -> (Wall) compiler warnings -> add -Wall -ggdb -g3
        • -ggdb: provides debugging info to use with GDB
        • -g3: provide extra debugging information
      • Save
      • Enable features as in our device (trial and error, if you get errors investigate and then rebuild with features needed)
    11. make, if problems iterate back
      • Possible compilation errors
        • Need to use -fPIC
          • Add --enable-shared in kernel modules (point 7) under Toolchain -> Additional gcc options or patch buildroot
    • Saving configuration files for buildroot with git
      • Eternal tree configuration (tree view of files to be understand by buildroot) (br2)
        root@kitploit:~
        +-- board/
        |   +-- <company>/ (not always used)
        |       +-- <boardname>/
        |           +-- linux.config
        |           +-- busybox.config
        |           +-- kernel-defconfig (kernel config file)
        |           +-- <other configuration files>
        |           +-- post_build.sh (executed just before building the image, useful to copy root filesystem into the image)
        |           +-- post_image.sh
        |           +-- rootfs_overlay/ (everythin here will be copied in the final image)
        |           |   +-- etc/
        |           |   +-- <some file>
        |           +-- patches/
        |               +-- foo/
        |               |   +-- <some patch>
        |               +-- libbar/
        |                   +-- <some other patches>
        |
        +-- configs/
        |   +-- <boardname>_defconfig (buildroot config for our board)
        |   +-- uClibc.config (optional)
        +-- patches/
        |   +-- (here patches to be applied)
        |
        +-- Config.in (if using a br2-external tree)
        +-- external.mk (if using a br2-external tree)
        +-- external.desc (if using a br2-external tree)
        
      • To use an external tree invoke buildroot like this: make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • To save buildroot config to our external tree: make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
  • PINсопротивление GNDсопротивление VCCVПримечания
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V1.6-3.3V при загрузке - TX
    3INFOhm (мультиметр 1)INFOhm (мультиметр 1)3.3V0V при загрузке - RX
    40Ohm30kOhm0VGND
    PINсопротивление GNDсопротивление VCCVПримечания
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    • Пример

      PINсопротивление GNDсопротивление VCCVПримечания
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (мультиметр 1)INFOhm (мультиметр 1)2.1VВысокий импеданс, TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (мультиметр 1)INFOhm (мультиметр 1)0VНе подключено?
      75.7kOhm5.7kOhm3.3V
      8INFOhm (мультиметр 1)INFOhm (мультиметр 1)0VНе подключено?
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • Совместимая распиновка JTAG найдена: Altera Byteblaster
  • Mount
  • Check Custom kernel headers series to $DEVICEKERNELVERSION
  • Set Linux version to $DEVICEKERNELVERSION
  • Check C library to $DEVICECLIBRARY
  • Check $DEVICECLIBRARY version to $DEVICECLIBRARY $DEVICELIBRARYVERSION
  • Check Enable large files
  • Check Enable IPv6
  • Check Enable RPC
  • Check Enable WCHAR
  • Check Thread library implementation to linuxthreads
  • Check Thread library debugging
  • Check Build cross gdb for the host
  • Check TUI support
  • Check Python support
  • Check GDB debugger version to $LATESTGDBVERSION
  • System configuration
    • Check Passwords encoding to MD5
    • Check Init system to $DEVICEINITSYSTEM (or BusyBox)
    • Check /dev management to Dynamic using devtmpfs only
    • Check /bin/sh to Busybox default shell
    • Check Install timezone info
  • Kernel
    • Set Kernel version to $DEVICEKERNELVERSION
    • Check Kernel binary format to vmlinux
  • Target packages
    • Compressors and decompressors
      • bzip2 and xz-utils
    • Debugging profiling and benchmark
      • Check gdb and full debugger
    • Development tools
      • What you will need
    • Filesystem and flash utilities
      • mtd, jffs2 and ubi/ubifs tools (or what you will need)
    • Libraries
      • In general what you need (suggestions below)
      • Crypto
        • libsha1
        • libssh2
        • openssl
      • JSON/XML
        • expat
        • json-c
  • Networking applications
    • rsync and what you need
  • Shell and utilities
    • file
  • Filesystem images
    • ext2
  • Host utilities (not about target device, we are talking about host device here)
    • host mtd, jffs2 and ubi/ubifs tools
    • host util-linux
  • Memory technology device (MTD) support
    UBI - Unsorted block images
    Enable UBI
  • File systems -> Miscellaneous filesystem -> JFFS2 support
  • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
  • Save
  • To save kernel config to our external tree: make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
  • To save uClibc config to our external tree: make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig