Делаем из обычного hdd внешний при помощи переходника sata usb

Находка № 3

Листая код в дизассемблере, добавляя комментарии, можно найти конструкции сложнее, чем запись числа в регистр. Так мне попался интересный обработчик, часть которого на С, выглядела как .

Обработчик команды из регистра с адресом 0x800F

Понимая, что где-то обязательно должны обрабатываться SCSI-команды, я стал среди них искать байты, с которыми на рисунке выше сравнивается содержимое регистра с адресом 0x800F. Оказалось, что первые четыре ветки проверяют команды Read(10), Write(10), Read(16), Write(16). Сомнений в том, что это обработчик команд SCSI, больше не осталось. Далее я просмотрел функцию, которая вызывается в случае, если пришедшая команда не Read/Write (u_Switch). Она, в зависимости от байта в регистре с адресом 0x16A (значение взято из 0x800F), считывает адрес, на который мы попадем при выходе их этой функции. Это похоже на .

Switch SCSI-команд

Так как я уже определил байт, с которым сравниваю пришедшую в адаптер SCSI-команду, то быстро расставил соответствие адресов по командам. Так, например, на рисунке выше видно, что если бы в регистре с адресом 0x16A оказался байт 0x1A, то после выхода из функции u_Switch мы бы перешли по адресу 0x1B85. Интересно, что не все байты, с которыми происходит сравнение в u_Switch, были определены в стандарте SCSI. То есть адаптер может обработать байты 0хЕ6 или 0xDF, но они не закреплены стандартом.

Как видим, адаптер может выполнять кастомные команды и для них есть функции-обработчики.

Страница 13 из Universal Serial Bus Mass Storage Class

Обратим внимание на смещение 0x0F относительно адреса 0x8000. Перед обработчиком именно из регистра с адресом 0x800F считывается команда SCSI

Если внимательно прочитать таблицу на рисунке выше, то можно увидеть, что в Command Block Wrapper (CBW) поле CBWCB тоже имеет смещение 0x0F. Получается, что адреса RAM-памяти ASM1051, начиная с 0x8000, могут быть USB-буфером, как показано в таблице ниже.

Адрес памяти Описание
0х8000-0х8003 dCBWSignature (USBC – в случае получения пакета)
0х8004-0х8007 dCBWTag
0х8008-0х800B dCBWDataTransferLength
0х800C bmdCBWFlag
0х800D bCBWLUN
0х800E bCBWCBLength
0х800F-0х801F CBWCB – SCSI-команда и ее параметры

На рисунке ниже показан участок кода, где происходит сравнение со строкой USBC (такой должна быть сигнатура dCBWSignature) и расположена предполагаемая сигнатура с адреса 0х8000. Думаю, этого достаточно, чтобы убедиться в том, что USB-буфер расположен в RAM-памяти начиная с 0х8000.

Проверка поля dCBWSignature на совпадение со строкой USBC

Выводы:

  1. МК ASM1051 умеет обрабатывать не только SCSI-команды, которые описаны в стандарте.
  2. Начальный адрес USB-буфера – 0х8000. SCSI-команда располагается в регистре с адресом 0х800F, значит дальше будут приходящие данные/аргументы команд.

Находка № 5

Кроме недокументированных команд, было интересно взглянуть на обработчики стандартных команд.

Перемещение третьего бита из регистра 0хС884 в седьмой бит регистра 0x8002

В обработчике SCSI-команды MODE SENSE(10) есть одна интересная проверка. На рисунке выше показана часть кода функции. Видно, что из регистра 0хС884 происходит чтение третьего бита. Потом значение этого бита выставляется в регистр по адресу 0х8002.

Интересно тут то, что регистр 0хС884 нигде в коде не инициализируется, значит, скорее всего, он аппаратный.

Таблица 362 из SCSI Commands Reference Manual

Кроме того, если посмотреть документацию на SCSI-команду 0х5А (MODE SENSE), становится ясно, что USB-SATA-адаптер должен отвечать на запрос MODE SENSE. Третий байт ответа содержит седьмым битом WP (Write Protect – защита от записи). Кстати, запись седьмого бита в 0х8002 я уже видел, да и смещение от начала USB-буфера (0х8000) тут как раз 3.

Вывод:

Исследуемый USB-SATA-адаптер считывает третий бит из аппаратного регистра по адресу 0хС884 и отправляет его на USB-хост как бит WP.

Находка № 6

