Знімаємо обмеження з mobilecms і прибираємо авторські права

Нещодавно зайнявся написанням мультіпользовательской сервісу wap-cms, тобто CMS орієнтованих на створення мобільних сайтів, але не вимагають від власника ніяких знань в програмуванні. Таке рішення з коробки, наприклад як UCOZ тільки під wap.

Природно попередньо вирішив вивчити вже готові рішення, шукав щось крім усім відомих говно-движків wap-motor, johnCMS, DCMS. Натрапив на такий цікавий і молодий проект MobileCMS. Звичайно відразу цікаво було глянути код, тим більше що описи були багатообіцяючими: код заснований на ООП HMVC, веб інтерфейс адмінки, модульність, установка і управління модулями з адмінки, відкритий вихідний код.

Відразу скажу, що на момент написання статті я вивчав MobileCMS v1.5.
Ну що ж, пробуємо ставити на / localhost / і відразу ж бачимо помилку: "На сервері не встановлено ionCube Loader, зверніться в технічну підтримку вашого хостинг провайдера з проханням встановити даний модуль."

Закінчили установку, ніяких проблем. Намагаємося відкрити сайт і бачимо помилку:
Site error: the file Q: \ home \ localhost \ www \ MobileCMS \ libraries \ template.php requires the ionCube PHP Loader ioncube_loader_win_5.2.dll to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.
Так так так..так ось де значить потрібен ionCube, файл "libraries / template.php" закодований. Після читання інформації на сайті розробника з'ясувалося що система має платну ліцензію (99wmr :))) яка дозволяє автоматично прибрати авторські права MobileCMS з усіх сторінок сайту. Причому читаючи інформацію з купівлі ліцензії сказано: "Протягом деякого часу копірайт забереться автоматично.". Значить система зняття копірайтів автоматично прописана в движку, або що ще гірше можливо є в скриптах чорний-хід для розробника, за допомогою якої він може віддалено знімати авторські права (не просто ж так закодований файл template.php).

Перерва всі вихідні, і не знайшовши в них нічого що постачається з відповідною ліцензією, а так само подивившись код шаблонів footer.tpl не знайшов в них коду, звідки б могла взятися рядок "Powered by MobileCMS", але вона все-таки є.

Щось я розтягнув оповідання, перейду відразу до справи. Щоб запустити CMS довелося все-таки поставити її на сервер де є ionCube і подивитися що буде після запуску.
1. Помітив поява 2х файлів в папці / cache / file_cache /, це
/ Cache / file_cache / b / b81755a649ad357a44526821a64432a0
і
/ Cache / file_cache / f / f7c69042a56ced3e29af3ce2a911d68a
Другий файл вдавав із себе звичайний серіалізовані масив з кешем шаблону головної сторінки. А ось перший файл був дуже цікавий. Дивимося що в ньому

Найбільш уважні вже напевно помітили, що тут є значення [licensed] => 0, і так, скажу відразу, якщо замінити "0" на "1" авторські права зникнуть, але не на завжди, тому що через деякий час (10800 секунд = 3 години) файл знову відновиться і авторські права повернуться на місце. Спробуємо вирішити цю проблему.

Спосіб # 2
Все точно так-же як в способі # 1 але замість установки CHMOD ми можемо змінити час модифікації файлу. Це можна зробити PHP-функцією touch () приблизно так. Цим ми виставляємо час модифікації в далеке майбутнє, мовляв файл останній раз редагувався в 2099 році. Навіщо? Я говорив що файл відновлюється кожні 3 години? Так ось 3 години, цей час життя файлу в кеші, а вивчивши вихідні кешируючого класу, ми можемо побачити що кеш чиститься на основі даних mtime (modification time) виставивши яке в майбутнє, ми зробимо файл вічно-живим в кеші.

return FALSE;
>
?>
І до речі, хоч файл template.php закодований, ми можемо дізнатися ім'я ключа за яким кешируєтся ліцензія, це рядок "license_data" тобто md5 ( "license_data") = b81755a649ad357a44526821a64432a0 так що можна ставити обробник-виняток і на неї, а не на md5-рядок.

function parse ($ filename. $ params = array ())
if (! strstr ($ filename. '.tpl'))
$ Filename. = '.tpl';
>

foreach ($ params as $ var => $ var_value)
$ This -> vars [$ var] = $ var_value;
>

