Привет!
Как и обещал, выкладываю бета версию скриптов для создания защиты приложения на основе приема (nanomites) который используется в протекторе Armadilo.
Хочу этим постом привлечь заинтересованных людей что бы вместе допилить все это до вменяемого вида и главное попробовать портировать под компилятор cl.
Самой большой проблемой тут является то что генерируемый ассемблерный листинг cl,
не компилируется в mlАвтор: nen777w
Дата: 16.09.13
.
Я читал что это можно исправить правкой полученного кода, но за эту задачу я еще не брался.
А пока то что есть реализовано только для gcc компилятора.
Сам я планирую и дальше развивать то что написал, потому как это будеть частью защиты моего приложения, но "гуртом лечгче батька бити".
Некоторые ремарки:
— пожалуйста не сильно удивляйтесь если в скриптах обнаружите полную чушь, на питоне я пишу можно сказать 3-й раз в жизни так что заодно и учусь.
— если найдутся заинтересованные поддержать разработку, может будет лучше положить все сырки на github, но пока для ознакомления они лежат на RSDN
— этот проект был написан по
этой стаье
, к сожалению исходники в конце были недоступны. Когдя я связался с автором тот сказал что специально убрал их т.к. фирма где он работает делает
комерческий проект на основе этой технологии. Пришлось все делать самому.
Состав архива:
/nanomites_v0b/py/common_constants.py
— таблица инструкций перехода и соответвующий ей код, в дальнейшем развитии планируется ее занчительно расширить, что бы обрабатвать иснтрукции call, loop
а также не относительные переходы типа jmp eax
/nanomites_v0b/py/gcc_s_processor.py
— скрипт генерирующий таблицу с информацией о наномитах а также таблицу контрольных сум
(планируется обработка таблиц CRC для обечпечения целостности (защита от патичнга), пока реализована только на половину)
Входные параметры:
-s — обрабатываемый ассемблерный листинг .s-файлы
-d — результирующий файл
[-m] — ключик для обработки только кода между маркерами (существуют маркеры для наномитов и crc (см. файл: protector_SDK.h))
/nanomites_v0b/py/objdump_nano_tbl_generator.py
— скрипт для обработки результата работы утилиты objdump. По сути генерация h-файла со всеми необходимыми для отладчика таблицами
Входные параметры:
-s — обрабатываемый dump файл
-d — результирующий h файл, со всеми таблицами
/nanomites_v0b/bin_constants.h — вспомогательные макросы
/nanomites_v0b/debuger.cpp — отладчик процесса с наномитами
/nanomites_v0b/do.sh — шелл скрипт для генерации и компиляции тестового проекта
/nanomites_v0b/protector_SDK.h — маркировочные макросы
/nanomites_v0b/test_app.cpp — исходнк обрабатываемого приложения (внутри алгоритм md5)
Проверялось это на Linux, но теоретически должно работать и под unix подобные системы например OSX.
Есть вероятность что это заработает под Windows на MinGW, но еще руки не дошли проверить.
Что есть:
— бета версии скриптов с демонстрацией техники
— генерация полных таблиц наномитов (с фейковыми адресами)
Что хотелось-бы и планируется:
— Привлечь заинтересованных людей к проекту для совместной разработки.
— В первую очередь всетаки правдами-неправдами портировать все для cl. Может у кого то завалялся скрипт или зания которые помогут всетаки ml сожрать то что негенерил cl. У меня пока таких зананий нет.
— Расширить таблицу инструкций а также включить обработку инструкций относительного перехода (уже работаю над этим).
— Попробовать портировать под Intel compiler, там вроде не должно быть проблем.
— Добавить дополнительные механизмы обеспечивающие целостность генерируемых таблиц (есть пару идей)
Соственно все, на этот момент времени. Если что то забыл допишу потом.
Надеюсь на интересную дискуссию.
Хм, вместо модификации ассемблерного листинга можно ведь править бинарник? В статье конечно говорится про преимущество листинга в виде однобайтовой мины для перехода любого размера, и соответствующие сложности с восстановлением, но ведь и в случае работы с бинарником можно сдвинуть весь код и пофиксить все джампы\коллы, условные переходы и смещения. Сложность в виде неоднозначности в определении предназначения операнда (смещение или похожая на смещение константа) отпадает благодаря релокам.
_>>армадилла с бинарником и работала. Достаточно map файла и простенького дизасма длин, дальше просто забиваешь все найденные 7x на cc в коде и генеришь таблицу. Все, больше ничего не надо.
N>Зря вы так, предложенный метод позволяет значительно расширить возможности наномитов.
Я давно давно такое хотел написать. Добился следующего:
Диасмом генерил асм, его парсил (так легче)
потом разбивал на группы команд по 3-4-5 команд. И путем анализа изменяемых регистров добивался того что б группу команд использовать как моджно чаще.
Типа оно догадывалось что
xor ecx,ecx
mov eax,1
mov ebx,1
mov ebx,1
xor ecx,ecx
mov eax,1
Это одно и тоже
Потом дописывал новую секцию к бинарнику, а в опимизированые места call. Получалось оч много call. И трудно было понять и нельзя было пропатчить группу команд потому что она часто использовалась везде.
У меня тогда не хватило знаний и я забросил это дело.
Я думаю топик стартер правильно взялся за промежуточный асм.
А наномиты эти армадиловские я вчера случайно посмотрел. Ниче такого, глаз к ним привыкает

xchg да пушпопы.
Здравствуйте, Kubyshev Andrey, Вы писали:
KA>Я думаю топик стартер правильно взялся за промежуточный асм.
В чем правильность то?

ИМХО было проще хоть минимально изучить РЕ формат чем столько времени убить на борьбу с MSVC, а помимо GCC и MSVC есть еще куча компилеров, о которых ТС еще не подозревает: MinGW, WDK, BCB, Delphi, Free Pascal, XE2-XE5, VB6 наконец. Я не думаю что для всех из них удастся сделать перегон асма туда/сюда, причем даже если это и получится, то нет никакой гарантии, что пересобраный бинарь будет работать также как оригинал.