Кое-что об устойчивости и защищенности Windows CE на ARM-платформе.

Надеюсь, не найдется человека, который никогда не слышал о таких нелепых дырах в защите Win 9x, как незащищенные системные структуры и последствия к которым приводит такая халатность (создание своего callgate-а в таблице дескрипторов, или запись в незащищенные таблицы страниц).

В данной статье будет проведено небольшое исследование, посвященное аналогичным проблемам WinCE на ARM v5 - платформе.


Почему именно на ARM?
Во-первых, потому что другой просто нет под рукой.
Во-вторых, это чуть ли не самая распространенная на сегодняшний день платформа для КПК (последние процессоры Intel xScale и Samsung используют именно эту архитектуру).
Для начала придется рассмотреть основные защитные механизмы ARM, использующиеся на аппаратном уровне. По ходу дела будут приводиться аналогии (иногда не совсем удачные) архитектуры x86 (Intel). Наверное, у всех слово так или иначе ассоциируется с обработкой чисел с плавающей запятой. Однако, на самом деле гораздо более обширное и глубокое понятие. Так, все управляющие структуры (аналоги регистров CRn в x86) в ARM расположены в регистрах сопроцессоров. Кстати, ARM поддерживает до 16 сопроцессоров.
Сама статья на wasm.ru
По привычке, руководствуясь интеловской психологией, я как-то совершенно не задумывался о выходе из вложенных процедур - у интела нужный адрес всегда на вершине стека и мы выходим по ret-у. Из-за того, что в ARM-е адрес возврата сохраняется в регистр R14 (LR) во вложенных процедурах в начале нужно сохранять старое значение LR. Опять же, пустяковая ошибка, но нервов попортила немало.
Ну что еще по мелочи - по аналогии с *nix если параметров слишком много (больше четырех), то часть из них передается в стеке.
Да, стоит также отметить, что в WinCE по GetLastError ничего кроме 0x57 (неверный параметр) вы не добьетесь.