if (strpos ($ this -> theme, 'admin') === 0)
$ Alternative_theme = 'admin';
>
else
$ Alternative_theme = 'default';
>

if (file_exists (ROOT. 'modules /'. ROUTE_MODULE. '/ views /'. $ this -> theme. '/'. $ filename))
$ This -> template_file = ROOT. 'Modules /'. ROUTE_MODULE. '/ Views /'. $ This -> theme. '/'. $ Filename;
>
else
if (file_exists (ROOT. 'modules /'. ROUTE_MODULE. '/ views /'. $ alternative_theme. '/'. $ filename))
$ This -> template_file = ROOT. 'Modules /'. ROUTE_MODULE. '/ Views /'. $ Alternative_theme. '/'. $ Filename;
>
else
if (file_exists (ROOT. '/ views /'. $ this -> theme. '/'. $ filename))
$ This -> template_file = ROOT. '/ Views /'. $ This -> theme. '/'. $ Filename;
>
else
exit ( 'Файл '. $ Filename. ' не є шаблоном або не найден. ' );
>
>
>

extract ($ this -> vars, EXTR_REFS);
ob_start ();
include $ this -> template_file;
$ Page_content = $ this -> add_code (ob_get_clean ());
return $ page_content;
>

function display ($ filename. $ params = array ())
echo $ this -> parse ($ filename. $ params);
>

function assign ($ param1. $ param2 = NULL)
if ((! $ param2 AND is_array ($ param1)))
foreach ($ param1 as $ key => $ value)
$ This -> vars [$ key] = $ value;
>

if ($ param2)
$ This -> vars [$ param1] = $ param2;
return TRUE;
>

function add_code ($ buffer)
if ((! $ this -> code_added AND strpos ($ this -> theme, 'admin')! == 0))
if (! class_exists ( 'File_Cache'))
a_import ( 'libraries / file_cache');
>

if (empty ($ license_data))
$ License_data = array ( 'licensed' => 0. 'template' => ''. 'License_place' => ''. 'License_code' => '');
$ License_data = serialize ($ license_data);
>

$ File_cache -> set ($ cache_key. $ License_data);
$ License_data = unserialize ($ license_data);
>

if (! $ license_data [ 'licensed'])
if (strstr ($ buffer. $ license_data [ 'license_place']))
$ Replace = str_replace ( ''. $ License_data [ 'license_code'], $ license_data [ 'template']);
$ Replace = str_replace ( ''. $ License_data [ 'license_place'], $ replace);
$ Buffer = str_ireplace ($ license_data [ 'license_place'], $ replace. $ Buffer. $ Count_added);
if (0 <$count_added )
$ This -> code_added = 1;
>
>
>
else
$ This -> code_added = 1;
>
>

А спосіб зняття копірайту просто, і полягає в редагуванні методу add_code (). але інструкцію по даній операції вже наводити не буду, тому що там не складно розібратися і самим.

UPDATED. Роздуми.
Можливо я звичайно параноїк, і то що напишу нижче є маячнею але факти не надати не можу. Якщо спробувати проаналізувати систему ліцензування даної CMS, то вийде що розробник може вбудувати будь-який код в усі сторінки сайту, який використовує його. Яка ту може бути вигода?

По перше. можна вбудувати шкідливий ява-скрипт, тут дуже великий політ для фантазії (редиректор, сніфер кук, троян-лоадер).

1. Багато контролери будуть закриті щоб поліпшити захист? Захист Zend або ionCube яка знімається декодером за 15 секунд з будь-якої кількості файлів. Доведено на прикладі template.php
2. Сайти будуть видалятися за порушення ліцензії. Так пункт 7 про самостійне видаленні копірайтів ми порушуємо, ось тільки ні саме слово mobilecms ні угоду, не мають ніякої юридичної сили, враховуючи що ніде ми угод не приймали. І хіба що самий тупий хостер видалить сайт (який приносить йому гроші (хостера)) лише тому що розробник mobilecms поплакався про те, що хтось зняв авторські права = D. Та й ми нічого не патчим і не змінюємо вихідні коди скрипта, лише поставимо CHMOD де треба і справа в капелюсі;)
3. Особисті загрози мені? я задоволений)) можеш прям зараз починати ДДОС мій бложек, а я зобов'язуюсь публікувати тут все декодувати версії MobileCMS починаючи з 1.5.