Как стать автором
Обновить

Комментарии 12

Устарело это всё.

WriteProcessMemory

Проще использовать memcpy. VirtualProtect все равно придется дергать.

Размещать код на стеке не только допустимо, но иногда даже и необходимо.

А как же DEP?

В нынешних реалиях можно использовать что-то вроде asmjit или pin tool
Согласен, технология определённо устарела. Чем меня привлекла эта статья, так это тем, что концептуально правильный ход мысли задаёт. А он не устаревает.
Нет, это неправильный ход мысли.

С одной стороны, код становится хрупким и трудноподдерживаемым. Он перестал выполняться в новых Windows, где выполнение со стека по умолчанию закрыто.

С другой стороны, это что за детский сад? Хочешь затруднить написание кейгенов, ну используй ассиметричную криптографию. От того, что программа 3 раза заксорена, скопирована на стек и запущена оттуда, хакеру придётся пожмакать лишние разы кнопку step в дебагере. Расходы на установку защиты и её снятие несопоставимы.
Что устарело? Архитектура фон Неймана? Идея о том, что код — это такие же данные, и как следствие — их можно не только читать, но и модифицировать?
ИМХО, Майкрософты приходят и уходят, фундаментальные вещи остаются.
Что устарело? Архитектура фон Неймана? Идея о том, что код — это такие же данные, и как следствие — их можно не только читать, но и модифицировать?

Да, именно они.
Я вас уверяю, что нет. Современные информационные технологии — это мир с множеством слоев абстракций, кроме собственно машинного кода в нем выполняется множество всяких интерпретаторов байт-кода всех уровней. Кроме С/С++, практически все остальные мейнстрим-языки так или иначе выполняются не на голом железе, а в каком-то фреймворке, интерпрететоре или в чем-то подобном. Там техники СМК тоже могут быть актуальны — как на уровне самого фреймворка, так и на уровне пользователя.
Какую задачу, по-вашему, решает СМК?

Показать «ух как я могу» коллегам-программистам?

Усложить жизнь ревёрс-инженерам?

И для того, и для другого теперь есть лучшие способы.
В некоторых случаях оптимизация по скорости (простейший пример — инициализация static переменных).
Иногда действительно усложнить жизнь реверсерам.
А вообще, я склоняюсь к мысли, что наличие возможностей всегда лучше чем их отсутствие.
В некоторых случаях оптимизация по скорости (простейший пример — инициализация static переменных).

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

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

Разработчики DEP, W^X, и всех прочих технологий по предотвращению СМК — считают иначе.
Между самомодифицирующимся кодом и динамической компиляцией/трансляцией есть разница — не трогается исходная секция кода.
Создать СМК в Windows не так просто, как хотелось бы. Здесь придётся столкнуться с некоторыми подводными камнями, заботливо разложенными создателями Windows. Почему? Да потому что это Microsoft.

Вот это и вообще весь третий параграф — по-моему Microsoft здесь немножко зря обвиняется. Это специфика работы защищенного режима процессора.
Вообще защищенный режим не так уж плохо сделан, особенно если учесть в какие годы это разрабатывалось и для какого оборудования. Это, на минуточку, еще 1982 год — процессор 80286. Страничная адресация была введена в 80386.
Microsoft здесь вообще не при чем, наоборот они молодцы что нормально операционная система стала поддерживать этот режим, хоть и не с самого начала работы (загрузчик в реальном режиме запускается).
Конечно, в реальном режиме работать гораздо проще — память вся твоя, даже если как бы не твоя и другие программы в нее надеются тоже писать. И вот как раз самомодифицирующийся код — это как нефиг делать там реализовать.
Защищенный режим предполагает более зрелый подход к разработе и «защита» там, скорее не от хакеров, а от самого программиста — чтобы не попортить чужие данные по ошибке (разыменование не того указателя — частая проблема). Ну сложнее, да, но и требования к программам сложнее стали. А страничное управление памятью — без этого сложно представить современные операционки с многозадачностью.

По поводу самомодифицирующегося кода — если кто-то помнит — выходил в 90е годы электронный хакерский журнал InfectedVoice. В одном из последних выпусков описывался полиморфный вирус на .bat-файлах. Вот это был приемчик! :)
Да и вообще подход «подлый Microsoft не позволяет мне нагадить пользователю компьютера» какой-то сомнительный.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории