ckFinder - это очень хороший файл менеджер, удобный прежде всего тем, что полностью интегрируется с моим любимым wysiwyg редактором ckEditor. Закачать фото, нарезать его, переименовать, удалить и т.д., словом полный комплект из-под коробки. Все в нем отлично, но эта надоедливая надпись This is the DEMO version of CKFinder. Please visit the CKFinder web site to obtain a valid license мешает жить). При этом ckFinder совсем не ограничивает функционал менеджера в демо версии, т.е. единственный минус - эта надпись.
Да, вы правильно поняли. Продукт платный. И стоит он ни много ни мало 59$ для одного сайта. В ранних версиях ckfinder была кнопка закрытия данной надписи, надпись конечно появлялась, но на время работы о ней можно было забыть. В свежей версии, которую я скачал с офсайта, такою кнопку не нашел. Значит пришла пора удалить надоедливую надпись самим.
Для начала я деобфусцировал ckfinder.js файл. Для этой цели очень удобен http://jsbeautifier.org/ . Код стал более читабельным, но от этого не стал более понятным. После нескольких часов разбора кода я понял, как работает их система защиты. Она многоуровневая. К примеру в тексте фраза This is the DEMO version of CKFinder лежит в таком виде \x54\x68\x69\163\040\151\163\040\x74\x68\145\x20\104\x45\x4d\x4f\x20\166\x65\x72\x73\151\x6f\x6e\040\x6f\146\040\103\x4b\x46\x69\156\x64\x65\x72\x2e\x20. Сперва я подумал, что наверняка она зашифрована. Но нет, это простая замена символов их 16-тиричным представлением. Если сделать так
alert('\x54\x68\x69\163\040\151\163\040\')
то можно увидеть исходный текст. Однако свое дело это псевдошифрование делает, тупой поиск по файлу, по сочетанию слов, ничего не даст. Кроме того, где-то в недрах этого файла я встречал проверку на то, содержит ли данная строчка в n-ом символе k-ое значение. Опять же, просто удалить сообщение не получится.
Тогда я решил исследовать серверную часть скриптов. Она написана на php. Начал я с файла config.php. В нем вводится два интересных нам значения
$config['LicenseName'] = $_SERVER['HTTP_HOST']; $config['LicenseKey'] = '';
LicenseName - это имя домена. Сюда вы сразу можете вписать $_SERVER['HTTP_HOST'];
С LicenseKey посложнее. Он генерируется по определенному алгоритму и напрямую зависит от длины LicenseName. Заходя вперед скажу, что зависят там всего два символа.
Итак далее. Я воспользовался функцией notepad++ поиска по файлам. Искал я любые упоминания LicenseKey. И я их нашел. Одно из них было в файле ckfinder\core\connector\php\php5\CommandHandler\Init.php
$_lc = $_config->getLicenseKey() . ' ' ; if ( 1 == ( strpos( CKFINDER_CHARS, $_lc[0] ) % 5 ) )//CKFINDER_CHARS = 123456789ABCDEFGHJKLMNPQRSTUVWXYZ $_ln = $_config->getLicenseName() ; $_oConnInfo->addAttribute("s", $_ln); $_oConnInfo->addAttribute("c", trim( $_lc[11] . $_lc[0] . $_lc [8] . $_lc[12] . $_lc[26] . $_lc[2] . $_lc[3] . $_lc[25] . $_lc[1] ));
Как мы можем видеть, здесь присутствует первая проверка на валидность введенного ключа. Его первый символ должен находиться в CKFINDER_CHARS на позициях, остаток от деления которых на 5 будет равен 1. Т.е. это позиции 1,6,11 и т.д.
Отсюда вытекает первое правило: самый первый символ в ключе должен быть одним из множества [2,7,C,H,N,T,X]. Первый кирпичик будущего кейгена готов.
Далее мы видим, что из ключа используются лишь 11,0,8,12,26,2,3,25,1 символы. Это значит, что остальные символы могут быть абсолютно любыми. Еще это значит, что всего в ключе должно быть минимум 27 символов, а в хеше 9.
К большому сожалению дальше след обрывается. И этот хеш ключа отправляется на клиент, где и происходят остальные проверки. Проще говоря мы снова вернулись в ckfinder.js
После 3-х чашек кофе на свет проявились несколько проверочных строчек. Приведу их все.
if (1 == a.bs.indexOf(a.bF.substr(1, 1)) % 5 && window.top[a.hf + "\x63\141\164\151\157\x6e"][a.hg + "\163\164"].toLowerCase().replace(a.jG, '') != a.ed.replace(a.jG, '') || a.bF.substr(3, 1) != a.bs.substr((a.bs.indexOf(a.bF.substr(0, 1)) + a.bs.indexOf(a.bF.substr(2, 1))) * 9 % (a.bs.length - 1), 1)) if (!Q && (!p || a.bs.indexOf(p) % 8 < 3)) if (a.bF && 1 == a.bs.indexOf(a.bF.substr(1, 1)) % 5 && I.toLowerCase().replace(a.jG, '') != a.ed.replace(a.jG, '') || a.bF && a.bF.substr(3, 1) != a.bs.substr((a.bs.indexOf(a.bF.substr(0, 1)) + a.bs.indexOf(a.bF.substr(2, 1))) * 9 % (a.bs.length - 1), 1)) function r(E) { return a.bs.substr(E * 9 % (2 << 4), 1); }; var F = [a.bF.substr(6, 1), a.bF.substr(8, 1)]; if (!!a.ed && F[0] != r(a.ed.length + a.bs.indexOf(F[1]))) u(E);
Больше всего мне запомнилась эта конструкция
window.top[a.hf + "\x63\141\164\151\157\x6e"][a.hg + "\163\164"].toLowerCase().replace(a.jG, '').
Где-то выше в коде
a.jG = new window["\122\x65\147\x45\x78\x70"]("\136\167\167\x77\134\x2e");
Вскрытие показало что window.top[a.hf + "\x63\141\164\151\157\x6e"][a.hg + "\163\164"] это window.top.location.host, а window["\122\x65\147\x45\x78\x70"]("\136\167\167\x77\134\x2e") это RegExp('^www\.');
Просто берется текущий host, у него отрезается www, и значение сравнивается с присланным LicenseName (помните его? ), с которым проделаны те же манипуляции.
Далее я просто подбирал сочетания символов, которые подходили бы под все условия. Благо пересечений условий практически нет. На результате я построил таблицу зависимостей, в которой лишь 6 и 8 символы зависимы от длины домена.
Версия исследуемого скрипта 2.0.2. Я нисколько не сомневаюсь, что данный алгоритм меняется от версии к версии, и ощутимых потерь это статьей создателям скрипта я не принесу. И даже более того, если вы сами разберете, как функционирует данная защита, то без труда разработаете аналогичную для своей системы.
Если вы считаете, что данная статья выходит за рамки морали или этики, напишите об этом в комментариях. Посмотрим, что можно сделать. Желаю удачи.
Вот обещанный кейген:
Введите имя вашего домена(без http:// и www.)
Куда ввести этот ключ вы надеюсь догадались)
Вообще, ломать программы дело не самое благородное. Тем более, что есть куча бесплатных альтернатив, к примеру kcfinder
UPD:
Кейген обновлен для версии ckFinder v.2.2.1
Комментарии
ищем строчку:
меняем на
Т.е. меняем проверку с домена на проверку определенной строки. Далее для этого "что-то" получаем ключ, и вписываем в конфиг и радуемся)))
$c] = 'что-то';
$config['LicenseKey'] = 'ключ сверху';
ищем:
меняем также на
Киген твой супер, в принципе я тоже могу написать такой-же, однако есть три проблемы:
- время;
- при создании каждого нового сайта мне лазить сюда и кигенить ключ - не айс;
- как решить проблему альянсов если domen.ru и домен.рф - один и тот-же сайт, а finder используется в клиентской части.
Есть еще минусы:
- эта статья пока что единственная.
- нет у меня своего блога. Хотя уже пора заводить.
- твой киген не работает для альянсов (можно считать конечно и минусом CKSource).
Ты строка которую ты указал не относится к этой проблеме.
примерно так
Кстати, ты говорил что 2 знака зависят от длины... Я вижу что только один...
Кстати, почему уведомления не приходят на почту?
да чето сам посмотрел тоже один знак тока зависит.
хочу изменить ету вещь на путь до файла на сервере чтобы было http://www.server.ru/ckeditor/files/и тут уже что-то
спасибо
выглядит вот так
-----------------------------------------------------------------------
function q(s){return ''+s.name+' ('+s.size+'KB, '+s.dateF+')';}
-----------------------------------------------------------------------
вот в етой строчке перед s.name я хочу попытаться прописать путь до файла
не знаю как это сделать :(
то есть если файл лежит на /home/.....public_html/файл
то я хочу в строчке видеть http://www.site.com/файл
я проверил все ок работает, однако не тестил на больших путях.
Ко тому же способ все таки ламерский, брать путь из куков не правильно. Путь лежит где-то наверху, и достает его метод объекта Folder - getPath(), однако там черт ногу сломает, и я так и не понял как его нормально вызвать.
и после нее делаем что-то вроде этого
а уже наша q(s) будет выглядеть так
хотя готов поспорить что объект folder и так виден через какую-то глобалку
Нашел вот такие строчки в js файле
Переменной J надо присвоить пустое значение. Только J!!! Тк функция возвращает I для последующей проверки.
Решим проблему с ненавистной надписью, решил порыться в инете и напоролся на этот топик.
По делу. Мне удалось решить проблему немного проще. В файле "ckfinder.js" нашел текст "sidebar_wrapper", собсно это то самое поле с папками слева. Не важно. И после этого вставил неразрывный пробел чтобы убрать блок с надписью. А точнее, заменил
на
Ненавистная надпись больше не появляется. Почему после этого не появляется надпись, я думаю все поняли ;)
Спасибо за внимание.
(div id="sidebar_wrapper" class="wrapper")'+u.html+'%nbsp;(/div)
P.S.Круглые скобки заменить на угольные, процент заменить на амперсанд.
Осталось убрать надпись из основного окна.
Смотрим тот же "ckfinder.js". Наше ненавистное сообщение выводится в теге H4. Помденяю стиль тега:
(h4 class='message_content' style='display:none;')(/h4)
И html-строчка ещё съелась (см мой коммент ниже).
В любом случае, спасибо.
Странно, что они не проверяют контрольную сумму js-файла.
В этом же файле есть
Добавляем style='display:none'
Непонятно только, единственная ли эта надпись появляется в этом элементе или есть какие-то полезные.
p = a.bF.substr(7, 1);
она проверяет (после всех трансформаций) 25-й символ, а он в приведенном сверху варианте кейгена равен 4-м.
в строке 6166 (примерно идет проверка на срок лицензии)
if (!S && (!p || a.bs.indexOf(p) % 8 < 4)) {
в кейгене надо 4-ре поменять на что-нить поболее - типа так
$config['LicenseKey'] = "2".$characters[$str_dom % 33 + (int)($str_dom / 33)]."11EFGH1JK11NOPQRSTUVWXY51"; - 5-ку все увидели предпоследнюю? вот и все решение.
А не проще ли найти тот DIV в котором выводится эта злобная надпись и просто поставить ему style display:none ???
$str_dom = strlen($_SERVER['HTTP_HOST']);
$characters = "ZYXWVUTSRQPNMLKJHGFEDCBA987654321";
$config['LicenseKey'] = "2".$characters[$str_dom % 33 + (int)($str_dom /
33)]."11EFGH1JK11NOPQRSTUVWXY61";
на новый версии "CKEditor 3.6.3, released on 17 April 2012"
я нижний DEMO слова смог убрать вот его строка
\124\x68\x69\163\x20\x69\x73\x20\x74\x68\145\x20\104\105\x4d\x4f\x20\x76\145\x72\163\151\157\156\040\x6f\x66\x20\x43\x4b\106\151\156\x64\145\x72\x2e\x20\x50\x6c\145\141\x73\x65\040\x76\151\x73\151\x74\040\164\x68\x65\x20\x3c\141\040\150\162\145\146\x3d\047\x68\x74\x74\x70\x3a\057\x2f\x63\153\146\151\x6e\x64\145\162\056\143\157\155\x27\040\x74\x61\162\x67\x65\164\075\x27\137\x62\154\141\156\x6b\047\x3e\103\x4b\x46\x69\156\x64\x65\162\x20\x77\x65\x62\x20\163\x69\x74\145\074\x2f\141\x3e\040\164\x6f\040\157\x62\x74\141\151\156\x20\x61\040\166\141\154\x69\144\x20\x6c\151\143\x65\x6e\163\145\x2e"+q,s=p+"\103\113\106\x69\156\x64\145\x72\x20\x44\x65\166\x65\154\x6f\x70\145\162\x20\x4c\151\x63\145\x6e\x73\145\074\142\x72\x2f\076\x4c\x69\x63\145\x6e\x73\145\144\040\x74\x6f\072\040
а верхний не как не смог убрать оттуда! покажите пожалуйста где это строка
This is the DEMO version of CKFinder. Please visit the CKFinder web site to obtain a valid license.
$config['LicenseKey'] = 'сюда';] и не чего удалять больше не надо?
А вот сейчас - надо было поставить еще один сайт. Все сделал как раньше, но теперь ckfinder работает очень странно. Через раз. Именно так. Нажимаешь на одну и ту-же папку - первое нажатие - сообщение о демо-режиме выскакивает, второе нажатие на ту-же папку - не выскакивает. Третье нажатие - опять сообщение! И т.д. - строго через раз.
Очевидно, что-то изменилось за это время в генераторе, потому как попытка получить код на уже работающий домен выдала код, отличающийся от того, который был получен для этого-же домена в феврале.
Подскажите, что делать?
This is the DEMO version of CKFinder. Please visit the CKFinder web site to obtain a valid license.
а значит в ckfinder.js
меняем
на
Вот как-то так ...)... не особо мудрствуя над кодом.
А где сам код?
Так и я могу написать)
Поменял в конце на 81 и перестала ошибка об Expired появляться.
$config['LicenseName'] = $_SERVER['HTTP_HOST'];
$str_dom = strlen($_SERVER['HTTP_HOST']);
$characters = "ZYXWVUTSRQPNMLKJHGFEDCBA987654321";
$config['LicenseKey'] = "2".$characters[$str_dom % 33 + (int)($str_dom/33)]."11EFGH1JK11NOPQRSTUVWXY81";
prosta bajusj sto ani menja patom zasudjat, sto vot izpoljzuju nelegaljno ..
mozet kto-to sto-to videl!?
spasibo
Хорошее расследование. Потратил чашку кофе на чтение)))
Для актуальной на момент написания комментария версии CKFinder 2.4.1
Чтобы убрать надпись из левой колонки внизу, в файле config.php ставим текущие параметры:
А чтобы убрать после этого надпись в правой колонке сверху, заходим в: ckfinder/skins/kama/app.css и находим следующий класс:
И вместо display:block; что стоит там, ставим свой display:none; Выглядеть это будет так:
Надеюсь, это поможет кому-то :)
Отдельное спасибо автору статьи :)
Исправил, спасибо
работает ))
респект автору
======
у меня тож в движке, и надо штук 20 ключей даж ща
но до того обленился, писать,
что лучше закладку поставлю на эту страничку
и буду по надобности сюда заходить.
надпись та убралась, а вот платные функции не стали доступны (
http://internetevreni.com/proje/konuac.php?fid=1&did=1
if need keygen file my mail exercussystemgmail.com for help.
I think every code is now in ckfinder.js
Before, I use alert() to see the code.
But, this version seems even harder.
Anyone got any idea?
$config['LicenseKey'] = '';
$config['LicenseName'] = $_SERVER['HTTP_HOST'];
$str_dom = strlen($_SERVER['HTTP_HOST']);
$characters = "ZYXWVUTSRQPNMLKJHGFEDCBA987654321";
$config['LicenseKey'] = "2".$characters[$str_dom % 33 + (int)($str_dom/33)]."11EFGH1JK11NOPQRSTUVWXY81";
still works for latest 2.x
spasibo avtoru :)
https://xopgth.com/