реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Перевод дизассемблера обратно в исходник
gem
сообщение Jun 13 2018, 15:08
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674



Приветствую Уважаемые!
Есть дизассемблированный код процессора pic18ф4620/2620, пытаюсь собрать исходник обратно с помощью МПЛАБ IDE МPASMWIN, чтобы потихоньку разбираться что к чему и как работает.
Естественно вылазит куча ошибок.
Самая распространенная это Error[126] 32273 : Argument out of range (8423 not between FC00 and 03FF). В коде данных строк стоит переход BRA 720.
Про команду эту почитал, и вроде метка есть L720. Но ругается я так понимаю на диапазон. Как узнать почему ?
Та же ошибка, только тут уже не нравиться RCALL
L1903 RCALL 987
NOP
BRA L1850
BRA L1851
NOP
NOP
BNC L1852.

и еще

Error[126] 27724 : Argument out of range (9FF8 not between 0000 and FFFF) // CALL 0x0F9FF8,FAST
Error[126] 27769 : Argument out of range (D29A not between 0000 and FFFF) // GOTO 0x1ED29A


Понятно что, тут возможно код так дизассемблировался и в идеале он уже не тот, но все же 80% кода собирается и выглядит один в один с исходником хекса, если все убрать где начинаются это ошибки. Помогите исправить, чтобы программа компилировалась.

https://mega.nz/#!FMZlGLzZ!EtARv8iv...7F1VN1M4MkJKPFA

Сам код.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jun 13 2018, 15:52
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Встроенные в IDE дизассемблеры, как правило, не обладают хорошим интеллектом, поэтому спотыкаются об секции с данными, таблицами и тому подобным. И начинают дизассемблировать данные как код. Ессно получается лабуда.
Тут нужно или глазами эти куски смотреть, или применять сторонние интерактивные дизассемблеры.
Go to the top of the page
 
+Quote Post
gem
сообщение Jun 13 2018, 15:55
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674



Тут использовался не встроенный в МПЛАБ дизассемблер, с ним многие говорят что код получается нормальный, ничего подобного. Для дизассемблера использовался не он, как раз сторонний.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 13 2018, 17:44
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 002
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



IDA. Посмотрите, возможно есть PIC.
Более удобного софта не встречалось.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 14 2018, 05:46
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 045
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Baser @ Jun 13 2018, 18:52) *
Тут нужно или глазами эти куски смотреть, или применять сторонние интерактивные дизассемблеры.

А лучше (в 99% случаев, как мне представляется), проще, надежнее и дешевле - нанять специалиста, который напишет программу для этого ПИКа заново, с нуля. Идея с дизассемблированием и последующей перекомпиляцией крайне неудачна, ИМХО. Если, конечно, речь не идет о простейшем проекте вроде светодиодной мигалки ...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 14 2018, 06:27
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 659
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kovigor @ Jun 14 2018, 08:46) *
Если, конечно, речь не идет о простейшем проекте вроде светодиодной мигалки ...

А в этом случае тем более проще с нуля написать. Чем ковыряться в много-десятко-килобайтной инициализации чего-нить посредством PICо-HALа, в которой потеряется само мигание на пару десятков команд. rolleyes.gif
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 14 2018, 09:38
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 002
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Посмотрел листинг. Всего - около 500 страниц текста. Если убрать NOP - примерно 250.
Если есть возможность выделить код и данные, а также обработчики прерывания, возможно удастся сократить еще в несколько раз.
Ошибки могут лезть по причине "отработки" дизассемблера по участку данных, строк-литералов. Естественно, получается бредо-код.
Поэтому сперва просмотрите хотябы bin-образ прошивки в символьном виде напредмет нахождения литералов. В ASM этот блок пометьте как массив данных.
---------
Возиться с этим имеет смысл, если проект изначально писан на ASM и прикладная задача нетривиальная.
Если это код С(++) то лучше переписать.
ТС, какая прикладная задача прошивки ?
Go to the top of the page
 
+Quote Post
Smen
сообщение Jun 14 2018, 11:20
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 192
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081



Цитата(k155la3 @ Jun 13 2018, 22:44) *
Более удобного софта не встречалось.

Да без разницы.
Любой дизассемблер не умеет отличать области кода от данных, таблиц и т.п.
Go to the top of the page
 
+Quote Post
gem
сообщение Jun 14 2018, 14:24
Сообщение #9





Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674



В этом все и дело, сам код без проблем компилируется, а вот блок данных нет, именно в нем ошибки и идут. Как их вернуть в исходное или рабочее состояние. Код написан на АСМе, с данными там вообще не понятка, т.к если смотреть по IDA то видно слова типа "Подключение к БД", Меню и т д... Соответственно без данных программа включается, но не работает как надо и соотвественно 20% кода который компилируется в hex получается лажой.

Сообщение отредактировал gem - Jun 14 2018, 14:26
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 14 2018, 15:45
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 002
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



литералы смотрите в FAR. По адресу или смещению находите эти блоки в IDA (или в вашем исходнике ASM) и помечаете их как данные.
Если литералы не видны - возможно юникод.
Если строки сишные - терминатор 0x00.
Компилируете свой ASM.
Из hex-модуля преобразуете в bin-образ памяти флеш.
Сверяете длину "нового" bin-образа с "старым"/исходным-образцом.
Если длина одинаковая - делаете побайтное сравнение fc f_new.bin f_old.bin /b >bin_log.txt
Если совпало - "правка" нового асм-файла корректна. Идем далее.
Если не совпало - смотрим в каком месте и что не совпадает.
и т д,, получаем удовольствие от процесса sm.gif

Go to the top of the page
 
+Quote Post
Smen
сообщение Jun 15 2018, 06:22
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 192
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081



Цитата(gem @ Jun 14 2018, 18:24) *
Как их вернуть в исходное или рабочее состояние.

Помнится проделывал подобное для 51 МК.
В принципе, выше вкратце уже сказали.
Единственно что, данные не обязательно являются текстом, а если являются, то вряд ли в МК будет юникод.
А собственно для чего Вам это надо?
У меня тогда стояла задача дополнить старт устройства дополнительной фичей.
Поэтому, немного разобравшись с программой (по дизасму), сделал в самом начале переход на конец программы (где было свободное место) и там уже написАл необходимую вставку с возвратом в точку перехода.
Дальше уже более для интереса, нашёл куски текста, указал дизасму адреса, дизассэмблировал.
Опять засунул в ИДЕ (точнее не весь, а только обновлённые куски, так как по ходу в листинге менял названия меток и добавлял коментарии), стал анализировать программу и находить блоки данных.
По-новой в дизасм и т.д.
Периодически, после изменений АСМа, компилировал в BIN и сверял с исходным (пользовался вот программкой Dronf).
И, да! Удовольствие получил обалденное. biggrin.gif
Go to the top of the page
 
+Quote Post
gem
сообщение Jun 15 2018, 16:09
Сообщение #12





Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674



Чтобы что-то дополнить нужно исходник иметь, для этого и делается, плюс для себя поразбираться в коде. Просто хочется сделать готовый исход, который можно будет править и добавлять в него. В Hex новое не запихнешь sm.gif Данные то понятно они там есть точно, в сам процесс вникнуть не могу пока. Как данные пометить ? Нашел, да данные и текст даже есть, но не везде. Теперь как мне перенести все это правильно в компилируемый проект?
Под литералами что понимается? Сами данные. Вопросов больше чем ответов sm.gif У меня вообще такое чувство что там типа базы данных. Либо вывод какой-то на дисплей, терминал. Чего изначально нет.
Может тут есть люди которые шарят в этом и могут подсказать как и что. Код на ассемблере был написал.

Сообщение отредактировал gem - Jun 15 2018, 16:15
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 15 2018, 17:10
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 002
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(gem @ Jun 15 2018, 19:09) *
(1)Как данные пометить ? Нашел, да данные и текст даже есть, но не везде. Теперь как мне перенести все это правильно в компилируемый проект?
(2)Под литералами что понимается?
(3)Может тут есть люди которые шарят в этом и могут подсказать как и что. Код на ассемблере был написал.

(1) изучаете ASM для Вашего процессора + сам проц., распределение памяти, портов, адреса векторов прерывания итд.
для абстрактного процессора - примерно так
Код
             org   8000h;  начало сегмента данных, "вычисляется" из дампа, стартовый адрес строки или данных
L_START_MSG:   DS   'LOAD'; сюда переписываем текст из дампа прошивки.
             DB    00h

(2) литерал - набор символов, как правило "читабельных" для вывода на экран, передачи на терминал итп.
Расположены в памяти последовательно, кодировки символов могут быть разные. "закрывающего" последнего символа может не быть (а может быть).
Литерал, за последним символом которого расположен код 00 - это "сишная" строка. (для 1-байтовых символов ASCII)
(3) Если для Вас приемлем (1) и будете отвечать на вопросы, а не "кодироваться".
Go to the top of the page
 
+Quote Post
Марк_Я
сообщение Jun 16 2018, 04:11
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 164
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656



В системе команд PIC18 (как и других PIC-ов) под литералом понимается константа в поле команды.
То есть в команде movlw 0x5C константа 0x5C является литералом. Отсюда и аббревиатура самой команды move literal to working register.

По поводу дизассемблирования.
Автоматические дизасмы - полная фигня. Для восстановления исходника на АСМе из бинарника требуется только текстовая декомпиляция и ПОНИМАНИЕ ФУНКЦИОНАЛА исследуемого прибора. Ну и знание архитектуры МК, естественно.

Как то у меня оказался утерянным последний исходник под dsPIC33, но остался экземпляр живого устройства с открытой прошивкой и исходник предыдущей прошивки. Строк кода - около 3000. Изменения касались лишь примерно 5 % исходника (по сравнению с предыдущим). Я пахал как папа Карло примерно 2 недели. Восстановил, но имена пары флагов так и остались бессмысленными. Примерно понимаю функционал, но сил и времени на эти флаги уже не осталось. Плюнул и оставил их как есть - безымянными.
Это я к тому, что даже свой собственный код с полным пониманием что куда и откуда декомпилировать крайне сложно и долго.
Порой гораздо проще и полезнее написать заново.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 17 2018, 14:40
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 002
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Марк_Я @ Jun 16 2018, 07:11) *
. . . под литералом понимается константа в поле команды.

Перечитал определение из "кладезя мудрости". Если в "двух словах" - различные константы в исходном коде.
(ониже, - в машинных кодах команд). Бинарные константы "смотреть" в дампе достаточно проблематично,
а вот символьные и строковые - вполне комфортно. Поэтому я начинаю "разбор" с них.
Затем - удобно выделять константы во флеш формата float'32 (например массивы, таблицы достаточно легко идентифицировать).
Лично мне (почему-то) литералами бинарные значения float как-то называть некомфортно. Но это - уже психоанализ sm.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2018 - 19:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.00925 секунд с 7
ELECTRONIX ©2004-2016