12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Обфусцированный movКод после морфингаи Edx. Сохраняй значения этих регистров, если в них содержатсяи используются важные значения. Вставим вызов этого макроса вgen_trash. Подключи фантазию; вызовы функций не обязательнодолжны быть одиночными, высокоуровневый мусор должен взаимодействоватьс бинарным — не подкопаешься. Неплохо будет эмулироватьнекоторые функции, то есть реализовать их код у себя. Вызов илииспользование своего кода являются вариантами, пример:macro GetLastError {rndvariant = rndnum mod 2if variant = 0mov eax,[fs:18h]mov eax,[eax+TEB.LastError]else if variant = 1invoke GetLastErrorend if}0XA11A5, ÈËÈ ÌÅÒÀÌÎÐÔÈÍÃМетаморфинг я реализовал как замену инструкций своими функциональнымианалогами. FASM позволяет переопределять инструкциимакросами, что очень удобно. Возьмем, к примеру, инструкцию movreg32_1, reg32_2. Какие могут быть аналоги? Первое, что приходит вголову (вообще их можно придумать великое множество):push reg32_2pop reg32_1push reg32_2mov reg32_1,[esp]add esp,4push reg32_2xchg reg32_1,reg32_2pop reg32_1Примени фантазию, не следуй шаблонам, и за небольшой промежутоквремени можно будет написать достаточное количество аналогов длявсех инструкций. Напишем макрос, переопределяющий инструкциюmov. Обязательно проверяем, что аргументы являются регистрами, таккак у нас есть замена только этого варианта:macro mov arg1,arg2 {if (arg1 eqtype eax) & (arg2 eqtype eax)rndvariant = rndnum mod 4if variant = 0push arg2pop arg1else if variant = 1}Проверяем:push arg2mov arg1,[esp]add esp,4else if variant = 2push arg2xchg arg1,arg2pop arg2else if variant = 3mov arg1,arg2end ifelsemov arg1,arg2end ifmov eax,ecxmov ecx,ecxmov edx,espИтог:51 | push ecx91 | xchg ecx, eax59 | pop ecx89e5 | mov ebp, esp53 | push ebx59 | pop ecxЗамечательно, не правда ли? Добавив как можно больше инструкцийи вариантов замены, можно добиться замечательных результатов.0XAB1E, ÈËÈ ÏÅÐÌÓÒÀÖÈßЗдесь все тоже предельно просто и дает мощный результат. Нам нужноизменить расположение некоторых блоков кода без изменения функциональностии без повреждения кода. Для начала за блоки возьмемпроцедуры, далее эти блоки следует максимально уменьшить. Надспособом случайного изменения блоков кода я недолго думал, возможно,есть более изящное решение — подумай. Суть такова: каждую процедуруоборачиваем в макрос, создаем для нее переменную — флаг,сигнализирующий об использовании, дабы не вставлять процедурынесколько раз. Например (пермутируем три процедуры, скелет), кодглавной структуры теперича выглядит так:fproc_1 = 0fproc_2 = 0...entry $;êîä ãëàâíîé ïðîöåäóðû...while (flag_1 = 0) | (flag_2 = 0)randomizesequence = rndnum mod 2if sequence = 0if flag_1 = 0proc_1XÀÊÅÐ 08 /139/ 10 059

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!