Здравствуйте!
Пробую тут разобрать прошивку на dfl-600, с целью залить openwrt, готового нет. Пока результаты таковы:
Инфо:
RedBoot(tm) bootstrap and debug environment [ROM]
Red Hat certified release, version 1.92p1 - built 16:07:44, Jan 3 2005
Platform: IXDP425 Development Platform (XScale)
Структура образа:
0: -2b предположительно общая контрольная сумма
-4b версия прошивки
-2b 00 00
-4b длина rootfs
-4b длина kernel
Застрял на этапе вычисления чексумм. Причём, достаточно даже одной, которая вторая, для ядра. Образа, выдранные из родной прошивки, благополучно работают ,будучи залиты напрямую, через загрузчик (redboot). Первую чексумму (общую) мы сделали))) А вот со своим ядром засада. В redboot-e имеется встроенный cksum (32bit posix), думаю, используется именно он, но по каким границам они брали, для подсчёта, и ещё чего туда намешали - неизвестно. Пример загрузки с неверной чексуммой:
RedBoot> fis load kernel
kernel total len = c9ce4 826596
data_checksum != 0
Load firmware from pc to ram !
Каким образом действовать? Можно на примере родных ядер (есть несколько разных из родных прошивок). Но как алгоритм подобрать?
Слишком много вариантов для перебора получается. Целая бесконечность)))
Накидайте, пож-ста, вариантов, которые используют производители в таких случаях. Ну там делить на 256, сдвиг на 3 бита влево с переносом и т.д.)))
Возможно ли победить в принципе, или бесперспективно?
Читайте ЖЖ Пудеева, там правда другая модель, но для общего понимания полезно. Особенно Часть III и дальше.
pudeev.livejournal.com/26499.html
Попадалось это раньше, показалось не заслуживающим внимания в моём случае, так и есть после повторного просмотра))) С исходниками от производителя и медведь в цирке может смочь))) На dfl-600 их уже нету (видимо, давно сошёл со сцены). Рою дальше...
Спасибо за внимание.
Накропал тут скрипт, результата отрицательный((( Видимо, дохлый номер вычислить всё это дело... Аналоги от других фирм у DFL-600 никто не подскажет, может на них исходники найдутся?
#!/bin/bash
if [ -e $1 ]; then
echo 'Error: Filename must be typed'
exit
fi
typeset -i CRC SKIP COUNT MEMCOUNT RSTEP PASS
DIR=/home/globus/mia/FR/distrib/openwrt/img-work
#DIR=/home/globus/tmp/dfl-600/img-work
SKIP=0
IBS=1
COUNT=`wc -c $DIR/$1 | cut -f 1 -d ' '`
MEMCOUNT=$COUNT
RSTEP=0
PASS=0
until [ $RSTEP == 16 ]; do
until [ $SKIP == 24 ]; do
<------>CRC=`dd ibs=$IBS skip=$SKIP count=$COUNT if=$DIR/$1 2>/dev/null | cksum | cut -f 1 -d ' '`
<------>echo $CRC
<------> if [ $CRC == 0 ]; then
<------><------>echo 'Offset from begin: '$SKIP
<------><------>echo 'Length from offset: '$COUNT
<------><------>exit
<------> fi
<------> SKIP=$(($SKIP+1))
<------> COUNT=$(($COUNT-1))
<------> PASS=$(($PASS+1))
done
COUNT=$(($MEMCOUNT-1))
MEMCOUNT=$COUNT
RSTEP=$((RSTEP+1))
SKIP=0
done
echo 'Pass: '$PASS
Спасибо за внимание.
Отправить комментарий