Деобфуксация php кода и ChatGPT

sanchozu

Разрушитель (V)
Сообщения
165
Симпатии
145
Баллы
3 931
ИИ быстро входит в нашу жизнь и я решил попробовать использовать ChatGPT в нелегком деле нуления скриптов, например есть несложная но достаточно муторная в плане декодирования защита скриптов обфуксацией кода, когда код делается нечитабельным активно используются закодированные base64 строки.
Для примера взял защиту шаблона ShowCase 1.7 для OpenCart файл \admin\controller\extension\theme\oct_showcase.php

Просим ChatGPT:
сделай следующий php код более читабельным
PHP:
if(($this->{$this->_1481607973(0)}->{$this->_1481607973(1)}[$this->_1481607973(2)]==$this->_1481607973(3)) && $this->{$this->_1908729617(0)}()){    if(isset($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(5)])&&!empty($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(5)]))    {        $this->{$this->_1481607973(6)}->{$this->_1481607973(7)}($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(5)]);        unset($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(5)]);    }else{        $this->{$this->_1481607973(6)}->{$this->_1481607973(7)}([]);    }    if(isset($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(8)])&&!empty($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(8)]))    {        $this->{$this->_1481607973(6)}->{$this->_1481607973(9)}($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(8)]);unset($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(8)]);    }else{        $this->{$this->_1481607973(6)}->{$this->_1481607973(9)}([]);    }    $this->{$this->_1481607973(10)}->{$this->_1481607973(11)}($this->_1481607973(12).$this->{$this->_1481607973(13)},$this->{$this->_1481607973(0)}->{$this->_1481607973(4)},$this->{$this->_1481607973(0)}->{$this->_1481607973(15)}[$this->_1481607973(16)]);    $this->generateCss($this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(12).$this->{$this->_1481607973(13)}.$this->_1481607973(14)],$this->{$this->_1481607973(0)}->{$this->_1481607973(4)}[$this->_1481607973(12).$this->{$this->_1481607973(13)}.'_css_code'],$store_id);    $this->{$this->_1481607973(24)}->{$this->_1481607973(17)}['success']=$this->{$this->_1314128468(4)}->{$this->_1481607973(15)}($this->_2074209311(2));    $this->{$this->_2074209311(3)}->{$this->_2074209311(4)}($this->{$this->_2074209311(5)}->{$this->_2074209311(6)}($this->_1481607973(18).$this->{$this->_1481607973(13)},$this->_1481607973(23).'='.$this->{$this->_1481607973(24)}->{$this->_1481607973(17)}[$this->_1481607973(23)].'&'.$this->_1481607973(16).'='.$this->{$this->_1481607973(0)}->{$this->_1481607973(15)}[$this->_1481607973(16)],true));}protected function _1481607973($i){        $a=['request', 'server', 'REQUEST_METHOD', 'POST', 'post', 'oct_locations', 'model_octemplates_main_oct_settings', 'addOCTLocations', 'oct_megamenu', 'addOCTMenu', 'model_setting_setting', 'editSetting', 'theme_', 'oct_theme', '_data_colors', 'get', 'store_id', 'data', 'extension/theme/', 'response', 'redirect', 'url', 'link', 'user_token', 'session'];    return $a[$i];}

Получаем ответ:
Ваш код использует функцию _1481607973($i), которая возвращает строку из массива $a по индексу $i. Это делает код трудным для чтения, поскольку неясно, что делает каждый вызов функции. Я заменю вызовы этой функции на соответствующие строки из массива $a для улучшения читаемости.
PHP:
if(($this->request->server['REQUEST_METHOD'] == 'POST') && $this->_1908729617(0)) {

    if(isset($this->request->post['oct_locations']) && !empty($this->request->post['oct_locations'])) {
        $this->model_octemplates_main_oct_settings->addOCTLocations($this->request->post['oct_locations']);
        unset($this->request->post['oct_locations']);
    } else {
        $this->model_octemplates_main_oct_settings->addOCTLocations([]);
    }

    if(isset($this->request->post['oct_megamenu']) && !empty($this->request->post['oct_megamenu'])) {
        $this->model_octemplates_main_oct_settings->addOCTMenu($this->request->post['oct_megamenu']);
        unset($this->request->post['oct_megamenu']);
    } else {
        $this->model_octemplates_main_oct_settings->addOCTMenu([]);
    }

    $this->model_setting_setting->editSetting('theme_' . 'oct_theme', $this->request->post, $this->request->get['store_id']);
    $this->generateCss($this->request->post['theme_' . 'oct_theme' . '_data_colors'], $this->request->post['theme_' . 'oct_theme' . '_css_code'], $store_id);
    $this->session->data['success'] = $this->_1314128468(4)->get($this->_2074209311(2));
    $this->response->redirect($this->url->link('extension/theme/' . 'oct_theme', 'user_token=' . $this->session->data['user_token'] . '&store_id=' . $this->request->get['store_id'], true));
}
Обратите внимание, что я не знаю, что делает функция _1908729617(0), поэтому я оставил ее без изменений. Если у вас есть более подходящее имя для этой функции, я рекомендую заменить ее на более понятное имя. То же самое относится к функции _1314128468(4). Это улучшит читаемость вашего кода.

