Перейти к содержанию

Дизассемблирование Прошивок С Микроконтроллеров.


Zombie47

Рекомендуемые сообщения

Столкнулся с тем что в интернете куча уроков по ассмеблеру, и везде мол главное практика, главное писать программы на ассемблере под винду. Так же куча информации по взлому и дизассемблированию программ на винде. используя дебагер и тд.

Но нигде я не нашел информации по анализу для начинающих кода на ассемблере с микроконтроллеров.

Даже просто хотя бы понимать что к чему и как начать и тд.

К примеру скажу сразу что как я выяснил дизассемблером так сказать всех времен и народов является IDA

Думаю данная инфа будет кому то интересна и полезна а кто то наткнется на эту запись с поисковиков.

У меня есть вопросы. Вот я прогнал прошивку через IDA и если для виндовских приложений мы цепляемся за дебагер, запускаем так сказать программу пошагово и смотрим где что выполняется то тут так сделать не получиться и как я подозреваю тут надо работать руками на физическом уровне а именно прозванивать элементы и понимать что как вообще работает хотя бы примерно.

И вот я так и сделал, я прозвонил память еепром до микроконтроллера. И узнал на какие ноги идет. Далее я посмотрел в даташите что это вообще за ноги:

1 нога еепром (CS) звониться на 40 ногу мозга PF10/CS0

2 нога eeпром (CLK) звониться на 226 ногу мозга (PL9/ SCK4/IRQ5)

3 нога еепром (DI) звониться на 157 ногу мозга PB10/TxD4/HTxD0/TO8G

4 нога еепром (DO) звониться на 158 ногу мозга PB11/RxD4/HRxD0/TO8H

Далее я знаю что у меня микроконтроллер считывает информацию с еепром. А делать он это может как я понимаю только по ноге 158, так как она подрублена к DO (выход данных с еепром), тоесть 158 нога является входом данных. Тоесть микроконтроллер должен уметь считывать её состояние. А значит это операция чтения и в даташите ищем к порту B такой регистр, вот он: Port B Data Register (PBDR) Read/Write Operations.

Далее смотрим маску. Обращение к конкретно этому порту PB11 возможно таким способом 0000 1000 0000 0000 (или в HEX это будет 800)

Далее в IDA жмем search->immediate value... и вводим нашу маску 800

и просматриваем все что нашли, маска может применяться и для других регистров.

В итоге я нашел что это маскаmov.w #h'800, применяется совместно с регистром #PBDR_W тоесть используется как раз порт PB11

а так же тут же в этой функции присутствует маска 400 рядом с регистром PFDR_W а это как раз PF10 который идет на CS еепромки.

Вообщем опыта и знаний у меня маловато поэтому и прошу помощи. Однозначно понятно что это не значит что это функция чтения с еепром, но помогите пожалуйста разобраться по шагам что в этой функции твориться, я сам в комментариях тоже попробую.

Ниже вырван кусок кода в котором найдены эти маски и регистры.

