Что такое компиляция и декомпиляция? arduino+

Что такое компиляция и декомпиляция?

Компиляция – это преобразование программы из исходного текстового кода в байт-код.

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

Чтобы протестировать программу на работоспособность, достаточно воспользоваться встроенным интерпретатором кода, который на лету преобразует текстовые команды в машинный код. За пределами среды, разумеется, такая программа функционировать еще не будет: для полноценной работы софта требуется компилятор.

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

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

Декомпиляция – сложный процесс воссоздания исходника из машинного кода, или обратная разработка.

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

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

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

Нередко при компиляции среды разработки применяется метод обфускации (запутывания) кода. В таком случае процедура декомпиляции становится затруднительной или практически невозможной.

Цель декомпиляции – взлом и модификация программы, удаление триала и внедрение вируса. Реже декомпиляция нужна при утере исходников.

Что такое компиляция и декомпиляция? arduino+

Ваша корзина пуста!

  • Главная
  • Статьи
  • Уроки Arduino
  • Уроки Arduino для новичков 1.2.3 Компиляция программы Arduino

Компиляция программы Arduino

На этом уроке мы поговорим о компиляции программы в Arduino >как загружать программу в контроллер, как отображаются ошибки компиляции, которые возможно будут у вас появляться на экране. Так вот насчёт компиляции кода. Если нужна компиляция программы, то есть кросс-компиляция вообще-то, можно выбрать проверку или загрузку. Для этого на панели управления предусмотрены две кнопки: Проверить, Загрузка. Так же их можно найти и в выпадающем меню.

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

Что же происходит, когда вы инициируете компиляцию?

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

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

Если вы взглянёте на следующую иллюстрацию, вы увидите подсвеченное сообщение об ошибке. Я тут показал три строчки кода. Я тут специально нашкодил в коде. Написал белиберду XX. Вы можете видеть, что строчка с белибердой подсвечена розовым. Так как эта строка содержит два символа XX для вызова ошибки,

поэтому и получили ошибку “не правильный синтаксис” (bad syntax). В результате компиляции, получаем ошибку. Сообщение о ней трудно не заметить. В окне сообщений выводится рапорт о нахождении ошибки. Там сказано, что компилятору не нравятся символы “XX”. А так же подсвечивается строка текста программы, где была найдена ошибка. Так что вы можете быстро найти место ошибки в редакторе программы.

Строка с первой по счёту ошибкой в коде подсвечивается розовым цветом. Это очень удобно. Поиск ошибки производится подсвечиванием, а не по номеру строки, которую нужно искать в тексте программы. Увидев строку, подсвеченную розовым, находим первую ошибку в нашем коде.

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

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

Запомните, что синтаксис этого языка подразумевает обозначение конца операнда при помощи точки с запятой. У нас тут ошибка в определённой строке. И мы на ней видим точку с запятой и затем символы XX. При этом компилятор для себя решает, что всё, что находится между двумя точками с запятой, – это один операнд. И для него XX – это должно быть следующей командой. И вот почему выскакивает ошибка, так как компилятор не знает команды XX.

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

Так вот насчёт монитора порта.

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

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

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

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

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

Спасибо за внимание.

Arduino.ru

Настройка компиляции в Arduino >

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

Добрый всем вечер.

Собственно захотелось поиграться с настройкой компиляции. В частности с уровнями оптимизации (O1, Os) и вытащить ассемблерный листинг avr-objdump’ом из файла ELF.

Не нашел, где записана строка с параметрами вызова avr-gcc и можно ли добавить вызов avr-objdump (кроме avr-gcc ещё вызывается avr-objcopy). Пока приходится вручную запускать avr-objdump и скармливать ему ELF.

Может кто знает? Спасибо.

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

Такое ощущение, что это где-то захардкожено.

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

строка с параметрами вызова avr-gcc и

можно ли добавить вызов avr-objdump

Не знаю, я отдельно запускал.

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

Вот спасибо. Похоже эту возможность добавили в новых версиях, начиная с 1.5.*. В старых версиях 1.0.* такого нет.

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

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

В общем разобрался со всем. Расскажу, может ещё кому пригодится. Как уже упоминалось, всё настраивается в файле hardwarearduinoavrplatform.txt

1) Уровень оптимизации меняется в строках compiler.c.flags, compiler.c.elf.flags, compiler.cpp.flags. По умолчанию стоит -Os

2) Автоматический вывод ассемблерного листинга в файл с помощью утилиты avr-objdump делается через хуки (hooks). В platform.txt в секции AVR compile variables добавляем новые строки:

