Easyelectronics.ru

Электроника для всех
Текущее время: 18 дек 2017, 13:57

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 08 июн 2015, 17:08 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
Доброго времени суток всем.
Сразу же оговорюсь, что в деле программирования для микроконтроллеров пока весьма начинающий, потому извиняюсь сразу, если буду кое-где тупить.
Устроился после универа на предприятие по специальности. Программистом для микроконтроллеров. И тут же задали весьма странную задачу: на предприятии есть прибор в разработке, на борту которого стоит ADuC847 (8052-совместимый проц). Задача банальнейшая - пока аппаратчики производят в схеме изменения, в коде нужно менять соответствующие назначения ножек/портов/SFR'ов. Но проблема заключается в том, что программу писал на языке C сторонний программист-фрилансер, от которого остались только прошивка да исходники, которые не компилируются из-за отсутствия нескольких хидеров - есть предположение, что исходники эти явно не являются финальными, да к тому же в них присутствует куча мусора - но дело не в этом. Решил обойти проблему, попробовав дизассемблировать прошивку и затем заново скомпилировать в Keil'e, которым, судя по заявлениям коллег, были сбилдены оригинальные исходники. Нашел дизассемблер d52, написал к нему согласно инструкции таблицу SFR-регистров и разобрал исходник, но конечный *.asm-файл содержит помимо описанных в таблице регистров еще и имена, которые даже не заявлены в даташите (дизассемблер поставлял их вместо операндов во всякие mov, clr, xor и прочие команды асма).
Посему вопрос: подскажите, пожалуйста, есть ли возможность дизассемблировать уже готовую прошивку без каких-либо "повреждений" сегментов программы и непосредственно кода? Я понимаю, что 10к строк асма перелопатить - это дело гиблое, но нужные мне строчки я уже нашел (благо, всего-лишь регистр ADC0CON2 нужно перезаполнить), но в итоге получившуюся кашу скомпилировать обратно просто невозможно. Посоветуйте, пожалуйста, как можно решить такую задачу!
Заранее спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 08 июн 2015, 20:00 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3502
Откуда: г. Липецк
Наиболее вменяемый листинг получал с помощью IDA Pro.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 08 июн 2015, 22:28 
Старожил

Зарегистрирован: 04 янв 2014, 01:30
Сообщения: 208
Код:
еще и имена, которые даже не заявлены в даташите

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 09:58 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
Al-x писал(а):
Компилятор же не знает, как они до этого назывались?


