Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

Zend Guard под хакерским прицелом

Paxan [tPORt] (paxan@tport.be)

Хакер, номер #091, стр. 091-090-4


Пакуем, пробуем запускать, и видим:

Script start

11

О, чудо! Скрипт запустился! Как видите, вырезание требования лицензии - задача тривиальная и очень легко поддается автоматизации.

И, наконец, третий тип лицензии — это «Support License». Он служит для ограничения возможностей скрипта при отсутствии лицензии.

Тут совсем все легко. Для примера напишем скрипт:

<?php

$licinfo = zend_loader_file_licensed();

if ($licinfo === FALSE) {

echo "Demo Version";

} else {

echo "Full Version, license data:";

print_r($licinfo);

}

?>

Закодируем c «Support License», запустим и, естественно, получим «Demo Version». Распакуем. Сразу бросается в глаза, что контрольная сумма у нас зависит только от имени, то есть adler32_hash(«Zend Encoder trial»,18) = 1036256941.

Поэтому весь лицензионный «мусор» мы можем смело вырезать. А имя функции изменим на zend_loader_file_licen"z"ed.

Пакуем под названием script.php и пишем небольшой сценарий:

<?

function zend_loader_file_licen"z"ed() {

return array("Product-Name" => "MyProduct"); // ну и остальные лицензионные параметры не забываем вернуть

// подробнее, какие параметры должна возвращать

// zend_loader_file_licensed(), можно посмотреть в документации

}

include("script.php");

?>

Запускаем его и видим:

Full Version, license data:Array

(

[Product-Name] => MyProduct

)

Это, конечно, варварский метод, ведь для каждого скрипта придется писать соответствующий над ним скрипт и при разных уровнях оптимизации придется править несколько мест. Но это первое, что пришло мне в голову :).

Хочу отметить, почему нельзя было менять контрольную сумму. Дело в том, что номеров опкодов PHP в скрипте явно нет, но есть смещения, по которым мы получим оригинальные опкоды. Примерно так:

char opcode = table[offset] - (opcodenum & 7)

В скрипте есть только offset и, естественно, порядковый номер опкода, относительно начала функции opcodenum. Сама же таблица, по которой мы получаем оригинальные номера опкодов, генерируется в зависимости от контрольной суммы. Алгоритм генерации я выкладывать не буду: он достаточно громоздкий. Найти его очень легко — надо просто проследить, куда уходит хэш. Вот почему мы не можем менять контрольную сумму просто так, ведь «сьедут» все смещения опкодов, и интерпретатор начнет выполнять чушь. Поэтому если мы хотим поменять хэш, то нам надо поменять все смещения опкодов во всем скрипте.

Резюмируя данную главу, отмечу: вся лицензионная защита скрипта обходится буквально за 5 минут. Есть и другой вариант обхода — править сам Optimizer, но это не универсальный вариант, так как на чужом хостинге никто не даст этого сделать.

Получение дампа скрипта

Хочу заметить, что у кодировщика существует несколько уровней оптимизации: full, minimal, none. Напоминаю, что мы остановились на последнем параметре «dummy.addr». При оптимизации уровня full кодировщик сразу записывает после «dummy.addr» количество функций, для имен которых предварительно рассчитан хэш.

Назад на стр. 091-090-3  Содержание  Вперед на стр. 091-090-5