ROM:0000E378 eeprom:								 ; CODE XREF: sub_1096A+13DC4p ;название eeprom задал я
ROM:0000E378										 ; sub_1096A+13E66p ...
ROM:0000E378
ROM:0000E378 var_18		 = -h'18 ; какая то переменная как я понимаю
ROM:0000E378
ROM:0000E378				 mov.l r14, @-r15
ROM:0000E37A				 mov.l r13, @-r15
ROM:0000E37C				 mov.l r12, @-r15
ROM:0000E37E				 mov.l r11, @-r15 ; какое то значение @-r15 помещается в r11, r12 и тд
ROM:0000E380				 sts.l pr, @-r15 ;sts это вроде как запись в какое то СОЗУ
ROM:0000E382				 add	 #-8, r15 ; складывается что то с r15
ROM:0000E384				 mov.w #h'E0, r5 ; что то помещается в r5
ROM:0000E386				 mov	 r15, r4 ;
ROM:0000E388				 mov.l #sub_2078, r3
ROM:0000E38A				 jsr	 @r3 ; sub_2078
ROM:0000E38C				 add	 #4, r4
ROM:0000E38E				 mov	 #1, r6
ROM:0000E390				 mov.w #PFDR_W, r12 ; порт PF
ROM:0000E392				 mov.w #h'400, r13 ; маска , по идее PF10 должен быть который подрублен к CS еепромки
ROM:0000E394				 mov.l #sub_4AF4, r14
ROM:0000E396				 mov	 r13, r5
ROM:0000E398				 jsr	 @r14 ; sub_4AF4
ROM:0000E39A				 mov	 r12, r4
ROM:0000E39C				 mov.l #sub_2088, r3
ROM:0000E39E				 jsr	 @r3 ; sub_2088
ROM:0000E3A0				 mov.l @(h'1C+var_18,r15), r4
ROM:0000E3A2				 mov.l #sub_2400, r2
ROM:0000E3A4				 jsr	 @r2 ; sub_2400
ROM:0000E3A6				 mov	 #1, r4
ROM:0000E3A8				 mov.w #PBDR_W, r2 ; порт PB
ROM:0000E3AA				 mov.w @r2, r3
ROM:0000E3AC				 extu.w r3, r3
ROM:0000E3AE				 mov.w #h'800, r1 ; маска которая соответствует вроде как для PB11 который подрублен к DO еепромки
ROM:0000E3B0				 mov.w #h'E0, r5 ; 'р'
ROM:0000E3B2				 tst	 r1, r3
ROM:0000E3B4				 mov.l #sub_2078, r2
ROM:0000E3B6				 movt r11
ROM:0000E3B8				 jsr	 @r2 ; sub_2078
ROM:0000E3BA				 mov	 r15, r4
ROM:0000E3BC				 mov	 #0, r6
ROM:0000E3BE				 mov	 r13, r5
ROM:0000E3C0				 jsr	 @r14 ; sub_4AF4
ROM:0000E3C2				 mov	 r12, r4
ROM:0000E3C4				 mov.l #sub_2088, r3
ROM:0000E3C6				 jsr	 @r3 ; sub_2088
ROM:0000E3C8				 mov.l @r15, r4
ROM:0000E3CA				 mov	 r11, r0
ROM:0000E3CC				 add	 #8, r15
ROM:0000E3CE				 lds.l @r15+, pr
ROM:0000E3D0				 mov.l @r15+, r11
ROM:0000E3D2				 mov.l @r15+, r12
ROM:0000E3D4				 mov.l @r15+, r13
ROM:0000E3D6				 rts
ROM:0000E3D8				 mov.l @r15+, r14
ROM:0000E3D8 ; End of function eeprom

Дополните и поправьте пожалуйста, а то в знаниях дыра =)

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вы не с того начали, мне кажется. Перед тем, как анализировать чужие прошивки, стоит сначала разобраться, как самому написать программу для МК, разобраться, как работать с периферией. Например, для того же обмена с EEPROM скорее всего используется аппаратно реализованный в чипе блок SPI интерфейса, соответственно, в коде будут обращения не к регистрам портов GPIO, а к регистрам блока SPI.

У вас, я так понимаю, МК с не сильно распространённым ядром, что-то специфическое, автомобильное? Боюсь, тогда информации по нему, ориентированной на начинающих, вы не найдёте в принципе. Попробуйте для начала освоить что-то более "мейнстримное", типа STM32, в интернете по нему куча статей и уроков. Если с наскока взять не получится, тогда AVR - он совсем "для детишек" :) И ассемблер у него, в отличие от ARM, проще и понятнее. А когда разберётесь с принципами работы с периферией, стеком, прерываниями - тогда уже штурмуйте анализ чужих прошивок!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ниже вырван кусок кода в котором найдены эти маски и регистры.


ROM:0000E378				 mov.l r14, @-r15
ROM:0000E37A				 mov.l r13, @-r15
ROM:0000E37C				 mov.l r12, @-r15
ROM:0000E37E				 mov.l r11, @-r15 ; какое то значение @-r15 помещается в r11, r12 и тд

Дополните и поправьте пожалуйста, а то в знаниях дыра =)

Я не знаком с мнемоникой АСМ этого контроллера, но традиционно так пишется косвенная адресация.

То есть в данном случае, я полагаю, что R15 - это указатель (скорее всего стека) и это суть есть сохранение РОНов в стек с преавтодекрементом указателя.

Не занимайтесь фигней, уважаемый. Вам совершенно справедливо выше заметили, что не понимая программную модель платформы, лезть в реверс чужой прошивки - пустая трата времени.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Zombie47, из своего опыта скажу, все программы состоят из подпрограмм, подпрограммы для решения определённой задачи одинаковы,

изучив и накопив, опыта в написании подпрограмм, можно переходить к расшифровке чужих программ, отыскивая знакомые кусочки.

Я в начале изучения программирования собирал подпрограммы, которые потом помогали при разборе программ без коментариев.

Удачи.

Я не говорю панацеи - я предлагаю варианты

Ссылка на комментарий
Поделиться на другие сайты

Перед тем, как анализировать чужие прошивки, стоит сначала разобраться, как самому написать программу для МК, разобраться, как работать с периферией.

ну программу я написал понял что к чему. Как работать с перифирей это что?

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

Например, для того же обмена с EEPROM скорее всего используется аппаратно реализованный в чипе блок SPI интерфейса,

нет в SH7055 нету SPI аппаратного.

Боюсь, тогда информации по нему, ориентированной на начинающих, вы не найдёте в принципе.

под каждый МК что уникальная ничем не похожая программа пишется?

насколько я понял все везде одинаково, АЦП что на пик что на авр что еще где то, он и в африке АЦП.

Про стек кучу раз смотрел читал, и тд. Типо область памяти в которую записывается как книги в стопочку складываются а взять можно только верхнее значение, и есть указатель стека. Все круто в теории могу поумничать только толку если не понимаю на кой черт этот стек нужен=))) записать все в ячейки разные и все =)

Мне еще не понятно где в этом коде что то конкретно касающееся именно этого микроконтроллера а где именно общие команды ассемблера.

к примеру что такое mov.l а что такое mov и что такое mov.w в чем отличие?

Что такое r11 и тд? если это относится к микроконтроллеру моему значит я могу найти это в даташите? но я понимаю что не могу.

Что за записи с @?

Что за записи с #8 например?

Я не знаком с мнемоникой АСМ этого контроллера, но традиционно так пишется косвенная адресация.

То есть в данном случае, я полагаю, что R15 - это указатель (скорее всего стека) и это суть есть сохранение РОНов в стек с преавтодекрементом указателя.

Я думаю мой вопрос вообще не будет никак относится к данной платформе.

А зачем вообще указателю стека пихать 4 различных значения подряд?

Изменено пользователем Zombie47
Ссылка на комментарий
Поделиться на другие сайты

Чтобы научиться дизассемблировать, сначала нужно научиться программировать под нужный МК.

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

Где-то посередине может прийти понимание, что исходную прошивку нет смысла восстанавливать до исходного кода, а проще написать свою с нуля.

ЗЫ. В моей практике было нечто подобное: восстанавливал исходный код DLL, написанной на MSVC (исходники утеряны автором). Восстановил все функции, кроме одной, так, что результат компиляции был байт-в-байт. В итоге переписал эту функцию заново, так как имел четкое представление как она должна работать. В результате получилось даже чуть лучше оригинала.

Изменено пользователем marinovsoft
Ссылка на комментарий
Поделиться на другие сайты

Чтобы научиться дизассемблировать, сначала нужно научиться программировать под нужный МК.

можете конкретно объяснить на примере почему не возможно что либо понять в листинге не умея программировать под этот МК?

к примеру я могу объяснить вот так что A+B=124

и вот дизасамблировать данное уравнение и найти А невозможно потому что мы не знаем B. Вариантов бесконечное множество.

Что является неизвестными переменными в листинге?

Ссылка на комментарий
Поделиться на другие сайты

Где-то посередине может прити понимание, что исходную прошивку нет смысла восстанавливать до исходного кода, а проще написать свою с нуля.

Есть четкое понимание что нет задачи восстанавливать исходный код.

Есть пока на данный момент единственная задача, в мк приходит сигнал, он считывает значение еепром и производит сравнение. И если сравнение прошло успешно то выполняет программу. если не успешно то не выполняет программу.

вот я и пытаюсь зацепиться за чтение еепром, зацепиться за нужные порты

Ссылка на комментарий
Поделиться на другие сайты

Ну и к примеру нахожу такие записи cmp/eq #1, r0

cmp/gt r1, r2

а в гугле я не могу ничего подобного найти. Знаю что cmp это сравнение а вот /gt не понимаю что это

Ссылка на комментарий
Поделиться на другие сайты

можете конкретно объяснить на примере почему не возможно что либо понять в листинге не умея программировать под этот МК?

Потому что у каждого микроконтроллерного ядра свой ассемблер и свои команды. В общих чертах они близки (практически всегда mov обозначает пересылку данных, add - сложение, cmp - сравнение), но детали реализации (допустимые операнды, размер пересылаемых данных, способы адресации, затрагиваемые флаги) могут абсолютно различаться. Конкретно по вашему МК читайте, например, здесь.

Ну и к примеру нахожу такие записи cmp/eq #1, r0

cmp/gt r1, r2

cmp/eq Rm, Rn - проверка условия Rn == Rm, cmp/gt Rm, Rn - проверка условия Rn >Rm, результат сохраняется в бите T регистра статуса, смотрите ссылку, там это всё есть.

нет в SH7055 нету SPI аппаратного.

Есть Serial Communication Interface (SCI), он как в асинхронном, так и в синхронном режиме может работает. Скорее всего, через него реализовано.

Есть четкое понимание что нет задачи восстанавливать исходный код.

Есть пока на данный момент единственная задача, в мк приходит сигнал, он считывает значение еепром и производит сравнение. И если сравнение прошло успешно то выполняет программу. если не успешно то не выполняет программу.

вот я и пытаюсь зацепиться за чтение еепром, зацепиться за нужные порты

Так и пишите - желания учиться нет, нужно решить конкретную задачу. Но это в раздел "работа".

Ссылка на комментарий
Поделиться на другие сайты

Потому что у каждого микроконтроллерного ядра свой ассемблер и свои команды.

Вот уже начинаю понимать, я то думал что ассемблер это общепринятый язык, стандартизирован. А оказывается вот оно как.

Так и пишите - желания учиться нет, нужно решить конкретную задачу. Но это в раздел "работа".

не совсем так, я бы сказал нет желания изучать все досконально ради решения простенькой задачи которую человек смог найти за 2 дня.

К примеру я вот не так давно не умел работать на токарном станке с ЧПУ, хоть и учился на это 4 года 10 лет назад. Мне хватило пару месяцев можно сказать с нуля разбираться со станком и тд и тп, спрашивая на форумах и тд и тп.

И сейчас я к примеру смогу человеку объяснить как решить простенькие задачи, как выточить ту или иную деталь, и думаю хватит не больше недели чтобы он смог самостоятельно написать программу и выточить нужную деталь. Хотя я учился на это 4 года, и нихрена не научился так сказать.

Тоесть человеку не нужно будет знать досканально режимы резанья, твердости материалов, типы пластин и резцов. Я смогу ему дать те знания которые необходимы для выточки конкретной детали, а вот далее когда он сможет выполнить эту задачу и будет понимание общего процесса тогда уже можно углубляться во все остальное.

Вы же мне предлагаете сейчас как раз вдоль и поперек изучить режимы резания виды сплавов, виды обработки и тд и тп, просто для того чтобы я смог выточить болтик. Хотя я то знаю что все это не нужно для вытачивания болтика.

Ссылка на комментарий
Поделиться на другие сайты

А я бы не назвал вашу задачу "простенькой". Для современных микроконтроллеров прошивки очень редко пишутся на ассемблере, только критичные к быстродействию или требующие какого-то особого подхода функции (например, переключение задач в многозадачных системах), всё остальное пишется на си, благо компиляторы сейчас решают задачи оптимизации машинного кода не хуже человека. Соответственно, разработчики начального уровня могут вообще не знать ассемблера, и при этом будут успешно создавать работающие программы. Задача уровня "выточить болтик" для программиста МК будет выглядеть примерно как "взять из учебника написанный на си исходник, внести нужные изменения, скомпилировать, прошить микроконтроллер в отладочной плате". Многие вещи при этом остаются за кадром, например, то, как будут передаваться аргументы при вызове функций - в регистрах или стеке, или какие регистры процессора вызываемая функция имеет право произвольно изменять, а какие обязана сохранять в исходном виде. Разбираться в этом - уже уровень не "новичка", а "продвинутого пользователя". Хотя, не привязываясь к конкретной архитектуре, понимать в общих чертах что такое стек, для чего он нужен, и почему он может переполниться, если вложенно вызвать друг из друга несколько функций с большим объёмом локальных переменных, нужно и новичку.

Ваша же задача больше напоминает не вытачивание болтика, а определение марки стали или параметров резца по программе обработки. Поэтому вам и советуют сначала изучить предметную область, чтобы начать ориентироваться в источниках информации и получить представление об объёмах "белых пятен" в знаниях.

Ссылка на комментарий
Поделиться на другие сайты

Я бы не стал путать божий дар с яичницей. Научиться работать на станке с ЧПУ и создавать эти станки - вещи абсолютно разных уровней, так же как и юзать по дисплею смартфона, считая себя продвинутым пользователем и создать этот самый смартфон.

Чтобы искать в прошивке что-либо, надо знать в совершенстве архитектуру МК, работу схемы и программы, заложенной в МК. У Вас просматривается только желание, понимания не видно. Без обид, но в успех Вашей затеи (своими силами) я не верю.

Ссылка на комментарий
Поделиться на другие сайты

Без обид, но в успех Вашей затеи (своими силами) я не верю.

Я не обидчивый =))) в успех моей затеи своими силами я тоже не верю именно поэтому привлекаю кучу сторонних сил, так сказать с миру по ниточке, и вот все по тихоньку больше и больше понимаю.

Ссылка на комментарий
Поделиться на другие сайты

Я не знаком с мнемоникой АСМ этого контроллера, но традиционно так пишется косвенная адресация.

То есть в данном случае, я полагаю, что R15 - это указатель (скорее всего стека) и это суть есть сохранение РОНов в стек с преавтодекрементом указателя.

Я думаю мой вопрос вообще не будет никак относится к данной платформе.

А зачем вообще указателю стека пихать 4 различных значения подряд?

Например в обработчике прерываний для сохранения контекста, а так же при передаче аргументов в функцию (программный стек). Стек широко используется в программировании, как способ экономии памяти и защиты данных.

ЗЫ. Указатель стека ничего никуда не пихает. Пихает программа ПО указателю стека.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...