А разве компилятор в машинных инструкциях назначает какие-либо макро-определения? Он же вроде должен оставлять только адреса и стандартные имена периферии (SFR'ы, порты и т.д.). Или я не прав?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 10:04 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
anakost писал(а):
Наиболее вменяемый листинг получал с помощью IDA Pro.


Я им попробовал уже вчера дизассемблировать - разобрал он неплохо, только что-то он с подпрограммами намутил - в итоге программа собирается и зашивается на проц, но даже не работает. И странно даже органихзоована: IDA разделил ее на четыре сегмента, но начало и конец у программы только так, будто бы всего один единственный сегмент кода существует.
Видимо, Al-x прав - самый лучший способ - это дизассемблировать и полученный асмовый код сопоставлять с сишным.

Тогда спрошу помощи: ввиду того, что IDA то ли что-то напутал с сегментами, то ли я чего-то недопонял, может кто-нибудь напомнить, пожалуйста, организацию и способ объявления сегментов программы в семействе процов 8052?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 14:27 
Старожил

Зарегистрирован: 04 янв 2014, 01:30
Сообщения: 208
Цитата:
Он же вроде должен оставлять только адреса и стандартные имена периферии (SFR'ы, порты и т.д.).

Ассемблер да. Я не работал с указанными средами, поэтому не до конца понял смысл фразы сначала.

Об этом речь что ли?
Код:
cseg
org   4000h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 14:55 
Заглядывает иногда

Зарегистрирован: 08 янв 2014, 21:05
Сообщения: 130
В ida удобно будет анализировать код.
Но в данном случае в первую очередь я бы стремился к тому, чтобы дизасемблированная прошивка, байт в байт потом собралась ассемблером. Это будет отправной точкой для изменений. Иначе, фиг его знает что с прошивкой получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 15:12 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
Al-x писал(а):
Об этом речь что ли?
Код:
cseg
org   4000h


Нет, речь, например, о таком:

Код:
mov makstr, R2

При том, что никаких makstr в исходниках сишных вроде как не было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 15:22 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
alert80 писал(а):
Но в данном случае в первую очередь я бы стремился к тому, чтобы дизасемблированная прошивка, байт в байт потом собралась ассемблером. Это будет отправной точкой для изменений. Иначе, фиг его знает что с прошивкой получится.


В том и беда, что прошивка байт в байт не собирается обратно асмом. И, кстати, дело тут не только в том, как IDA дизассемблировал. А еще и в том, что непонятно, как вообще скомпилировался кусок исходников у автора.

Немного отступлю от темы к прежним попыткам скомпилить исходники. Есть такой вот кусок кода:
http://pastebin.com/E1ePYw39
Попытки собрать проект вкупе с другими файлами приводит к следующей ошибке:
error C249: 'DATA': SEGMENT TOO LARGE.
Подозреваю, что дело в том, что скорее всего неправильно объявлен массив ADC_Rx[][]. Но тогда вопрос: как правильно объявить этот массив и как его разместить в памяти проца так, чтобы он за ее пределы не выползал?
Не знаю, какие еще были изменения внесены позже в исходники - все-равно не видел. Но боюсь, что из-за косяков в правильном размещении сегментов программы прошивка и дизассемблируется коряво. По-крайней мере, на данный момент переассемблировать ее удается, но в итоге она не работает, т.к. линковщик выдает warning'и об оверлапе и отсутствующих метках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 15:25 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
З.Ы. Если сишный код покажется слишком уж костыльным - прошу не кидаться тряпками в меня за такое, не я сие пилил. Сам знаю, что не очень-то хорошо сделано, но деваться некуда - что дали, с тем и работаем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 18:41 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
Ладно - вопрос с ассемблированием взломанной прошивки байт в байт решился - пересобранная программа на железе работает. Так что, можно считать, что вопрос решен, и ветку форума можно закрыть. Действительно, лучше всего повел себя IDA в дизассемблировании.
Остался лишь один - побочный вопрос. Так, для себя, неуча, в назидание. Касательно исходников: как правильно нужно такой большой массив данных определять в памяти 8051-х процов? Чтобы не было переполнения сегментов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 09 июн 2015, 20:10 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3502
Откуда: г. Липецк
sdv_cyborg писал(а):
... как правильно нужно такой большой массив данных определять в памяти 8051-х процов? Чтобы не было переполнения сегментов.

Не совсем понятно о каком сегменте и о каком ассемблере для i51 идет речь? Какой то ассемблер определенные сегменты поддерживает, другой их не понимает и т.д. Если речь идет о Кейловском А51, могу дать квалифицированную консультацию...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 10 июн 2015, 00:14 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
anakost писал(а):
могу дать квалифицированную консультацию...


Я был бы весьма благодарен за такую консультацию. Мне еще, вероятно, с Кейлом придется работать, а с ним я совсем не знаком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 10 июн 2015, 01:12 
Заглядывает иногда

Зарегистрирован: 08 янв 2014, 21:05
Сообщения: 130
Массив ADC_Rx[][] займет 1440 байт, хотя легко мог занимать в два раза меньше.
В процессоре 4к памяти, он туда легко влезает.
Проц нестандартный и возможно скрипт линкера, с которым Вы собираете, под меньшую память.
Вопрос в другом - А нужно ли вообще запихивать этот массив в память? Как я понимаю это статические данные для конвертации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 10 июн 2015, 09:52 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
alert80 писал(а):
Как я понимаю это статические данные для конвертации.

Так, собсно говоря и есть.
Потому-то и спрашиваю - как правильнее было бы их объявить, чтобы не было проблем с компиляцией/линковкой?
ДА и в целом - как ВООБЩЕ грамотнее было бы их объявить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 10 июн 2015, 10:43 
Заглядывает иногда

Зарегистрирован: 08 янв 2014, 21:05
Сообщения: 130
Для начала сделать переменную константой - const.
Но в keil, судя по всему для этого не достаточно, надо еще указать сегмент куда ее поместить, а иначе он ее засунет в data.
http://www.keil.com/support/docs/641.htm


Long полностью используется только в значениях напряжения последнем массиве. Можно описать структуру, с short для значения adc и long для напряжения.
Можно для каждого массива хранить множитель напряжения и получать необходимое число перед использованием.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 15 июн 2015, 15:32 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
В общем, вопрос с большим массивом решил, но несколько иначе. Просто засунул его в xdata и объявил эту область в startup файле, благо на этом проце внутри есть 2кб xdata из доступных 16 Мб. Знаю, что коряво, не собираюсь даже спорить, свою вину понимаю. Но сейчас пока пусть будет так, ибо есть другие проблемы с этой программой, но уже они, наверное, не соответствуют теме открытого мною треда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 19 ноя 2015, 14:30 
Здравствуйте!

Зарегистрирован: 18 ноя 2015, 22:40
Сообщения: 1
Будучи студентом на диплом улучшал устройство. Что бы научится и понять основу пришлось дезасеблировать 2к кода.

Делал это так:
Дезасемблерный листинг читал, думал, пытался переименовывать переменные, если думал, что это переменные, превращал в строки, константы, если думал, что это какие-то сообщения, тут же компилировал и сравнивал с существующей прошивкой.
И так несколько месяцев!
После того, как полностью дезасемблировал, "быстро" дописал еще 4к кода )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как правильно дизассемблировать прошивку?
СообщениеДобавлено: 21 ноя 2015, 16:23 
Заглядывает иногда

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 182
Увы, но нескольких месяцев не было на такое задание. Надо было сделать поскорее, а то с прибором они итак протрахались без малого 3 года, пытаясь найти несколько мелких ошибок, программных и аппаратных, которые доводили погрешность измерений прибора до невообразимых 38%
Уже вопрос отпал, т.к. насилу протрясли автора исходной программы.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB