На досуге, написл encoder php файлов (аля ЗендЕнкодера, Кюбе), работает по Windows, Linux. Вот теперь сижу и думаю имеет ли он смысл или нет. Хотелось бы услышать, нужно ли впринципе защита пхп кода, и есть ли смысл дальнейшего развития своего encoder-а.
Исходники есть, работает на ура. Обфускатор присутствует, только на уровне опкодов php. на счет исходников выложить не знаю, я думаю если тема интересна то продолжать ее развитие. вот кусочек кода, ну чтоб было понятно, что я не гоню. PHP: zend_op_array* profile_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) { zend_op_array *t=NULL; HashTable* orig_function_table; HashTable* orig_class_table; int bailout = 0; if(module_check_file(file_handle TSRMLS_CC) == 1) { return NULL; } else { zend_try { HashTable tmp_function_table; HashTable tmp_class_table; zend_function tmp_func; zend_class_entry tmp_class; Bucket *function_table_tail = NULL; Bucket *class_table_tail = NULL; zend_hash_init_ex(&tmp_function_table, 100, NULL, ZEND_FUNCTION_DTOR, 1, 0); zend_hash_copy(&tmp_function_table, &global_function_table, NULL, &tmp_func, sizeof(zend_function)); orig_function_table = CG(function_table); CG(function_table) = &tmp_function_table; zend_hash_init_ex(&tmp_class_table, 10, NULL, ZEND_CLASS_DTOR, 1, 0); zend_hash_copy(&tmp_class_table, &global_class_table, NULL, &tmp_class, sizeof(zend_class_entry)); orig_class_table = CG(class_table); CG(class_table) = &tmp_class_table; t = previos_zend_compile_file(file_handle, type TSRMLS_CC); // zend_printf("Compilation time: %f\n",seconds()); function_table_tail = tmp_function_table.pListHead; class_table_tail = tmp_class_table.pListHead; module_encrypt_and_store_file(file_handle,t,&tmp_function_table,&tmp_class_table TSRMLS_CC); CG(function_table) = orig_function_table; CG(class_table) = orig_class_table; while (function_table_tail != NULL) { zend_op_array *op_array = (zend_op_array*)function_table_tail->pData; if (op_array->type == ZEND_USER_FUNCTION) { if (zend_hash_add(CG(function_table), function_table_tail->arKey, function_table_tail->nKeyLength, op_array, sizeof(zend_op_array), NULL) == FAILURE && function_table_tail->arKey[0] != '\000') { CG(in_compilation) = 1; CG(compiled_filename) = file_handle->opened_path; CG(zend_lineno) = op_array->line_start; zend_error(E_ERROR, "Cannot redeclare %s()", function_table_tail->arKey); } } function_table_tail = function_table_tail->pListNext; } while (class_table_tail != NULL) { zend_class_entry **ce = (zend_class_entry**)class_table_tail->pData; if ((*ce)->type == ZEND_USER_CLASS) { if (zend_hash_add(CG(class_table), class_table_tail->arKey, class_table_tail->nKeyLength, ce, sizeof(zend_class_entry*), NULL) == FAILURE && class_table_tail->arKey[0] != '\000') { CG(in_compilation) = 1; CG(compiled_filename) = file_handle->opened_path; CG(zend_lineno) = (*ce)->line_start; zend_error(E_ERROR, "Cannot redeclare class %s", class_table_tail->arKey); } } class_table_tail = class_table_tail->pListNext; } tmp_function_table.pDestructor = NULL; tmp_class_table.pDestructor = NULL; zend_hash_destroy(&tmp_function_table); zend_hash_destroy(&tmp_class_table); } zend_catch { CG(function_table) = orig_function_table; CG(class_table) = orig_class_table; bailout = 1; } zend_end_try(); if (bailout) { zend_bailout(); } } return t; } вот то что он выдает PHP: /*<PHP_COMPACT/>*/ <?php echo "PHP Compact not installed";?> /* <PHP_COMPACT_DATA_BEGIN> eNqVmz1wG8cVgPmHHwIkAEZy/BPZA0qWJcuUSP1FIk1J/AH4ExP8BSJREnM6AkfySBwOwR0YyuPh2DMqaI+ c0WRUpHDhQoWLFC5SuHDhQoUKFS5cpPBMnBkXnomKFCpUZCbBHt4j3i52KQAjcsHd93a/9/ Zu7+27VUuL+Gmt/h6t/ngf3+8rv4LY7mcSbazGXtUcVy+5le8d0Dpc+ QkcBfFWTrw1Tnphn4C8207LzJZs17QM6Pdw5cfP5FdAvo00oH6busOAsVPM2zns7iQOr5OKmL9me7V2GL4H+ 1lD674VUuF5uXCLVDiHwh+SCuyFqe2ggE4qav20gvh9oAzJ/f3a9aUxbXRmZu66Nj07PpNJJLXxudmJ6UniJE7dM6/dU28VPBuSe9afM9 bMAjr2S2gPb4NwjBOOZO3Cmrl+ xixkzxQ3iqD0d1DqyvHCDH5peSmdTGmJ6UUB5wkqzXJKXdt6ySH9oygrf0QVCocNDOQ/INDNg8QYCPhvqR6lFS/8bh7lkJ6zc6v93m+ eyNNg5WuoKRB5DRWh1j4QiDThmtYRVOJ5outGwSjpeYFlBMo0aoksaWDZAIFoMywfoZIwTXrZ3RBAPoLyAaqIIA8A5BHe Vs2AfINKP Egsp7v6qu4YAsw3UD5FNRHmKcD8BAI9zcA8RyVhhoy8YRkFV2B5Xi3b sIcegcVrqLC0HQGBXzXB0jaASiLLjpEtu4JfPGlWJlBLZEkAyw0QONQMSx6VBBbHcBzTLggseSg/Ri2R5WNgeQgCh5th+ QqVhAvGNaxiXq9zzFdQfotqIsy3APM9CLzSDMzPqMTD9LglveBIaH6G8gXqiTQvqjTtXSDw6yZo2uOoxNN0O4ZbLvIkniwrL6COQ OI1MJIpEH i1GZLbqMSThHcsYZnzJFlZRA2RA55G7ffgYfD6KT4k+ZOzqul5wwt1glygVPm0/ xW+vH4Lmi96zaDtNbPO/4Zifya9BGuBQft3KKATjdpzH8Ke9h8A8g0esotB5ozV8vq6UZJy/ gJf3kDOQY7zF+ ...... ну и т.д.== </PHP_COMPACT_DATA_END> */ [/code]
Если по подробнее то сейчас работает: 1. Encoder - отдельный одуль который, кодирует все файлы в данной папке Суть кодирования заключается, в сохранении опкодов скрипта, после компиляции его движком пхп (тобишь zend-ом) + обфускация опкодов 2. Loader - модуль в php загружает скрипт проверяет его на то есть там данные, декодирует их и отдает executor-у zend-a исходя из тестов, ну по крайней мере скорость выполнения скриптов увеличивается, есть еще кой какие мысли, направленные на защиту от реверсинга и т.д. но честно говоря, одноу тяжело это делать, да и не знаю стоит ли. я далеко не склонен к мнению, что я самый умный, но просто интересно, почеу нет фриварных протекторов скриптов. eAccelerator, XCashe не считаем, был MMTruck, но его не суппортят, возникла мысль, сделал, вот теперь не знаю что делать дальше, чуствую потребность в это есть, но логичное обоснование для того чтоб эти заниматься, пока не нахожу.
А! Вот теперь могу взять свои слова обратно. И даже извиниться. ) Все гораздо лучше и интересней, чем я ожидал! Меня интересует вопрос производительности - примеры есть?
хм. ну если нужна объективная оценка, то скажите на чем протестировать, smarty, adodb, ну или еще на чем, но на том что я проводил, а именно смарти с небольшим темплейтом, то прирост составлял от 17 до 22 процентов
Кстати, в XCache в 2.0 автор обещает encoder скриптов. Может есть смысл скооперироваться с автором XCache и сделать это вместе? Там люди не дураки да и будет с кем обсудить тему. Ну и получите от многих большое огромное спасибо (от меня тоже, т.к. XCache отличная штука и если его ещё можно будет использовать что-бы продавать encoded скрипты заказчикам - лично пожертвую 50$) З.Ы. В С я нуль, так что по коду ничего сказать не могу.
Ирокез В качестве мелкой придирки - у вас в закодированном файле PHP-комментарии попадают за пределы PHP-блока т.е. если енкодер на машине не установлен, весь мусор попадет в браузер.
обычно в таких программах еще делается счетчик дней для лицензирования и IP-MAC подвязка к машине, и все вроде. но и то и то по моему в своих силах любой програмер организовать , хотя и в шифровальщиках эти функции тоже иногда бывают. у меня вот самого вопрос чем шифровать мой скрипт , и как скрывать собственно сам счетчик? сама программа продается довольно паршиво несмотря на очень низкую стоимость. (в основном конечно виновато что интерфейс делался чисто для себя, мало кто в нем понимает). А вообще я тоже могу немного пожертвовать на благо кодирования
К сожалению, очень мало людей которые, знают PHP и C++, и трудно найти человека, который бы помогал развитию проекта, возожно правильным вариантом будет выложить исходники, а уж кому понадобится, тот пусть дорабатывает. Хотя сама по себе идея создания мощного кросплатфоренного пхп энкодера при это бесплатного уж очень сильно прильщает, денег не заработаешь, но хоть кто-то спасибо скажет )
Надо смотреть глубже ) Разрабочик MMTruck сейчас в Zend-де работает и думаю зарабатывает он там очень хорошо.
Ирокез Поделись как сериализацию для zend_op_array провел ? самый фриварный - bcompiler, У самого уже готовый продукт висит, делал по идее так же как и ты, пока правда перевод в опкоды опустил из-за проблем с сериализацией, да и как мне кажется насчет реверсинга - если уж отламают верхнюю защиту(шифрование), то нижнюю по аналогии с дезендом опустят.
insidex, т.е. ты тупо шифруешь свой PHP-код AES-128bit в бинарный файл, а при исполнении кода - расшифровываешь и исполняешь eval? или у тебя сделано в ввиде экстеншена? темя энкодера меня интересовала давно, только я не знал "точек входа РНР".
Хех op_array эт самый что не наесть "геморой", сериализовать его нет проблем, а вот корректно восстановить эт уже серьезней, главное хештайблы восстановить корректно и ссылки на все внутренние объекты + были проблемы с восстановлением классов с их наследованием и т.д. в двух словах все равно не объяснишь. По поводу верхней и нижней защиты: верхняя роли не играет никакой, практически она "0", в любом случае скрипт ты отдаёшь вместе с колючем, ну по другому он не запустится, а расшифровать скрипт имея ключ, никаких проблем, так-что это не более чем "крючок на двери". Вот другое дело это использование антиреверсинга при сериализации и восстановлении опкода. Но это тема другой истории. По поводу eval-a однозначно могу сказать, что это не защита. Ломается она самым простым методом. компилируется с отладочной информацией php, подставляется к примеру в апач или консоль, устанавливается __asm 3, на перехваченой функции zend_execute - смотрим там в опкодах вызов eval, а в качестве параметров там уже есть готовый расшифрованный ваш скрипт. впринципе все это можно сделать в автоматизированно режиме.
Защита состоит из двух модулей 1. екзешник + модуль сериализации опкода (можно обойтись и без екзешника, есть идея выложить по принципу ионКубэ, т.е. на сайт отсылаем расшифрованный скрипт, с сайта забираем зашифрованный) - он выполянет функцию перекодирования и сохранения скрипта, во внутренние структуры php. Наверно поясню тут: скрипт выполняется в несколько этапов а) компиляция скрипта во внутренние структуры и команды (опкоды) zend-а, достаточно долгая операция б) ---- мой энкодер --- сохраняет их в) выполнение опкодов г) если есть инклуд, то идем к шагу а) 2. непосредственно модуль, который грузится как екстеншен в пхп, который производит загрузку сохраненного опкода (минуется шаг а) и при этом нет исходного кода скрипта, по крайней мере читаемого ) т.е. схема выполнения сводится к: а) восстановление структур в) выполнение опкодов г) если есть инклуд, то идем к шагу а) при всех прочих, очевидно возрастает скорость исполнения скрипта (не опкодов) + нет возможности явно похитить интелектуальную собственность заложенную в скрипт ))) ну вообще то что делает zend optimizer, ionCube Очень хотелось бы выложить это в качестве свободного енкодера\декодера (кодирование через сайт), а модуль для декодирования бесплатно, но нет времени заниматься. Еслиб нашелся кто
+1 в команду, только мне надо закончить свой экстеншен, планирую его довести до ума за каникулы... Ирокез, где можно прочитать, как устроены опкоды... не знаю точек входа и пр. АПИ, который отвечает непосредственно за выполнение кода.
Отлично, еслиб насобирался кворум, хотя бы из 3-4 человек, то можно было-бы уже обсуждать. Опкоды - это просто команды операций для зенда, т.е. числовые значения. За ними закреплены внутренние функции zend-a, а вот вместе с опкодами идут еще и параметры zval которые куда важнее. Почитать, в полном объёме, врятли где можно найти. Лучшее средство это изучить исходный код zend-a, очень незначительная часть есть книге "Проффесиональное программирование в PHP". Но в основном исходный код