На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Обнаружение устройств с помощью спецификации CFI

Еще одним полезным качеством для хакера является возможность создания программного кода для сканирования карты распределения памяти (memory map) и обнаружения RAM-устройств. Командой запроса доступа является 0x98, а командой перехода в режим JEDEC ID — 0x90. В базовый адрес устройства записывается код запроса доступа 0x98 плюс смещение 0x55. Устройство должно находиться в ре­жиме чтения. В зависимости от ширины шины, записываемое значение должно быть
0x98, 0x0098 или 0x00000098. Можно также попробовать значения 0x98, 0x9898
или 0x98 98 98 98. Некоторые флэш-устройства игнорируют адрес и переходят в режим запроса, если получат значение 0x98 по шине данных. Базовым адресом также может быть 0x55, ОхААили 0x154h.
После установления режима запроса микросхема должна показать символы QR или QRY по смещению 0x10. Затем следует 16-битовое значение идентификатора поставщика по адресу 0x13. Затем может следовать дополнительная информация об устройстве или поставщике. Использование режима запроса позволяет хакеру точно определить, с каким устройством он имеет дело. Спецификация CFI описана в печати и общедоступна.
Ниже приведен перечень 16-битовых идентификаторов поставщиков.
0
NULL

^
Intel/Sharp

2
AMD/Fujitsu

3
Intel

4
AMD/Fujitsu

256
Mitsubishi

257
Mitsubishi

258
SST

Пример обнаружения флэш-памяти
1. Переводим устройство в режим запроса
A. base+0x55 = 0x98
B. base+OxAA = 0x9898
2. Базовый адрес + 10 == 'QRY1
3. Является ли устройство ОЗУ?
A. Выполняем операцию записи и затем чтение.
B. Если это сработало, возвращаем оригинальный байт.

Определение устройств с помощью режима ID или JEDEC ID
Метод использования режима JEDEC — более старый метод по сравнению с использованием спецификации CFI. Однако некоторые устаревшие устройства могут быть обнаружены именно по этому методу. Определяются производитель и устройство. Ниже приведено несколько фрагментов кода, в которых запрашивается информация JEDEC. Следующий пример кода взят из дистрибутива MTD-Linux6.
/* Сброс */
jedec reset(base, map, cfi);
/* Режим автовыбора */ if(cfi->addr unlock!) {
cfi_send_gen_c.md(Oxaa, cfi->addr_unlockl, base, map, cfi, Ъ CFI_DEVICEraP£j)S§, MOLL);
cfi_send_gen_cmd(0xi§, cfi->addr_unlock2, base, map, cfi,
Ъ CFl_DEVICSTia£^J)iEfi MULL);
}
cfi_send_gen_cmd(0xf0, cfi->addr_unlockl, base, map, cfi, CFI_DEVICET¥PE_M§,
<*> NULL) ; продолжается
static inline u32 jedec_read_mfr(struct map_info *map,___u32 base,
struct cfi private *cfi)
{
u32 result, mask;
mask - (1 « (cfi->deviice_^ypee ** 8)) -1; result - ctfi_read(map/ base) ; result &- mask; return result;
}
static inline u32 jedec_read_id(struct map_info *map,_u32 base,
struct cfi_private *cfi)
{
int osf;
u32 result, mask;
osf - cfi->interleave *cfi->device_type; mask - (I « (cfi->device_tpee ** Bj) result - cfijreadkmap, base + osf); result s- mask;
return result;
}
static inline void jedec_resett((ui332 base, struct map info 'map, struct cfi_private *cfi)
{
/* Сброс */
cf i_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type/ NULL);
/* Несколько некорректно настроенных чипов Intel не отвечают на OxFO, для сброса, поэтому гарантируем, что мы в режиме чтения. Отправляем обе команды для Intel и AMD.
В Intel для этой цели используется Oxff, в AMD Oxff является, командой пор, поэтому все будет нормально.
Ч
cfi_send_gen_cmd(OxFF, 0, base, map, cfi, cfi->devi*e_type, NOLL) ;
/* Производители */
#define MANUFACTURER_AMD 0x0001 #define MANUFACTURER_ATMEL OxOOlf
#define MANUFACTURER FUJITSU 0x0004
4 Этоткодвзятиз файла j edec_probe. с дистрибутива MTD-Linux. —Прим. авт.

tdefine MANUFACTURER_INTEL 0x0089 ♦define MANUFACTURER_MACRONIX 0x00C2 ♦define MANUFACTURER_ST 0x0020 ♦define МАИUFACT URER_S S T OxOOBF ♦define MANUFACTURER TOSHIBA 0x0098
/* AMD */
♦define AM29F800BB 0x2258 ♦define AM29F800BT 0x22D6 ♦define AM29LV800BB 0x225B
/* Fujitsu */
♦define MBM29LV650UE 0x22D7 ♦define MBM29LV320TE 0x22F6
#define MANUFACTURER_INTEL 0x0089
#define MANUFACTURER_MACRONIX 0x00C2 #define MANUFACTURER_ST 0x0020
#define MANUFACTURER_SST 0x0OBF #define MANUFACTURER_TOSHIBA 0x0 0 9 8 • /* AMD */
#define AM29F800BB 0x22i8
#define AM29F800BT 0x22D6
#define AM29LV800BB 0x22iB
/* Fujitsu */
#define MBM29LV650UE 0x22D7 #define MBM29LV320TE 0x22F6 }
В завершение нашего обсуждения относительно аппаратных средств, можно сказать, что микросхемы EEPROM остаются основной областью для записи вредоносного кода. Когда на рынке появится больше встроенных устройств, вирусы для атаки на память EEPROM станут более распространенными и более опасными. Существует совершенно законный код, с помощью которого можно запрашивать устройства EEPROM и выполнять операции. Тем читателям, которые хотят поэкспериментировать с программным кодом для памяти EEPROM, потребуется несколько тестовых машин со встроенной памятью EEPROM. Много материала для экспериментов можно получить из программного кода для драйверов Windows и Linux.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика