За последние 24 часа нас посетили 17933 программиста и 1614 роботов. Сейчас ищут 1469 программистов ...

PHP Encoder

Тема в разделе "Решения, алгоритмы", создана пользователем Ирокез, 21 ноя 2007.

  1. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    На досуге, написл encoder php файлов (аля ЗендЕнкодера, Кюбе), работает по Windows, Linux. Вот теперь сижу и думаю имеет ли он смысл или нет.

    Хотелось бы услышать, нужно ли впринципе защита пхп кода, и есть ли смысл дальнейшего развития своего encoder-а.
     
  2. Anonymous

    Anonymous Guest

    Обсуждалось...
    В вашей реализации - смысла нет. =)
     
  3. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ирокез
    Хотелось бы поподробнее :)
     
  4. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    Ирокез ну ты крут

    а посмотреть можно? если можно на исходники? интересно.
     
  5. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Обфускатор есть?
     
  6. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    Исходники есть, работает на ура. Обфускатор присутствует, только на уровне опкодов php.

    на счет исходников выложить не знаю,
    я думаю если тема интересна то продолжать ее развитие. вот кусочек кода, ну чтоб было понятно, что я не гоню.


    PHP:
    1.  
    2. zend_op_array* profile_compile_file(zend_file_handle *file_handle, int type  TSRMLS_DC)
    3. {
    4.     zend_op_array *t=NULL;
    5.  
    6.     HashTable* orig_function_table;
    7.     HashTable* orig_class_table;
    8.  
    9.     int bailout = 0;
    10.  
    11.     if(module_check_file(file_handle TSRMLS_CC) == 1)
    12.     {
    13.         return NULL;
    14.     }
    15.     else
    16.     {
    17.         zend_try {
    18.             HashTable           tmp_function_table;
    19.             HashTable           tmp_class_table;
    20.             zend_function       tmp_func;
    21.             zend_class_entry    tmp_class;
    22.             Bucket              *function_table_tail = NULL;
    23.             Bucket              *class_table_tail = NULL;
    24.  
    25.             zend_hash_init_ex(&tmp_function_table, 100, NULL, ZEND_FUNCTION_DTOR, 1, 0);
    26.             zend_hash_copy(&tmp_function_table, &global_function_table, NULL, &tmp_func, sizeof(zend_function));
    27.             orig_function_table = CG(function_table);
    28.             CG(function_table) = &tmp_function_table;
    29.             zend_hash_init_ex(&tmp_class_table, 10, NULL, ZEND_CLASS_DTOR, 1, 0);
    30.             zend_hash_copy(&tmp_class_table, &global_class_table, NULL, &tmp_class, sizeof(zend_class_entry));
    31.             orig_class_table = CG(class_table);
    32.             CG(class_table) = &tmp_class_table;
    33.             t = previos_zend_compile_file(file_handle, type TSRMLS_CC);
    34. //          zend_printf("Compilation time: %f\n",seconds());
    35.  
    36.             function_table_tail = tmp_function_table.pListHead;
    37.             class_table_tail = tmp_class_table.pListHead;
    38.             module_encrypt_and_store_file(file_handle,t,&tmp_function_table,&tmp_class_table TSRMLS_CC);
    39.  
    40.             CG(function_table) = orig_function_table;
    41.             CG(class_table) = orig_class_table;
    42.  
    43.  
    44.             while (function_table_tail != NULL) {
    45.                 zend_op_array *op_array = (zend_op_array*)function_table_tail->pData;
    46.                 if (op_array->type == ZEND_USER_FUNCTION) {
    47.                     if (zend_hash_add(CG(function_table),
    48.                         function_table_tail->arKey,
    49.                         function_table_tail->nKeyLength,
    50.                         op_array, sizeof(zend_op_array), NULL) == FAILURE &&
    51.                         function_table_tail->arKey[0] != '\000') {
    52.                             CG(in_compilation) = 1;
    53.                             CG(compiled_filename) = file_handle->opened_path;
    54.                             CG(zend_lineno) = op_array->line_start;
    55.                             zend_error(E_ERROR, "Cannot redeclare %s()", function_table_tail->arKey);
    56.                     }
    57.                 }
    58.                 function_table_tail = function_table_tail->pListNext;
    59.             }
    60.             while (class_table_tail != NULL) {
    61.                 zend_class_entry **ce = (zend_class_entry**)class_table_tail->pData;
    62.                 if ((*ce)->type == ZEND_USER_CLASS) {
    63.                     if (zend_hash_add(CG(class_table),
    64.                         class_table_tail->arKey,
    65.                         class_table_tail->nKeyLength,
    66.                         ce, sizeof(zend_class_entry*), NULL) == FAILURE &&
    67.                         class_table_tail->arKey[0] != '\000') {
    68.                             CG(in_compilation) = 1;
    69.                             CG(compiled_filename) = file_handle->opened_path;
    70.                             CG(zend_lineno) = (*ce)->line_start;
    71.                             zend_error(E_ERROR, "Cannot redeclare class %s", class_table_tail->arKey);
    72.                     }
    73.                 }
    74.                 class_table_tail = class_table_tail->pListNext;
    75.             }
    76.  
    77.             tmp_function_table.pDestructor = NULL;
    78.             tmp_class_table.pDestructor = NULL;
    79.             zend_hash_destroy(&tmp_function_table);
    80.             zend_hash_destroy(&tmp_class_table);
    81.  
    82.  
    83.         } zend_catch {
    84.             CG(function_table) = orig_function_table;
    85.             CG(class_table) = orig_class_table;
    86.             bailout = 1;
    87.         } zend_end_try();
    88.  
    89.         if (bailout) {
    90.             zend_bailout();
    91.         }
    92.     }
    93.     return t;
    94. }
    95.  
    вот то что он выдает

    PHP:
    1.  
    2. /*<PHP_COMPACT/>*/
    3. <?php echo "PHP Compact not installed";?>
    4. /*
    5. <PHP_COMPACT_DATA_BEGIN>
    6. eNqVmz1wG8cVgPmHHwIkAEZy/BPZA0qWJcuUSP1FIk1J/AH4ExP8BSJREnM6AkfySBwOwR0YyuPh2DMqaI+
    7. c0WRUpHDhQoWLFC5SuHDhQoUKFS5cpPBMnBkXnomKFCpUZCbBHt4j3i52KQAjcsHd93a/9/
    8. Zu7+27VUuL+Gmt/h6t/ngf3+8rv4LY7mcSbazGXtUcVy+5le8d0Dpc+
    9. QkcBfFWTrw1Tnphn4C8207LzJZs17QM6Pdw5cfP5FdAvo00oH6busOAsVPM2zns7iQOr5OKmL9me7V2GL4H+
    10. 1lD674VUuF5uXCLVDiHwh+SCuyFqe2ggE4qav20gvh9oAzJ/f3a9aUxbXRmZu66Nj07PpNJJLXxudmJ6UniJE7dM6/dU28VPBuSe9afM9
    11. bMAjr2S2gPb4NwjBOOZO3Cmrl+
    12. xixkzxQ3iqD0d1DqyvHCDH5peSmdTGmJ6UUB5wkqzXJKXdt6ySH9oygrf0QVCocNDOQ/INDNg8QYCPhvqR6lFS/8bh7lkJ6zc6v93m+
    13. eyNNg5WuoKRB5DRWh1j4QiDThmtYRVOJ5outGwSjpeYFlBMo0aoksaWDZAIFoMywfoZIwTXrZ3RBAPoLyAaqIIA8A5BHe
    14. Vs2AfINKP
    15. Egsp7v6qu4YAsw3UD5FNRHmKcD8BAI9zcA8RyVhhoy8YRkFV2B5Xi3b
    16. sIcegcVrqLC0HQGBXzXB0jaASiLLjpEtu4JfPGlWJlBLZEkAyw0QONQMSx6VBBbHcBzTLggseSg/Ri2R5WNgeQgCh5th+
    17. QqVhAvGNaxiXq9zzFdQfotqIsy3APM9CLzSDMzPqMTD9LglveBIaH6G8gXqiTQvqjTtXSDw6yZo2uOoxNN0O4ZbLvIkniwrL6COQ
    18. OI1MJIpEH
    19. i1GZLbqMSThHcsYZnzJFlZRA2RA55G7ffgYfD6KT4k+ZOzqul5wwt1glygVPm0/
    20. xW+vH4Lmi96zaDtNbPO/4Zifya9BGuBQft3KKATjdpzH8Ke9h8A8g0esotB5ozV8vq6UZJy/
    21. gJf3kDOQY7zF+
    22. ...... ну и т.д.==
    23.  
    24. </PHP_COMPACT_DATA_END>
    25. */
    26.  
    27.  
    [/code]
     
  7. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    Если по подробнее то сейчас работает:
    1. Encoder - отдельный одуль который, кодирует все файлы в данной папке
    Суть кодирования заключается, в сохранении опкодов скрипта, после компиляции его движком пхп (тобишь zend-ом) + обфускация опкодов
    2. Loader - модуль в php загружает скрипт проверяет его на то есть там данные, декодирует их и отдает executor-у zend-a

    исходя из тестов, ну по крайней мере скорость выполнения скриптов увеличивается, есть еще кой какие мысли, направленные на защиту от реверсинга и т.д.

    но честно говоря, одноу тяжело это делать, да и не знаю стоит ли.

    я далеко не склонен к мнению, что я самый умный, но просто интересно, почеу нет фриварных протекторов скриптов.
    eAccelerator, XCashe не считаем, был MMTruck, но его не суппортят, возникла мысль, сделал, вот теперь не знаю что делать дальше, чуствую потребность в это есть, но логичное обоснование для того чтоб эти заниматься, пока не нахожу.
     
  8. Anonymous

    Anonymous Guest

    А! Вот теперь могу взять свои слова обратно. И даже извиниться. )
    Все гораздо лучше и интересней, чем я ожидал!

    Меня интересует вопрос производительности - примеры есть?
     
  9. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    хм. ну если нужна объективная оценка, то скажите на чем протестировать, smarty, adodb, ну или еще на чем, но на том что я проводил, а именно смарти с небольшим темплейтом, то прирост составлял от 17 до 22 процентов
     
  10. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Кстати, в XCache в 2.0 автор обещает encoder скриптов. Может есть смысл скооперироваться с автором XCache и сделать это вместе? Там люди не дураки да и будет с кем обсудить тему. Ну и получите от многих большое огромное спасибо (от меня тоже, т.к. XCache отличная штука и если его ещё можно будет использовать что-бы продавать encoded скрипты заказчикам - лично пожертвую 50$)
    З.Ы. В С я нуль, так что по коду ничего сказать не могу.
     
  11. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    А оно в С написано?
     
  12. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ирокез
    В качестве мелкой придирки - у вас в закодированном файле PHP-комментарии попадают за пределы PHP-блока :) т.е. если енкодер на машине не установлен, весь мусор попадет в браузер.
     
  13. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    Dagdamor
    эт мне просто было лень копировать весь файл, поэтому там не до конца )

    antonn
    да
     
  14. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    обычно в таких программах еще делается счетчик дней для лицензирования и IP-MAC подвязка к машине, и все вроде.
    но и то и то по моему в своих силах любой програмер организовать , хотя и в шифровальщиках эти функции тоже иногда бывают.

    у меня вот самого вопрос чем шифровать мой скрипт :) , и как скрывать собственно сам счетчик?
    сама программа продается довольно паршиво несмотря на очень низкую стоимость. (в основном конечно виновато что интерфейс делался чисто для себя, мало кто в нем понимает).

    А вообще я тоже могу немного пожертвовать на благо кодирования :)
     
  15. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    К сожалению, очень мало людей которые, знают PHP и C++, и трудно найти человека, который бы помогал развитию проекта, возожно правильным вариантом будет выложить исходники, а уж кому понадобится, тот пусть дорабатывает. Хотя сама по себе идея создания мощного кросплатфоренного пхп энкодера при это бесплатного уж очень сильно прильщает, денег не заработаешь, но хоть кто-то спасибо скажет )
     
  16. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    Надо смотреть глубже )

    Разрабочик MMTruck сейчас в Zend-де работает и думаю зарабатывает он там очень хорошо.
     
  17. Alexandre

    Alexandre Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    45
    Симпатии:
    0
    вещь стоящая,
    а можно услышать суть алгоритма?
     
  18. insidex

    insidex Активный пользователь

    С нами с:
    26 дек 2007
    Сообщения:
    2
    Симпатии:
    0
    Ирокез
    Поделись как сериализацию для zend_op_array провел ?

    самый фриварный - bcompiler,

    У самого уже готовый продукт висит, делал по идее так же как и ты, пока правда перевод в опкоды опустил из-за проблем с сериализацией, да и как мне кажется насчет реверсинга - если уж отламают верхнюю защиту(шифрование), то нижнюю по аналогии с дезендом опустят.
     
  19. Alexandre

    Alexandre Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    45
    Симпатии:
    0
    insidex что значит нижняя и верхняя защита?
     
  20. insidex

    insidex Активный пользователь

    С нами с:
    26 дек 2007
    Сообщения:
    2
    Симпатии:
    0
    я не знаю как у Ирокез, у меня это - AES-128bit([транслированный нативный PHP код в байткод]).
     
  21. Alexandre

    Alexandre Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    45
    Симпатии:
    0
    insidex, т.е. ты тупо шифруешь свой PHP-код AES-128bit в бинарный файл, а при исполнении кода - расшифровываешь и исполняешь eval? или у тебя сделано в ввиде экстеншена?

    темя энкодера меня интересовала давно, только я не знал "точек входа РНР".
     
  22. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    Хех op_array эт самый что не наесть "геморой", сериализовать его нет проблем, а вот корректно восстановить эт уже серьезней, главное хештайблы восстановить корректно и ссылки на все внутренние объекты + были проблемы с восстановлением классов с их наследованием и т.д. в двух словах все равно не объяснишь.

    По поводу верхней и нижней защиты:
    верхняя роли не играет никакой, практически она "0", в любом случае скрипт ты отдаёшь вместе с колючем, ну по другому он не запустится, а расшифровать скрипт имея ключ, никаких проблем, так-что это не более чем "крючок на двери".

    Вот другое дело это использование антиреверсинга при сериализации и восстановлении опкода. Но это тема другой истории.

    По поводу eval-a однозначно могу сказать, что это не защита. Ломается она самым простым методом. компилируется с отладочной информацией php, подставляется к примеру в апач или консоль, устанавливается __asm 3, на перехваченой функции zend_execute - смотрим там в опкодах вызов eval, а в качестве параметров там уже есть готовый расшифрованный ваш скрипт. впринципе все это можно сделать в автоматизированно режиме.
     
  23. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    Защита состоит из двух модулей
    1. екзешник + модуль сериализации опкода (можно обойтись и без екзешника, есть идея выложить по принципу ионКубэ, т.е. на сайт отсылаем расшифрованный скрипт, с сайта забираем зашифрованный) - он выполянет функцию перекодирования и сохранения скрипта, во внутренние структуры php. Наверно поясню тут: скрипт выполняется в несколько этапов
    а) компиляция скрипта во внутренние структуры и команды (опкоды) zend-а, достаточно долгая операция
    б) ---- мой энкодер --- сохраняет их
    в) выполнение опкодов
    г) если есть инклуд, то идем к шагу а)

    2. непосредственно модуль, который грузится как екстеншен в пхп, который производит загрузку сохраненного опкода (минуется шаг а) и при этом нет исходного кода скрипта, по крайней мере читаемого ) т.е. схема выполнения сводится к:
    а) восстановление структур
    в) выполнение опкодов
    г) если есть инклуд, то идем к шагу а)

    при всех прочих, очевидно возрастает скорость исполнения скрипта (не опкодов) + нет возможности явно похитить интелектуальную собственность заложенную в скрипт )))

    ну вообще то что делает zend optimizer, ionCube

    Очень хотелось бы выложить это в качестве свободного енкодера\декодера (кодирование через сайт), а модуль для декодирования бесплатно, но нет времени заниматься. Еслиб нашелся кто :)
     
  24. Alexandre

    Alexandre Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    45
    Симпатии:
    0
    +1 в команду, только мне надо закончить свой экстеншен, планирую его довести до ума за каникулы...

    Ирокез, где можно прочитать, как устроены опкоды... не знаю точек входа и пр. АПИ, который отвечает непосредственно за выполнение кода.
     
  25. Ирокез

    Ирокез Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Minsk, Belarus
    Отлично, еслиб насобирался кворум, хотя бы из 3-4 человек, то можно было-бы уже обсуждать.

    Опкоды - это просто команды операций для зенда, т.е. числовые значения. За ними закреплены внутренние функции zend-a, а вот вместе с опкодами идут еще и параметры zval которые куда важнее.

    Почитать, в полном объёме, врятли где можно найти. Лучшее средство это изучить исходный код zend-a, очень незначительная часть есть книге "Проффесиональное программирование в PHP". Но в основном исходный код