12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ВЗЛОМ«HellMilitia» and «my Death» icq 884888, http://snipper.ruÌÓÒÀÖÈß ÊÎÄÀ ÂÎ ÂÐÅÌßÊÎÌÏÈËßÖÈÈÎäíàæäû, ïîñëå íàïèñàíèÿïðîãðàììû, êîòîðóþ ÿ õîòåëñäåëàòü ïëàòíîé, ÿ çàäóìàëñÿî âîïðîñå åå çàùèòû. Ïèñàòüíàâåñíîé ïðîòåêòîð æåëàíèÿíå áûëî, äà è âðåìåíè òîæå.Âîçìîæíî ëè ñäåëàòü÷òî-òî ñðåäñòâàìè êîìïèëÿòîðàFASM, âåäü ó íåãî ìîùíåéøèéìàêðîÿçûê? ýòîé ñòàòüå ÿ ðåøèë îïèñàòü,÷òî âûøëî èç ìîèõýêñïåðèìåíòîâ. Çäåñü íà ïðîñòûõïðèìåðàõ áóäóò îïèñàíû ìåòîäûïîëèìîðôèçìà, ïåðìóòàöèè,ìåòàìîðôèíãà è îáôóñêàöèèáèíàðíîãî êîäà.Итак, мне кажется, я добился отличных результатов, ведь у меня сблеском получилось реализовать: полиморфизм (генерация мусорногокода), метаморфинг (замена инструкций аналогами), пермутацию(случайное перемешивание блоков кода с сохранением функционала илогики работы), обфускацию (метод запутывания логики кода, противодействиеанализу), контроль целостности кода (для защиты от изменения,patch'ей), шифрование кода и данных. Рандомизация кода служитдля защиты от автоматических распаковщиков, анализаторов, патчей,обфускация — для запутывания исследователя; при достаточной обфускациианализ программы может затянуться на долгие месяцы... Хватитболтовни, приступим!0XBA11EE PRNGПервоначально следует написать генератор псевдослучайных чисел —сердце любого движка рандомизации кода. Генератор я взял простой,наподобие ANSI C, для моих целей его вполне хватало.та же последовательность чисел. После недолгих раздумий и чтенияофициального форума, я нашел значение, которым можно завести генератор— это timestamp, UNIX-время. Получить его можно вот такимобразом: randseed = %t. Генерировать случайное число, к примеру,в диапазоне 0 - 0xDEAD, теперь можно так:randomizerandom_number = rndnum mod 0xDEAD - 10XBADC0DE ÈËÈ ÃÅÍÅÐÀÖÈß ÌÓÑÎÐÀДля начала, попробуем написать макрос для генерации простойинструкции — int. Состоит int из двух байт — опкода 0xCD и номерапрерывания, который и будет случаен. Получаем номер прерывания:randomizeint_val = rndnum mod 0xFFrndseed = 100500macro randomize {randseed = randseed * 1103515245 + 12345randseed = (randseed / 65536) mod 0x100000000rndnum = randseed and 0xFFFFFFFF}Работает он исправно, но, так как инициализирующее значение постоянно,каждый раз, при каждой компиляции будет выдана одна иДалее пишем следующую незаурядную конструкцию:db 0xCDdb numПока все просто. Оформив эти 4 строки в отдельный макрос gen_int ивызвав несколько раз, убеждаемся с помощью отладчика или дизассемблера,что код действительно случайный: rept 7 { gen_int }.И вот что получилось:056 XÀÊÅÐ 08 /139/ 10

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

Saved successfully!

Ooh no, something went wrong!