Аппаратный регистр, найденный во время исследования обработчика SCSI-команды MODE SENSE, очень похож на GPIO. Чтобы это подтвердить, я решил прикасаться к ножкам ASM1051 резистором под напряжением и читать значение регистра (SCSI-командой 0хЕ4) с адресом 0хС884. Для этого я написал скрипт на Python, использующий кастомные SCSI-команды, который мониторит значение в регистре 0хС884 и выводит его на ПК.

Биты 0xC884 7 6 5 4 3 2 1
Ножка ASM1051 37 9 10 45 44

После проведения подобного эксперимента я составил таблицу, в которой отобразил, какие биты в регистре 0хС884 изменялись при касании ножек ASM1051 резистором. Получается, что исследуемый регистр тесно связан с GPIO, но попытка записи в него (SCSI-командой 0хЕ5) успехом не увенчалась – значение не менялось.

Тогда я решил, что этот регистр либо только для чтения, либо где-то запрещается в него запись на аппаратном уровне. Если бы, например, ножки МК были изначально настроены только на чтение, тогда, наверное, и запись в регистр 0хС884 могла бы быть недоступна.

В общем, для того чтобы найти регистры, связанные с GPIO, я пробежался по коду начальной инициализации МК. Выписал все регистры, адреса которых близки к 0хС884. Таких у меня получилось около 10. Напоминаю, что десятая ножка МК подключена к светодиоду на плате, она соответствует второму биту в регистре 0хС884. Это сократило список из десяти подозреваемых регистров до одного – 0хС880, так как в нем устанавливается второй бит во время инициализации МК (видимо, пин настраивается как выход). Факт интересный, но мое предположение, что регистр 0хС880 отвечает за настройку направления порта (вход/выход), а регистр 0хС884 содержит значение порта, нужно все-таки проверить.

Во время работы адаптера я записал единички в 0хС880 на места тех битов, которые в регистре 0хС884 связаны с ножками МК. После этого изменение регистра 0хС884 стало возможным. К тому же его изменение соответствовало логическим уровням на ножках ASM1051.

Вывод:

Есть возможность использовать GPIO на ASM1051. Регистр с адресом 0хС880 содержит настройку вход/выход для порта I/O. Регистр 0хС884 содержит значение порта I/O.

Находка № 5. Продолжение

После исследования GPIO-регистров стало ясно, что 45-я ножка МК связана с первым битом в регистре с адресом 0хС884. Именно первый бит из этого регистра влияет на значение бита WP, который отправляется по USB. Теоретически можно попробовать менять значение на 45-й ножке МК и ожидать, что запись на HDD, подключенный через адаптер к ПК, будет невозможна.

Попытка изменить текстовый файл на HDD, после подачи логической единички на 45-ю ножку МК

Проверить это было совсем просто. Тем же резистором я подтянул к GND 45-ю ножку МК и попробовал открыть файл, внести изменения и сохранить на HDD. Результат представлен на рисунке выше.

Вывод

Воздействием на 45-ю ножку ASM1051 можно включать и выключать защиту от записи на HDD.

Разработка собственного устройства

На этом этапе я закончил исследование USB-SATA-адаптера. Во время реверса ПО была найдена возможность удобного обновления прошивки ASM1051. Также я узнал, какие чек-суммы нужно посчитать, чтобы МК принял новую прошивку. Мне стало известно, как настраивать и управлять GPIO. А самое интересное – на ASM1051 есть ножка, при воздействии на которую можно защитить от записи HDD. Учитывая, что профильное направление, по которому я учусь («Проектирование и технология производства электронной аппаратуры»), тесно связано с разработкой электроники, было решено, что часть стажировки я могу посвятить разработке собственного USB-SATA-адаптера на основе ASM1051.

Признаюсь, что на первой итерации разработки платы была допущена ошибка с footprint для ASM1051, так как я взял размеры из datasheet на ASM1053. Он оказался немного меньше МК, но для проверки работы устройства я припаял ASM1051 на коротких проводках.

ASM1051 припаян на проводках к плате

Старшие коллеги мне напомнили, что следовало бы для начала создать 3D-модель платы, а затем собрать образец.

3D-модель разработанной платы и фотография собранного образца

В данное устройство была добавлена кнопка с фиксацией для управления функцией WP. Неиспользуемые GPIO ASM1051 выведены на внешний разъем так же, как и UART. Кроме того, добавлена кнопка отключения питания для SATA, чтобы была возможность перезагрузки HDD. Неудобный и вечно вываливающийся разъем USB 3.0 Micro-B заменен на более современный Type-C. Некоторым HDD может быть мало питания по USB, а для HDD 3.5″ необходимо +12 В, поэтому на разработанной плате есть возможность подключать внешнее питание от 12 до 21 В. Ниже представлена фотография собранного устройства.

