|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.07.2016, 16:58 | #11 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
А что я так понял вы тут просто процитировали найденный в интернете материал.
Цитата:
https://docviewer.yandex.ru/?url=ya-...88a13&page=313 Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
14.07.2016, 22:28 | #12 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Pavia, там-же указано, что это из выловленой из сети инфы.
А за ссылки спасибо, но маны от Intel все на буржуйском, а у меня с ним сплошные NOPы. Переводчик "Сократ" выдаёт вообще непонятно что, и понять суть его перевода достаточно проблематично. Но макушек всё-же нахватался. Теперь, собственно, по сабжу... Понимаю, что это бесполезное занятие, и в реальных программах может не пригодится, но ассемблер для меня чисто хобби, а потому интересны сами/нестандартные алгоритмы, и способы их реализаций. Планирую написать полиморфный движок, который генерил-бы различные варианты вызова одних и тех-же функций, переходов, добавление хэшей (ака мусор), всяких пустышек и никому-не-нужных процедур, и т.п. При этом должа в полной мере сохранятся работоспособность программы. Пока - метод вызовов выбрал табличный. Буду благодарен, если подскажете другие варианты. Т.к. все/это должно происходить в случайном порядке, нужен рандом. Я тупо читаю тики с порта(40h) или-же беру их напрямую из памяти биос. Можно потом разделить эти тики на опкод текущего байта, проксорить значением из AH и т.п. - это уже дело вкуса. Теперь, в зависимости от длины таблицы, нужно оставить от рандома нужный диапазон чисел. К примеру, если в таблице 16 элементов, то достаточно применить операцию 'and-random-0fh', как мы получим число в диапазоне 0..15 от рандома: Код:
Вот несколько масок, которые можно применять с инстуркцией 'AND': Код:
Код:
Если посмотреть в справочнике на таблицу опкодов, то можно обнаружить, что все/условные переходы заняли там 16 последовательных позиций начиная с опкода 70h (JO) и заканчивая 7Fh (JG). 16 опкодов как-раз позволяют заюзать инструкцию 'AND': Код:
..ну и конечно-же мусор. Генерировать его проще-простого, но зато как он отравляет жизнь пионерам крэкинга. Если заглянуть в справочник, то глаза разбегаются, сколько там однобайтных команд, которые без особых последствий можно вставлять между полезными инструкциями кода. Вот их короткий список: Код:
Чтобы выбрать из неё случайную инструкцию, достаточно сохранить адрес начала таблицы и добавить к этому адресу рандом из диапазона(0..25). В качестве регистров адресации могут использоваться SI/DI/BX: Код:
Нашедшего выход - затаптывают первым..
|
14.07.2016, 22:32 | #13 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
The first polymorphic engine was called MtE (short for Mutation Engine). It was written in 1992 by a virus author who called himself 'Dark Avenger'.
Ref: https://en.wikipedia.org/wiki/Polymorphic_engine https://en.wikipedia.org/wiki/1260_(computer_virus)) |
14.07.2016, 22:50 | #14 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
waleri, 'Dark Avenger' gave us direction and we must his use! :D
Нашедшего выход - затаптывают первым..
|
17.07.2016, 11:44 | #15 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Помимо пустых инструкций, можно вызывать и пустые прерывания, передавая им номера ничего не делающих функций. Вернее эти функции не совсем пустые, а просто возвращают определённые значения, которые можно тупо проигнорировать. Ниже идёт перечень таких функций для INT-21h, и возможный способ вызова сервиса(DOS) по случайному алгоритму:
Код:
Нашедшего выход - затаптывают первым..
|
18.07.2016, 15:11 | #16 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
..несколько вариантов вывода текстовых строк на консоль.
Здесь, как и прежде генерится рандом в диапазоне кол-ва функций в таблице. Но нужно учитывать, что адреса в таблице имеют размер 2 байта, поэтому полученный рандом нужно умножить на два. Дальше, идёт считывание этого адреса в АХ и переход по нему. Если у кого-то есть ещё варианты, то прошу подкинуть их мне. Осталось ещё несколько направлений (вывод напрямую в видео/буфер, некоторые функции видео/сервиса), но они не удобны тем, что нужно постоянно сдвигать курсор (т.е. они не телетайпные). Часто не знаешь, в какую именно область экрана будет выводится строка, поэтому я их отфильтровал. Вот что получилось.. Код:
Нашедшего выход - затаптывают первым..
|
18.07.2016, 15:48 | #17 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Насколько я понимаю, идея не в том, чтоб использовать разные варианты одной функции а чтоб полиморфить код самой функции... например сделать так, чтоб указатель на строку передавался в разных регистрах.
Ясное дело, что для вызова системных функций это смысла не имеет. С другой стороны, это наложит ограничение на инструкции, которыми можно пользоваться. Например lodsb или mul не особо подойдут, поскольку работают с определенными регистрами. |
18.07.2016, 18:21 | #18 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
waleri да, именно так: т.е. мне нужны любые нестандартные решения, которые могут хоть как-то помешать взлому. Пусть это будет передача параметров в других регистрах, какие-нить глючные функции, и т.д. Приведу вкратце свой алгоритм..
Весь код разбиваю на блоки, которых на данный момент 3: - Блок мусорных инструкций; - Блок вывода сообщений случайным образом; - Блок вызова прерываний случайным образом (в разработке). В свою очередь 'мусорный блок' делится ещё на 3 уровня. Уровни выбираются в случайном порядке, и позволяют выводить или пустой переход(Jump), или 1-байтную инструкцию(Byte), или-же безобидную функцию сервиса DOS (Function). Все они описаны выше и вызыватся так: Код:
Код:
В результате, при каждом запуске приложения, код будет отличатся от предыдущего, т.к. откуда-то будут появлятся новые инструкции. В идеале, можно будет вообще зашифровать всё тело случайным ключом, который хранить где-нить внутри этих процедур. Пока что, мне нужны просто какие-нибудь интересные фрагменты кода, которые я смогу поместить в эту тушку. Любые.., лишь-бы это не было из области: "для тех, кто в танке". На данный момент планирую проверять и сразу подменять содержимое регистров нужным набором по типу, как это делают стандартные обработчики прерываний DOS. Если оттрасировать код в отладчике '..со-входом в INT', то там видно, что обработчик начинает проверять AH на номер функции начиная снизу-вверх. Если не находит, то увеличивает AH и продолжает поиск. Хочу замутить так-же, и при совпадении заносить уже в остальные регистры стандартные значения. Именно поэтому я и затрагивал вначале, тему конвейера. Посмотрю, что получится..
Нашедшего выход - затаптывают первым..
Последний раз редактировалось R71MT; 18.07.2016 в 18:39. |
19.07.2016, 09:45 | #19 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Взлому это не помешает.
Все это делалось для избегания антивирусов, которые искали по шаблонам. То, что код каждый раз отличается помешает только отладчику но тулзам типа IDA это не помеха. Вот если зашифорвать код, это уже будет труднее а шифровать код умеет любой ЕХЕ компрессор. |
19.07.2016, 17:59 | #20 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
waleri, да конечно! Взлому вообще ничто не может помешать. Если творение достойно взлома, то и шифрование не спасёт: снимут дамп памяти и кранты шифрованию. Здесь вопрос в другом - чтоб шарики чуть расшевелить, развить мышление, ..но в пределах разумного!
Например легче повеситься, чем проверять регистры по алгоритму DOS (о чём я говорил выше). Вот идею спёр у 'Ржавого робота', который последовательно проверяет значения в таблице, и растасовывает эти значения по РОН в порядке 'АBCD'. Если в таблице встречается флаг 'full' (со значением FFFFh), то это поле пропускается и означает, что до вызова процедуры кто-то/что-то уже положил в этот регистр. Вариант реализации привожу ниже.. В примере вызывается функция DOS(0Ah), которая требует адрес приёмного буфера в DX. Поэтому заношу в последнее поле флаг 'full' (мол не трогать!), а остальные регистры забиваю константами из таблицы. Не шедевр конечно, но на первых порах сойдёт и такой вариант: Код:
Нашедшего выход - затаптывают первым..
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Полиморфизм | Anubys | Помощь студентам | 1 | 26.12.2011 20:42 |
Полиморфизм | Zorgan | Visual C++ | 22 | 29.08.2011 12:23 |
Полиморфизм | MasterSporta | Общие вопросы C/C++ | 3 | 10.04.2011 23:46 |
полиморфизм | slayerblya | Общие вопросы C/C++ | 1 | 27.02.2011 01:43 |
Полиморфизм | mister2010 | Общие вопросы C/C++ | 30 | 24.05.2010 01:07 |