разница в том, что Вы пытаетесь доказать, что трудно определить, что именно вычисляет дерево (а это неоспоримо, поскольку упирается в теорему Геделя и Entscheidungsproblem), а я говорю, что, зная эталонное дерево, можно определить, является ли данное дерево ее мутацией. трудно (возможно ли?) написать антивирус, который ловит любой вирус, но легко написать антивирус, который ловит любые мутации полиморфика с заданными правилами.
> > VCG.Belka тоже такими вещами занимается в меру > > возможностей. ЛовИмо. > Кроме эквивалентных преобразований нод я предусматривал еще > и вставку новых нод (которые затем тоже участвуют в > мутации)
вставка новых нод - это разновидность NOP: изменение незадействованных информационных потоков. (код NOP эквивалентен XCHG AX,AX, например)
> и перемещение готовых веток
зная эталонное дерево, всегда можно сказать, куда ветка может переместиться без искажения смысла действия. отвечаем на вопрос "могла ли эта ветка переместиться вон туда? y/n"
> и оптимизацию (тоже > стохастическую): несколько нод объединяются в одну или > несколько других и тоже затем участвует в мутации. Кроме > того, так как фактически происходит компиляция, и > функциональность мутируемого алгоритма известна,
вот-вот. точно как и когда ищем мутанта, проверяем, можно ли по известным правилам получить "это" из "того".
> то > компилятор (полиморфный движок) может принимать решения о > дисперсии данных (раскидать, допустим, int или массив на > несколько битовых наборов и пустить их в разные ветки для > обработки), причем переход в каждую конкретную ветку может > быть условным:
алгоритм компилятора знает, на какие условия нужно обращать внимание. антивирус может обращать внимание на те же условия, чтобы выяснить, постоянно ли это условие в разветвлении. ставим ли мы задачу ловить "все" вирусы - или те, которые сгенерированы конкретным компилятором по конкретному алгоритму? кстати, мне можно и не проверять, выполняется ли условие - в первом приближении я могу посмотреть что делают Обе ветки и перестать, если ни одна ничего подозрительного не делает, или прикопаться к условию, если хоть одна выглядит заманчиво - кстати, я буду знать, какое условие Ожидать.
> Восстановление первоначальной функциональной сигнатуры по > получившемуся коду будет значительно сложнее, чем > восстановление первоначального C-шного кода по > исполняемому, скомпилированному с -O2 хотя бы.
согласен. но получение получившегося кода из первоначальной функциональной сигнатуры не будет значительно сложнее :-)
> > если известен алгоритм, по которому строятся такие > ветви, > > то по нему же их можно и обнаружить. > Алгоритм стохастический и одни и те же ноды могут быть > получены мутацией различных начальных.
ну и что? я знаю начальную ноду и смотрю, а могло ли получиться то, что вижу, хотя бы и с помощью стохастики. стохастика, к тому же, не является совершенно случайной - естьограниченныйнабор вариантов, из которых она выбирает один.
> Если при этом учесть > внесенный "мусор" и опять таки стохастическую оптимизацию - > объединение нод (при этом возможно объединение "мусорных" с > валидными), то восстановление - не такая уж тривиальная > задача.
антивирус целится поймать обращение к конкретному прерыванию. при вызове этого прерывания регистры должны быть инициализированы определенным образом. так антивирус может узнать, какие информационные потоки отслеживать. мусорные инструкции видно сразу.
я не писал антивирус, но я писал мотор для генерации случайных информационных потоков и мотор для детекцииконкретныхпотоков. контрольная точка - "int 21h"; задание: что и откуда заносится в АХ и DХ - конкретные потоки. далее, "что и откуда заносится в [DX], [DX+1], ..." - все дела, имеем знание о функциональности.
> > функционально это только упрощает задачу, поскольку по > > расшифровщику уже можно сказать многое. > Нужно еще понять что это именно расшифровщик.
отчего же? :-) "а не расшифровщик ли это? y/n"
задача, стоящая перед хакером, отличается от задачи, стоящей перед антивирусом. последний знает, чтО искать; и если не нашел - значит, его там нет.
"эта программа сгенерирована не с помощью VCG" отличается от полного ответа на вопрос "каков алгоритм генератора этой программы?"
> ...а DES, например, или любой > другой алгоритм имеющий прямое и обратное преобразование > (tg - arctg, разложенные в ряд или еще что-нить).
да один хрен. если я знаю, что искать нужно DES, то я смогу его или найти, или не найти :-)
> ...(но потом из за цейтнота ограничился ксоркой по > гамме, которая генерится случайным набором команд - тоже не > очень легко найти: около 50 опкодов с произвольными парами > регистр-регистр и регистр-константа, но можно и не слишком > большими усилиями)
ну, правильно. если я знаю, что здесь должна быть гамма с размером (стохастически) от 8 до 79 инструкций...
> > ерунда. неоптимизированный полиморфик (замена операций > > эквивалентными из известного набора) разбирается как > > регулярное или стековое выражение. кю. > Кроме замены используется добавление пустышек, объединение > операций тоже > по заданным критериям,
...известным антивирусу! :-) (хотя и неизвестным хакеру, взламывающему этот вирус В ПЕРВЫЙ РАЗ)
> перестановка > информационно-независимых друг от друга (информационные > потоки в компиляторе тоже отслеживаются), разбиение > информационных потоков на несколько и т.д.. И все это > делается в несколько десятков итераций.
ерунда :-) да хоть одна итерация, хоть десятое поколение вируса - алгоритм остается тот же, и критерии пермутированиия - те же.
да я и не по статье ведь комментирую, а по пермутирующему движку :-)
|