Фотография разработанного устройства в корпусе

Заключение

В завершение этого наивного для профессионалов повествования, хотелось бы подвести небольшой итог моей стажировки.

За очень короткое время мне удалось немного проникнуть за кулисы реверс-инжиниринга, область не очень освещенную, но жутко интересную. Большим плюсом стажировки был дружный и высококвалифицированный коллектив «НТЦ «Вулкан», который всегда мог помочь и пролить свет на интересующие темы. На меня было потрачено много сил и времени, за что всем причастным выражаю огромные благодарности.

Как мне кажется, я прошел все (ну, или почти все) этапы исследования embedded-устройств. Конечно, мне помогали, направляли и наставляли намного более опытные исследователи. Все время меня не покидало чувство, что знаю я мало, а необходимо знать все, наверное, именно поэтому направление реверса стало столь желанным для меня.

За время стажировки я прочитал много документов, стандартов и datasheets, пытался выцепить важные вещи, чтобы их применять

Но уже на второй неделе я понял, что в реверсе важно ВСЕ!

Raccoon Security – специальная команда экспертов НТЦ «Вулкан» в области практической информационной безопасности, криптографии, схемотехники, обратной разработки и создания низкоуровневого программного обеспечения.Мы постоянно проводим такие индивидуальные стажировки и будем благодарны, если вы поделитесь ссылкой на эту статью с теми, кому это может быть интересно.Оставить заявку на прохождение стажировки можно тут.

Для чего нужен переходник?

Для чего можно использовать такой адаптер? Это именно тот инструмент, который понадобится в случае сбоя жесткого диска. Если дело пойдет не так с HDD, есть большая вероятность того, что компьютер перестанет загружаться. В таком случае придется заменить диск, но при этом будет утеряна информация, которая хранилась на предыдущем накопителе.

Если HDD частично поврежден, то это еще не значит, что все файлы на нем утеряны безвозвратно. Используя адаптер USB на SATA, вы, скорее всего, сможете восстановить большинство своих данных. Даже если диск не инициализируется, есть множество бесплатных программ, которые позволят просканировать разделы и обнаружить любую информацию, подлежащую восстановлению.

Сбой оборудования — это не единственная причина для использования адаптера. Например, пользователь может захотеть перейти на более вместительный и быстрый накопитель SSD. С помощью адаптера удастся перенести все старые данные на новый диск самостоятельно, не обращаясь за помощью к специалистам. Кроме того, HDD стали невероятно дешевыми. Любой пользователь, который регулярно обновляет свой компьютер, обычно имеет как минимум 1 накопитель с объемом более 500 Гб. С помощью этого простого адаптера можно будет превратить HDD во внешний диск, чтобы получить доступ к старым файлам.

Находка № 4

Зная, что МК может обработать нестандартные команды, захотелось узнать, что же они делают. Большинство из них мне достаточно быстро покорилось. Не буду приводить исследование кода этих команд, так как это долго и может быть материалом для отдельной статьи с названием «Ассемблер – это просто», опишу полученные результаты в таблице ниже.

SCSI-команда Описание команды
0хЕ0 Позволяет прочитать первые 0х80 байт из ПЗУ. В дальнейшем эту часть памяти я буду называть преамбулой (да, те самые 0x80 байт, в которых есть строчки и )
0хЕ1 Записывает первые 0х80 байт в ПЗУ
0хЕ3 Записывает в память ПЗУ с 0х80 адреса любое количество байтов. В качестве аргумента (как оказалось) передается размер посылки
0хЕ4 Позволяет прочитать блок байтов RAM-памяти ASM1051. В качестве аргумента принимает начальный адрес и количество байт, которое читаем
0хЕ5 Записывает один байт в RAM по адресу
0хЕ7 Читает последний принятый пакет в ATA-буфер
0хЕ8 Перезагружает устройство

Признаюсь, что не все команды я разгадал путем чтения функций в IDA. Уткнувшись во время исследования в стену, вспомнил, что видел ПО и много прошивок для ASM1051, когда искал документацию на него. С использованием найденного софта можно обновить прошивку и перезагрузить устройство. Поэтому я решил, что самое время воспользоваться Device Monitoring Studio и посмотреть, что же отправляет ПК на адаптер во время обновления.

