Я работаю над проектом, который требует, чтобы я загрузил файл прошивки (.aff) во встроенное устройство с использованием проприетарного протокола. Google показывает, что aff означает расширенный формат файла, но я не уверен, что это означает в этом контексте.Что такое .aff файл
ответ
Предполагая, что формат является «дополненным файлом прошивки», если вы используете Google, вы получите this page. Этот файл, похоже, загружает файл aff и загружает его в контроллер.
Вы можете видеть, что файл начинается с css_header
структуры (128 байт, если я не ошибаюсь), то содержит материал как modulus
, signature
и другие, то есть фактические данные прошивки начинается где на довольно далеко смещение (908 байт от начала файла):
struct css_header {
u32 module_type;
u32 header_len;
u32 header_version;
u32 module_id;
u32 module_vendor;
u32 date; /* BCD yyyymmdd */
u32 size; /* in DWORDs */
u32 key_size; /* in DWORDs */
u32 modulus_size; /* in DWORDs */
u32 exponent_size; /* in DWORDs */
u32 reserved[22];
};
#define KEY_SIZE 256
#define MU_SIZE 8
#define EXPONENT_SIZE 4
/* the file itself */
struct augmented_firmware_file {
struct css_header css_header;
u8 modulus[KEY_SIZE];
u8 exponent[EXPONENT_SIZE];
u8 signature[KEY_SIZE];
u8 r2[KEY_SIZE];
u8 mu[MU_SIZE];
u8 firmware[]; // <--- 908 B from struct start
};
Я бы рекомендовал открыть файл AFf с помощью шестнадцатеричного редактора (например, HxD упоминалось в комментарии выше), а затем искать байтов, которые вы захватили с помощью последовательного наркомана, чтобы увидеть, где они находятся в этом файле. Если приведенные выше данные верны, вы должны найти фактические данные прошивки, смещенные внутри файла.
Спасибо Groo, однако, шестнадцатеричный редактор произвел те же результаты, что и мой код ... поэтому я не вижу ни одного гексагона, похожего на гекса, который я захватил с помощью последовательного сниффера. Теперь я думаю, что перед загрузкой прошивки маска применяется ко всем шестнадцатеричным значениям (через устаревшее программное приложение), и я видел измененные шестнадцатеричные значения. Теперь у меня есть исходный код для устаревшего приложения ... поэтому я считаю, что лучший способ - просто проработать это ... К сожалению, все это написано на C/C++, что не является языком, с которым я очень хорошо знаком. Спасибо за помощь! –
Ключевой информацией, которую я пропускал, было то, что файл, с которым я работал, был на самом деле SRecord. Как только я понял формат SRecord, я смог разобрать правильные данные из записи и успешно загрузить образ прошивки.
Я не вижу шестисимвольную строку в «примере» (т. Е. Часть '{0: X6}'). Кроме того, как вы получаете «xx» из вашего входного файла, если это «часть протокола»? Кроме того, 'BitConverter.ToString' вставляет тире между шестнадцатеричными числами. Вы уверены, что вы должны отправлять байты как 2-символьный hex ascii, а не просто байты? – Groo
То, что я пытаюсь сделать, это создать тот же шестнадцатеричный вывод (с моим кодом), который я захватил, используя мой сниффер последовательного порта при загрузке прошивки с использованием какого-то старого программного обеспечения, которое действительно работает. Выход, который я захватил, представляет собой блок прошивки с «xx» в нем, а «xx» не является частью протокола, который я только что редактировал, поэтому он не содержал фактических данных (по соображениям безопасности). В файле .aff содержится прошивка. Я попытался использовать приведенные выше примеры кода, чтобы преобразовать этот файл в массив байтов и сравнить его с выходом (блок прошивки с xx в нем). –
Как вы можете видеть в предыдущем блоке прошивки, данные начинаются с шестнадцатеричных значений: 0x41, 0x49, 0x43, 0x30, 0x31, 0x00, 0x00 и т. Д. Однако, когда я получаю байты из файла .aff, используя мой код и преобразовать его в hex ... Я не получаю эти значения. –