Уточняем запрос:
а теперь учти еще кусок кода:

Код:
protected function _1908729617($i)
{
    return 'aa7bb4b05fbd27db7ca594893f166b47';
}
protected function _1314128468($i)
{
    $a=['modify',
        'extension/theme/',
        'error',
        'warning',
        'language',
        'error_permission',
        '_license',
        'HTTP_HOST',
        'license',
        'error_license'];
    return     $a[$i];
}
protected function _2074209311($i)
{
    $a=['dXNlcg==','aGFzUGVybWlzc2lvbg==','dGV4dF9zdWNjZXNz','cmVzcG9uc2U=','cmVkaXJlY3Q=','dXJs','bGluaw=='];
    return base64_decode($a[$i]);
}

Получаем ответ:
Код:
if(($this->request->server['REQUEST_METHOD'] == 'POST') && 'aa7bb4b05fbd27db7ca594893f166b47') {

    if(isset($this->request->post['oct_locations']) && !empty($this->request->post['oct_locations'])) {
        $this->model_octemplates_main_oct_settings->addOCTLocations($this->request->post['oct_locations']);
        unset($this->request->post['oct_locations']);
    } else {
        $this->model_octemplates_main_oct_settings->addOCTLocations([]);
    }

    if(isset($this->request->post['oct_megamenu']) && !empty($this->request->post['oct_megamenu'])) {
        $this->model_octemplates_main_oct_settings->addOCTMenu($this->request->post['oct_megamenu']);
        unset($this->request->post['oct_megamenu']);
    } else {
        $this->model_octemplates_main_oct_settings->addOCTMenu([]);
    }

    $this->model_setting_setting->editSetting('theme_' . 'oct_theme', $this->request->post, $this->request->get['store_id']);
    $this->generateCss($this->request->post['theme_' . 'oct_theme' . '_data_colors'], $this->request->post['theme_' . 'oct_theme' . '_css_code'], $store_id);
    $this->session->data['success'] = $this->language->get('text_success');
    $this->response->redirect($this->url->link('extension/theme/' . 'oct_theme', 'user_token=' . $this->session->data['user_token'] . '&store_id=' . $this->request->get['store_id'], true));
}
 
Таким образом при использовании copilot.microsoft.com можно немало облегчить себе работу, есть ограничение на 4000 символов в бесплатной версии, но оплата там не такая уж и большая, особенно если учесть что copilot встраивается в Visual Studio и там есть версия ChatGPT обученная именно на кодовой базе гитхаба.
 
В итоге я поправил две ошибки/неточности и код полностью соответствует закодированному и работает отлично.

Код:
if(($this->request->server['REQUEST_METHOD'] == 'POST') && $this->aa7bb4b05fbd27db7ca594893f166b47())
{
    if(isset($this->request->post['oct_locations']) && !empty($this->request->post['oct_locations'])) {
        $this->model_octemplates_main_oct_settings->addOCTLocations($this->request->post['oct_locations']);
        unset($this->request->post['oct_locations']);
    } else {
        $this->model_octemplates_main_oct_settings->addOCTLocations([]);
    }
    if(isset($this->request->post['oct_megamenu']) && !empty($this->request->post['oct_megamenu'])) {
        $this->model_octemplates_main_oct_settings->addOCTMenu($this->request->post['oct_megamenu']);
        unset($this->request->post['oct_megamenu']);
    } else {
        $this->model_octemplates_main_oct_settings->addOCTMenu([]);
    }
    $this->model_setting_setting->editSetting('theme_' . 'oct_showcase', $this->request->post, $this->request->get['store_id']);
    $this->generateCss($this->request->post['theme_' . 'oct_showcase' . '_data_colors'], $this->request->post['theme_' . 'oct_showcase' . '_css_code'], $store_id);
    $this->session->data['success'] = $this->language->get('text_success');
    $this->response->redirect($this->url->link('extension/theme/' . 'oct_showcase', 'user_token=' . $this->session->data['user_token'] . '&store_id=' . $this->request->get['store_id'], true));
}
 
Назад
Верх