Таким образом, удалось понять, как происходит процесс обновления прошивки: сначала отправляется преамбула (командой 0xE1), далее командой 0хЕ3 записывается код, затем все это шлифуется перезагрузкой (команда 0хЕ8). Для быстрого и удобного обновления я написал скрипт на Python, который вставляет в преамбулу нужные строки, затем считывает чек-суммы и обновляет устройство. Теперь мне уже не нужен эмулятор, я получил возможность заливать прошивку в ASM1051 через USB, можно вернуть родное ПЗУ на плату.

Выводы

Чтобы обновить прошивку, необходимо выполнить последовательно три SCSI-команды: 0xE1, 0хЕ3 и 0хЕ8.

Находка № 2

Во время рассмотрения и комментирования функций я обнаружил, что очень часто в коде используется функция PRINTF (я так назвал ее). Интересно в ней то, что перед ее вызовом в регистр R7 записывается печатный символ.

Функция PRINTF в IDA Pro

Сама функция была представлена на рисунке выше. Давайте разберемся с ней. Первым делом нужно переместить значение из регистра с адресом 0x7F6 в аккумулятор. Если там оказался ноль, то выходим из функции. Самое интересное происходит, если там окажется не ноль. Тогда значение регистра R7 перемещается в регистр с адресом 0xC001, а, как мы помним, перед вызовом этой функции в R7 записывается печатный символ. Далее следует проверка, равно ли значение в R7 коду символа «.» или «-», если нет, то выходим из функции. А вот если сравнение оказалось удачным, то функция берет значение из регистра с адресом 0x16A и перемещает его в 0xC001, но делает это хитро. Например, вместо байта 0х41 (символ «А» в ASCII) функция переместит в 0хС001 байт 0х34 (символ «4» в ASCII), а потом 0х31 (символ «1» в ASCII). Снова выходим из функции.

Я выяснил, что проверка в начале функции не может быть пройдена, так как регистр с адресом 0x7F6 инициализируется нулем, потом в коде не изменяется. То есть данная функция отключена программистом, хотя и осталась скомпилированной. То, что в регистр 0хС001 только записываются байты (а иногда по два подряд), натолкнуло на мысль, что это, скорее всего, аппаратный регистр.

Все это напоминает UART. Чтобы выяснить, так ли это, необходимо сделать следующее:

  1. Определить ножки на ASM1051, куда выведен UART.
  2. Определить параметры UART (скорость, четность, количество стоп-битов).
  3. Хорошо бы включить UART в коде (судя по всему, он выключен).

Выглядит все достаточно просто: можно по очереди прикасаться к ножкам логическим анализатором и искать ту, на которой будет виден момент посылки UART. При наличии сигнала скорость можно определить по времени импульсов. С остальными параметрами тоже все понятно, достаточно лишь увидеть момент посылки байта на анализаторе.

Чтобы «включить» данную функцию, можно записать нули вместо первых трех строк, где выполняется проверка значения в регистре с адресом 0х7F6. Для этого еще раз открываю прошивку в WinHex.

Выделены шесть байтов, которые нужно обнулить

В редакторе меняю нужные шесть байтов на нули. Теперь прошивка готова и ее можно загрузить в эмулятор ПЗУ. Если предположить, что функция для вывода байтов в UART включена, а ее вызов расположен очень часто по всему коду, то можно ожидать, что байты должны «полететь» из UART при работе адаптера. Надеюсь увидеть трейсер, который сигнализирует байтами в UART о том, какая часть кода исполняется.

Как я уже писал выше, для того чтобы найти нужные ножки Rx и Tx, можно смотреть логическим анализатором по очереди все. Однако я предположил, что Rx и Tx на ASM1051 находятся там же, где и у ASM1053 – ножки 40 и 41 соответственно. Прикладываю щуп анализатора к пину 41 (предполагаемый Tx) и вижу что-то похожее на искомый сигнал:

Временная диаграмма с ножки 41 – Tx

Для того чтобы подключить преобразователь USB-UART и наблюдать в терминале приходящие печатные символы, пришлось припаять два тонких проводка прямо на плату адаптера и закрепить термоклеем.

Два проводка припаяны к RX и TX

