← All posts tagged ARM

Ломаем хаКс полностью. Читаем машинные коды как открытую книгу
Если haXe оттранслирован в C++, а из него — в машинные коды, это может показаться безнадёжным, тем более, на первый взгляд этот код пестрит вызовами виртуальных методов, которые, не запуская отладчик, трудно соотнести с адресами тел методов.

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

Началось соревнование «Make with Ada» для разработчиков встраиваемых систем
AdaCore организует новый конкурс для разработчиков. Как и в прошлые разы, на подготовку даётся существенно больше времени, чем в олимпиадах по иноформатике. Это как раз подходит тем, кому не нравятся соревнования по быстрому написанию страшного кода, который потом только выбросить.

Сегодня на повестке дня — разработка для ARM на голом железе и технологии верификации. Общий призовой фонд — более 8000€.

makewithada.org

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

Повтыкав недельку в код, который получается, если скомпилировать haXe через C++ в ARM, я уже могу нормально смотреть на эти инструкции. Благодаря неявной метаинформации haXe код читаю пока ещё не как открытую книгу, но всё же на удивление много информации получается извлечь. Собственно, самый интересный метод — это hx.Object.__Field, который в каждом классе переопределяется. Находить этот метод можно по VMT. Смещения в VMT я вычислил, вглядевшись в hx/Object.h и отметив там каждый virtual. Дальше у любого другого класса можно находить все те же методы, но __Field — самый интерсный. Если смотреть его реализацию, он сравнивает свой аргумент со всем, что есть в классе, и при совпадении создаёт завёрнутый в Dynamic объект. Если это было поле, он вызывает конструктор, который завернёт число, строку или объект в Dynamic, и так можно понять, по какому смещению и какого типа находится поле. Каждый метод haXe соответствует собственно его реализации в C++, а также есть невиртуальная обёртка, которая на вход получает аргументы типа Dynamic&, и результат у неё тоже Dynamic. В __Field оно идёт подряд — memcmp с названием методом, и если да, то обёртка заворачивается в Dynamic. Смотрим, что внутри обёртки, а там, допустим, в первых строках:

LDR.W R2, [R0,#0xEC]Это значит, что реализация метода будет по смещению EC. Так, прочесав реализацию __Field, можно понять структуру и экземпляров, и VMT. Кроме того, в Dynamic–обёртках для методов делается приведение типов к Dynamic и обратно, и так можно определить типы аргументов и результата. Тип аргумента–объекта видно по вызовам __dynamic_cast. RTTI G++ не богат, но там есть замангленное название класса, а по обратной ссылке (Xref) можно от RTTI перейти к VMT, в VMT найти __Field и тоже проименовать все функции. Таким образом, когда читаешь код метода, можно понять, с объектами какого типа он работает и какие методы аргументов косвенно вызываются. А вот с полями и результатами такое не получается. Надо полагать, в обратном направлении любой объект к hx.Object перед завёртыванием в Dynamic приводится без RTTI, поэтому нет __dynamic_cast, и его точный тип статическим анализом не определить так просто.

IDA грешит тем, что не всегда в теле __Field нормально определяет адреса названий методов и Dynamic–обёрток. Смотришь, а там тупо большие числа, что странно. Ситуацию усугубляет то, что смещения везде относительные. Во многих местах IDA эти относительные смещения нормально просчитывает, но в __Field очень часто почему–то — нет. Лечится Ctrl+R, "_GLOBAL_OFFSET_TABLE_", Enter на каждом странном большом числе.

ARM

russianelectronics.ru
В связи с задержками появления компиляторов для ARM имеет смысл отслеживать разработки и в направлении эмуляции x86 на ARM:
Компания Elbrus Technologies разработала эмуляционное программное обеспечение, которое на 40% обеспечивает собственную производительность ARM-ядер. Инженеры компании рассчитывают на то, что к концу 2014 г. им удастся довести этот показатель до 80%.
У Эльбрус уже имеются аналогичные наработки для архитектуры Sparc, которая используется в их микропроцессорах:
mcst.ru
Возможность исполнения как привилегированных, так и не привилегированных кодов архитектуры x86, включая операционные системы MS-DOS, Windows, Linux, QNX, FreeBSD, без каких-либо дополнительных модификаций на базе системы битовой компиляции. Комфортная работа с современными графическими приложениями (Microsoft Office, Internet Explorer и др., просмотр видео в формате mpeg4 (DivX))

fsf.org

Вольный перевод: В Microsoft опять кого–то хлебом не корми, дай анально огородить что–нибудь. На x86 через BIOS ограничения можно снимать, а на ARM, согласно какому–то Windows 8 logo certification requirements, защита должна быть неснимаемой. В жизни не видел сертификаты Windows logo, но какие–то хомячки за бугром, оказывается, могут ценить его наличие или отсутствие настолько высоко, что вендоры и впрямь могут прогнуться и понавыпускать высокотехнологичных кирпичей, поддерживающих только одну OS. Хотя для ARM до сих пор нет нормальных компиляторов, искуственные ограничения на честно купленном девайсе недопустимы в наши полные либеральности и демократии времена.

secure.wikimedia.org

New features provided by ThumbEE include automatic null pointer checks on every load and store instruction, an instruction to perform an array bounds check, access to registers r8-r15 (where the Jazelle/DBX Java VM state is held), and special instructions that call a handler. Handlers are small sections of frequently called code, commonly used to implement a feature of a high level language, such as allocating memory for a new object. These changes come from repurposing a handful of opcodes, and knowing the core is in the new ThumbEE mode
Если раньше Ада в режиме всех включённых проверок уступала C по скорости, то на этой платформе C будет уступать Аде в надёжности и не предлагать ничего взамен