Jump to content

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


Zombie47
 Share

Recommended Posts

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

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

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

К примеру скажу сразу что как я выяснил дизассемблером так сказать всех времен и народов является 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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 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 - это указатель (скорее всего стека) и это суть есть сохранение РОНов в стек с преавтодекрементом указателя.

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

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

Link to comment
Share on other sites

Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

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

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

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

Удачи.

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

Link to comment
Share on other sites

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

Литиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Edited by Zombie47
Link to comment
Share on other sites

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

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

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

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

Edited by marinovsoft
Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

cmp/gt r1, r2

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

Link to comment
Share on other sites

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

Потому что у каждого микроконтроллерного ядра свой ассемблер и свои команды. В общих чертах они близки (практически всегда 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), он как в асинхронном, так и в синхронном режиме может работает. Скорее всего, через него реализовано.

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...