Немного изучил диаграмму с рисунка «Временная диаграмма с ножки 41 – Tx»: время одного импульса, судя по всему, – 1 мкс, а для шести бит – 6,3 мкс. Пересчитав значение в боды, получил около 950000 бод, ближайшая стандартная скорость UART – 921600 бод. Думаю, такое расхождение получается из-за погрешности измерения логическим анализатором, я взял не самый достойный аппарат, а китайского «малыша». После установки параметров в окне программы Terminal 1.9b я смог наблюдать приходящие байты с МК ASM1051 во время его работы.

Окно программы Terminal 1.9b во время работы адаптера

Вывод:

В МК ASM1051 есть аппаратный модуль UART. Регистр для отправки данных имеет адрес 0хС001. Скорость передачи данных – 921600 бод. Имеется один стоп-бит. Ножка 41 – Tx, а 40 – Rx (хотя это не точно).

Anker USB 3 to SATA Converter

Не все устройства SATA USB одинаковы. Некоторые используют устаревший стандарт, который негативно влияет на пропускную способность. Другие могут оказаться несовместимыми с новыми типами дисков. Существуют разновидности адаптеров, которые выгодно отличаются от остальных

В первую очередь стоит обратить внимание на Anker USB 3 to SATA Converter Adapter Cable

Переходник USB to SATA от Anker — это простое устройство, которое хорошо выполняет свою работу. Адаптер оснащен только самым необходимым оборудованием, и в нем нет никаких лишних компонентов. Разработчики сделали все возможное, чтобы устройство превосходно справлялось с возложенной на него задачей. Переходник USB SATA представляет собой черную прямоугольную коробку. Благодаря этому его можно положить на ровной поверхности, предотвращая отсоединение накопителя во время использования.

С задней стороны устройства можно подключить 2 кабеля: USB 3 для передачи данных и опциональный шнур питания для использования с мощными приводами. Кабели надежны и долговечны, что делает этот адаптер полезным, даже если расстояние между компьютером и устройством SATA 2 небольшое (в результате чего провода находятся в согнутом состоянии). Благодаря своему безупречному дизайну устройство будет отлично смотреться в офисе или мастерской по ремонту цифровой техники.

Возможности переходника от Anker

В отличие от некоторых других адаптеров на рынке, Anker оснащается аппаратным контроллером SATA 3. Если устройство полагается на программное обеспечение для преобразования сигналов, то это может привести к проблемам с производительностью и совместимостью. К счастью, используемый аппаратный контроллер Anker является стандартным, и он был тщательно протестирован с различными устройствами. Это означает, что практически любой компьютер или диск, который можно физически подключить к этому переходнику, будет работать. Благодаря встроенному адаптеру питания устройство поддерживает как 2,5-, так и 3,5-дюймовые диски.

Порт USB 3 способен выдавать лишь относительно небольшое количество энергии. Этого достаточно для питания компактных 2,5-дюймовых дисков и накопителей SSD. Но для 3,5-дюймовых устройств понадобится немного больше энергии, и в такой ситуации поможет адаптер питания. Что касается совместимости, то можно использовать жесткие диски, SSD, приводы Blu-Ray, DVD-рекордеры и комбинированные накопители. Адаптер работает практически со всеми операционными системами от Microsoft, начиная с Windows 98 и заканчивая Windows 10. Также поддерживается Mac OS. Теоретически, нет никаких оснований считать, что адаптер SATA в USB откажется работать с Linux, но официально эта система не поддерживается.

Благодаря интерфейсу USB 3 передача данных происходит по ускоренной процедуре. Теоретический предел составляет 5 Гбит/с, но добиться этого на практике довольно сложно. При использовании SSD скорость чтения обычно составляет около 350 Мбит/с, а скорость записи — примерно 250 Мбит/с. Рекордные темпы передачи данных можно получить только в том случае, если вы используете самые быстрые SSD, доступные на рынке. В случаях с обычными жесткими дисками ПК максимальная скорость составляет 120 Мбит/с для чтения и 100 Мбит/с для записи. В данном случае снижение пропускной способности через USB связано не с адаптером, а с устаревшей технологией HDD.

На этом переходнике не так много дополнительных функций, ведь простота — это его главное достоинство. Операционная система не распознает его, как адаптер, а просто видит стандартный внешний накопитель через USB. Это означает, что все встроенное программное обеспечение для резервного копирования будет работать без сбоев. Вы сможете использовать любую программу для восстановления данных или создавать образы без каких-либо специальных драйверов и настроек. В связи с отсутствием драйверов переходник SATA USB будет работать в безопасном режиме, и это делает его идеальным для диагностики и ремонта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector