├── .gitignore ├── README.md ├── decode_file.php ├── index.php ├── preview.jpg └── variables.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Работает: 14.05.2020 2 | 3 | Скрипт полуавтоматически преобразует закодированные файлы Bitrix в читабельный формат. 4 | 5 | ![Пример использования](https://github.com/pLavrenov/bitrix-decoder/blob/master/preview.jpg) 6 | 7 | # Инструкция 8 | 9 | 1. Открываем файл и копируем закодированную часть. 10 | 2. Приводим к правильному виду через http://beautifytools.com/php-beautifier.php (можно стандартными средствами IDE) и копируем в файл decode_file.php 11 | 3. В подготовленом файле сверху находятся один или 2 массива и функция. Вырезаем их и вставляем в файл variables.php. Начинаться они будут примерно так: 12 | * Массив: `$GLOBALS['____153126584'] = array(base64_deco...` 13 | * Функция: `if (!function_exists(__NAMESPACE__.'\\___1076931394')) { function ___1076931394($_367941623) {...` 14 | 4. Название массива копируем в 'GLOBAL_VARIABLES' в index.php а названия функций в 'GLOBAL_FUNCTIONS' они обозначены тремя нижними подчеркиваниями. 15 | 5. Запускаем скрипт из консоли `php index.php` 16 | 6. Появится файл encode_file.php в нем будет читабельный код. 17 | 18 | ### Пример строки 19 | 20 | Было: 21 | `$_236203417 = $GLOBALS[___1076931394(0)]->Query(___1076931394(1), true);` 22 | 23 | Стало: 24 | `$_236203417 = $GLOBALS['DB']->Query('SELECT VALUE FROM b_option WHERE NAME='~PARAM_MAX_USERS' AND MODULE_ID='main' AND SITE_ID IS NULL', true);` 25 | -------------------------------------------------------------------------------- /decode_file.php: -------------------------------------------------------------------------------- 1 | init(); 26 | } 27 | 28 | private function console_log($str) 29 | { 30 | $this->console_output .= $str . "\n"; 31 | } 32 | 33 | public function init() 34 | { 35 | !defined('DECODE_FILE_PATH') ? die('Не задана константа "DECODE_FILE_PATH"') : null; 36 | 37 | !file_exists( DECODE_FILE_PATH ) ? die('Файл "DECODE_FILE_PATH" не найден') : null; 38 | 39 | $this->file = file_get_contents( DECODE_FILE_PATH ); 40 | 41 | $this->edit_variables_array('GLOBAL_VARIABLES'); 42 | 43 | $this->edit_variables_function('GLOBAL_FUNCTIONS'); 44 | 45 | $this->prepare(); 46 | 47 | file_put_contents( ENCODE_FILE_PATH , $this->file); 48 | } 49 | 50 | private function edit_variables_array($const_name) 51 | { 52 | if (defined($const_name)) { 53 | foreach (constant($const_name) as $key => $value) { 54 | $this->file = preg_replace_callback('/\$GLOBALS\[\''.$value.'\'\]\[(\d+)\]/', function($matches) use ($value) { 55 | return $GLOBALS[$value][$matches[1]]; 56 | }, $this->file); 57 | } 58 | } 59 | } 60 | 61 | private function edit_variables_function($const_name) 62 | { 63 | if (defined($const_name)) { 64 | foreach (constant($const_name) as $key => $value) { 65 | $this->file = preg_replace_callback('/'.$value.'\((\d+)\)/', function($matches) use ($value) { 66 | return "'" . $value($matches[1]) . "'"; 67 | }, $this->file); 68 | } 69 | } 70 | } 71 | 72 | private function prepare() 73 | { 74 | for ($i = 0; $i < REPEATER_COUNT; $i++) { 75 | $this->prepare_func(); 76 | } 77 | 78 | $this->prepare_compute(); 79 | } 80 | 81 | private function prepare_func() 82 | { 83 | $this->file = preg_replace_callback('/(min|round|strtoupper|strrev)\([^\(\)\$]+\)/', function($matches) { 84 | $result = eval("return $matches[0];"); 85 | 86 | //$this->console_log(gettype($result) . ' - ' . $matches[0] . ' --- ' . eval("return $matches[0];")); 87 | 88 | switch (gettype($result)) { 89 | case 'string': 90 | return "'" . $result . "'"; 91 | break; 92 | case 'double': 93 | return $result; 94 | break; 95 | case 'integer': 96 | return $result; 97 | break; 98 | default: 99 | break; 100 | } 101 | }, $this->file); 102 | } 103 | 104 | private function prepare_compute() 105 | { 106 | $this->file = preg_replace_callback('/\(([0-9-+*\/\s]{2,}?)\)/', function($matches) { 107 | return eval("return $matches[1];"); 108 | }, $this->file); 109 | } 110 | 111 | } 112 | 113 | $decode = new Decode; 114 | 115 | 116 | echo '
';
117 | print_r($decode->console_output);
118 | echo '
'; 119 | 120 | 121 | -------------------------------------------------------------------------------- /preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pLavrenov/bitrix-decoder/dcc65c60214c88b4ff4e63dfc05f4c8d6791a74e/preview.jpg -------------------------------------------------------------------------------- /variables.php: -------------------------------------------------------------------------------- 1 |