В секции AVR compile patterns , подсекции Create output files (.eep and .hex) добавляем строку:

Декомпиляция apk: туда и обратно

Скорее памятка для себя, чем пост для общественности.

С офсайта https://developer.android.com/studio/index.html забираем Android SDK Tools (ссылка внизу страницы). На данный момент там выложена версия 3859397.

Распаковываем и устанавливаем platform-tools и build-tools для последнего релиза Android. Соответствие имени релиза, версии Android и значению Android API можно посмотреть на https://source.android.com/source/build-numbers

build-tools;25.0.2 | 25.0.2 | Android SDK Build-Tools 25.0.2

build-tools;25.0.3 | 25.0.3 | Android SDK Build-Tools 25.0.3

cmake;3.6.3155560 | 3.6.3155560 | CMake 3.6.3155560

> toolsbinsdkmanager.bat “build-tools;25.0.3” “platform-tools”

Далее получаем на руки apk-шку, которую будем препарировать. Название пакета можно взять из адресной строки браузера, открыв страницу с программой на Play Market. Далее ищем и вытаскиваем архив через adb (root не требуется).

Пусть например, для программы “Sample Foobar” имя пакета будет com.example.foobar

List of devices attached

> adb shell “pm list packages -f -3 | grep com.example.foobar”

> adb pull /data/app/com.example.foobar-1.apk

/data/app/com.example.foobar-1.apk: 1 file pulled. 3.0 MB/s (39955506 bytes in 12.719s)

С сайта https://ibotpeaches.github.io/Apktool/ забираем и устанавливаем apktool, который умеет декомпилировать архив apk в набор файлов и обратно.

> java -jar apktool_2.2.2.jar d -o foobar_src com.example.foobar-1.apk

Декомпилированный код будет в формате smali – синтаксис и краткая справка на офсайте https://github.com/JesusFreke/smali/wiki. Описание команд можно посмотреть на http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html или на официальном сайте Android https://source.android.com/devices/tech/dalvik/dalvik-bytecode

Уже можно изучать исходный код. В Notepad++ можно добавить подсветку синтаксиса smali с https://forum.xda-developers.com/showthread.php?t=2760141, а для IntelliJ Idea недавно вышел плагин https://github.com/JesusFreke/smali/wiki/smalidea, который, по заявлению автора, даже позволяет отлаживать приложение на телефоне через ddms (проверять это я, конечно, не буду.)

Можно облегчить себе изучение кода, попробовав декомпилировать apk в исходный код на Java, но надо иметь в виду, что с вероятностью в 99.5% код получится нерабочий и его невозможно будет скомпилировать обратно в apk. В зависимости от фазы Луны и погоды на Марсе, в таком коде будут присутствовать совершенно дикие конструкции типа for (;;) и тому подобное. Но общую структуру кода можно посмотреть, посравнивать с тем, что есть в файлах smali. Для этого нам потребуется dex2jar отсюда: https://sourceforge.net/projects/dex2jar/ и jd-gui отсюда: http://jd.benow.ca/

> dex2jar-2.0d2j-dex2jar -os -ts -r com.example.foobar-1.apk

На выходе имеем com.example.foobar-1-dex2jar.jar. Запускаем jd-gui и открываем в нем этот jar:

> java -jar jd-gui-1.4.0.jar

Можно изучать код прямо в jd-gui, а можно экспортировать весь Java-код через меню File -> Save all sources.

После того, как поизучали, добавили нужное и удалили ненужное, собираем обратно smali в apk:

> java -jar apktool_2.2.2.jar b -o foobar_unaligned.apk foobar_src

Выравниваем запакованные файлы по 4-байтовой границе:

> build-tools25.0.3zipalign 4 foobar_unaligned.apk foobar_fixed.apk

Если ещё нет своего keystore, то его можно сделать с помощью программы keytool.exe, которая входит в состав JRE:

> keytool -keystore android_keystore.jks -genkey -alias recompile

Далее подписываем apk, используя сертификат из своего keystore. Указываем такое же значение min-sdk-version, как указано в исходнике foobar_srcapktool.yml, в параметре minSdkVersion:

> build-tools25.0.3apksigner sign –ks android_keystore.jks –min-sdk-version 14 foobar_fixed.apk

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

Источники:

http://geekmatic.in.ua/arduino_lesson_123

http://arduino.ru/forum/obshchii/nastroika-kompilyatsii-v-arduino-ide

http://pikabu.ru/story/dekompilyatsiya_apk_tuda_i_obratno_5007651

http://arduino-diy.com/arduino-kvadrokopter-svoimi-rukami

Ссылка на основную публикацию