Zend Guard под хакерским прицелом Paxan [tPORt] (paxan@tport.be) Хакер, номер #091, стр. 091-090-3 Восьмой параметр (визуально неприметен): В кодировщике есть параметр Work only with other encoded files. Думаю, название говорит само за себя. Варианты: 00 и 01, то есть «нет» и «да». И, наконец, последний параметр — «dummy.addr». Он не всегда такой, бывает странная строка, что-нибудь типа: «-Tudsb3T$)». Смысл в нем не совсем ясен. Загрузчик при его чтении выделяет, читает и сразу же освобождает память (скорее всего, что-нибудь для обратной совместимости). Уфф. С параметрами мы разобрались. Теперь самое время приступить к разбору наших имен, регистраций и лицензий. Типы лицензий: Первый тип лицензии — это «No License Support». В нем участвуют всего две сущности: имя (первый параметр) и контрольная сумма: По ней мы определяем имя владельца кодировщика. По этому имени генерируется контрольная сумма. Функция, используемая для этого, называется adler32. Приведем листинг ниже: unsigned int adler32_hash(char *data, int len) { unsigned int i1 = 0, i2 = 0; for (int i=0;i<len;i++) { i1 += data[i]; i2 += i1; } i1 %= 65521; i2 %= 65521; i2 <<= 16; return i2 | i1; } Вызвав функцию adler32_hash («Zend Encoder trial»,18), мы на выходе получим число: 1036256941. Если мы в скрипте изменим имя, то при вычислениях оптимайзер получит другую контрольную сумму и сравнит с той, что указана в скрипте. Если они не равны, то прекратит выполнение. А если мы изменим вместе с именем и контрольную сумму, то будет сгенерированная неправильная таблица преобразования опкодов — и оптимайзер упадет. Второй тип лицензии — это «Require Valid License». Закодируем наш скрипт с этой опцией. Попробуем запустить и получим: «Warning: License check failed!». Выполнением на этом прерывается. Распакуем и увидим что-нибудь типа: Сколько сразу интересного добавилось. Для начала разберем тип лицензии (обозначено желтой полоской). Он равен единице, то есть это — «Require Valid License». Далее следует блок данных, относящийся к этой лицензии. Опять мы видим имя владельца кодировщика (назовем его regname). Далее следует название продукта (обозначено зеленой линией, назовем его productname), которое мы указываем в параметре -license-product кодировщика. Потом идет первый блок данных, длиной 548 байт (назовем этот блок data1), после него расположен второй блок данных, длиной 808 байт (назовем этот блок data2, заканчивается он красной вертикальной полоской). И далее, как всегда, идет параметр ограничения по времени и контрольная сумма. В данном случае контрольная сумма вычисляется таким образом: int checkhash = adler32_hash(regname) ^ adler32_hash(productname) ^ adler32_hash(data1) ^ adler32_hash(data2); То есть в данном случае имеет место операция XOR над всеми контрольными суммами. Изменим параметр лицензии с «1» на «0» и вырежем все блоки (regname, productname, data1, data2). Однако, запаковав данный скрипт, мы все равно не сможем его запустить, так как контрольная сумма от «Zend Encoder trial» равна 1036256941, а у нас — 457376076. Менять контрольную сумму мы не в силах, зато запросто можем поменять имя. То есть задача сводится к тому, чтобы подобрать набор байт. Обсуждение и решение этой проблемы есть на форуме crackl@b: http://cracklab.ru/f/index.php?action=vthread&forum=1&topic=2927. Найдя необходимые байты и подставив это в скрипт, получим: |