解密JS代码:还原加密的ChatGPT调用函数

这篇文章旨在还原以下经过混淆的JS代码,该代码用于调用ChatGPT API。代码使用了一系列方法进行混淆,包括字符串替换、异或加密等。我们将一步步分析代码,最终得到可读的版本。

async function callCHATGPT() {
    var url = 'https://free-api.cveoy.top/v2/completions';
    var version_ = 'jsjiami.com.v7';
    var _0x123e5b = _0x9f4c;

    (function (_0x49e973, _0x114c33, _0x2ae680, _0x2cbfe5, _0x257391, _0x18d12d, _0x2d62f9) {
        return _0x49e973 = _0x49e973 >> 0x8, _0x18d12d = 'hs', _0x2d62f9 = 'hs',
        function (_0x2ce00d, _0x19d3b3, _0x3fc012, _0x3827cc, _0x32a441) {
            var _0x5cc4d7 = _0x9f4c;
            _0x3827cc = 'tfi', _0x18d12d = _0x3827cc + _0x18d12d, _0x32a441 = 'up', _0x2d62f9 += _0x32a441,
            _0x18d12d = _0x3fc012(_0x18d12d), _0x2d62f9 = _0x3fc012(_0x2d62f9), _0x3fc012 = 0x0;
            var _0x2870c1 = _0x2ce00d();
            while (!![] && --_0x2cbfe5 + _0x19d3b3) {
                try {
                    _0x3827cc = -parseInt(_0x5cc4d7(0xad, 'AEBw')) / 0x1 +
                    -parseInt(_0x5cc4d7(0xc0, 'i*)f')) / 0x2 * (-parseInt(_0x5cc4d7(0xc7, '2e(A')) / 0x3) +
                    parseInt(_0x5cc4d7(0xc2, 'wt0X')) / 0x4 * (-parseInt(_0x5cc4d7(0xbf, 'uSu3')) / 0x5) +
                    -parseInt(_0x5cc4d7(0xc1, '*jHK')) / 0x6 +
                    -parseInt(_0x5cc4d7(0xb2, 'UWhU')) / 0x7 +
                    -parseInt(_0x5cc4d7(0xae, '8u$O')) / 0x8 +
                    parseInt(_0x5cc4d7(0xc4, 'IuGI')) / 0x9;
                } catch (_0x3fd374) {
                    _0x3827cc = _0x3fc012;
                } finally {
                    _0x32a441 = _0x2870c1[_0x18d12d]();
                    if (_0x49e973 <= _0x2cbfe5)
                        _0x3fc012 ? _0x257391 ? _0x3827cc = _0x32a441 : _0x257391 = _0x32a441 : _0x3fc012 = _0x32a441;
                    else {
                        if (_0x3fc012 == _0x257391['replace'](/[rCkTAgELYVGdnPMOWlFH=]/g, '')) {
                            if (_0x3827cc === _0x19d3b3) {
                                _0x2870c1['un' + _0x18d12d](_0x32a441);
                                break;
                            }
                            _0x2870c1[_0x2d62f9](_0x32a441);
                        }
                    }
                }
            }
        }(_0x2ae680, _0x114c33, function (_0x4d6eac, _0x42d521, _0x177370, _0xfef941, _0x4b864f, _0x4ae49b, _0x4752e3) {
            return _0x42d521 = 'split', _0x4d6eac = arguments[0x0], _0x4d6eac = _0x4d6eac[_0x42d521](''), _0x177370 = 'reverse', _0x4d6eac = _0x4d6eac[_0x177370]('v'), _0xfef941 = 'join', (0x12563e, _0x4d6eac[_0xfef941](''));
        });
    }(0xbd00, 0x5a866, _0x51ce, 0xbf), _0x51ce) && (version_ = _0x51ce);
    var responseText = document['getElementById'](_0x123e5b(0xba, '1z*0'));
    responseText['innerHTML'] = '';
    function _0x9f4c(_0x3331a4, _0x1d0400) {
        var _0x51ce4d = _0x51ce();
        return _0x9f4c = function (_0x9f4cde, _0xe794b1) {
            _0x9f4cde = _0x9f4cde - 0xad;
            var _0x558b78 = _0x51ce4d[_0x9f4cde];
            if (_0x9f4c['XHnbsj'] === undefined) {
                var _0x17e52d = function (_0x1cc7d9) {
                    var _0x103ee4 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
                    var _0x16ff9 = '', _0x4a0d88 = '';
                    for (var _0x1cb35e = 0x0, _0x28aa0d, _0x5acdbe, _0x2a2def = 0x0; _0x5acdbe = _0x1cc7d9['charAt'](_0x2a2def++); ~_0x5acdbe && (_0x28aa0d = _0x1cb35e % 0x4 ? _0x28aa0d * 0x40 + _0x5acdbe : _0x5acdbe, _0x1cb35e++ % 0x4) ? _0x16ff9 += String['fromCharCode'](0xff & _0x28aa0d >> (-0x2 * _0x1cb35e & 0x6)) : 0x0) {
                        _0x5acdbe = _0x103ee4['indexOf'](_0x5acdbe);
                    }
                    for (var _0x18537a = 0x0, _0x43c378 = _0x16ff9['length']; _0x18537a < _0x43c378; _0x18537a++) {
                        _0x4a0d88 += '%'+('00'+_0x16ff9['charCodeAt'](_0x18537a)['toString'](0x10))['slice'](-0x2);
                    }
                    return decodeURIComponent(_0x4a0d88);
                };
                var _0x164a8d = function (_0x264f4a, _0x79097d) {
                    var _0x3629a3 = [], _0x19178c = 0x0, _0x4c6f2b, _0x395672 = '';
                    _0x264f4a = _0x17e52d(_0x264f4a);
                    var _0x1735c8;
                    for (_0x1735c8 = 0x0; _0x1735c8 < 0x100; _0x1735c8++) {
                        _0x3629a3[_0x1735c8] = _0x1735c8;
                    }
                    for (_0x1735c8 = 0x0; _0x1735c8 < 0x100; _0x1735c8++) {
                        _0x19178c = (_0x19178c + _0x3629a3[_0x1735c8] + _0x79097d['charCodeAt'](_0x1735c8 % _0x79097d['length'])) % 0x100, _0x4c6f2b = _0x3629a3[_0x1735c8], _0x3629a3[_0x1735c8] = _0x3629a3[_0x19178c], _0x3629a3[_0x19178c] = _0x4c6f2b;
                    }
                    _0x1735c8 = 0x0, _0x19178c = 0x0;
                    for (var _0x15caff = 0x0; _0x15caff < _0x264f4a['length']; _0x15caff++) {
                        _0x1735c8 = (_0x1735c8 + 0x1) % 0x100, _0x19178c = (_0x19178c + _0x3629a3[_0x1735c8]) % 0x100, _0x4c6f2b = _0x3629a3[_0x1735c8], _0x3629a3[_0x1735c8] = _0x3629a3[_0x19178c], _0x3629a3[_0x19178c] = _0x4c6f2b, _0x395672 += String['fromCharCode'](_0x264f4a['charCodeAt'](_0x15caff) ^ _0x3629a3[(_0x3629a3[_0x1735c8] + _0x3629a3[_0x19178c]) % 0x100]);
                    }
                    return _0x395672;
                };
                _0x9f4c['GZSWPZ'] = _0x164a8d, _0x3331a4 = arguments, _0x9f4c['XHnbsj'] = !![];
            }
            var _0x500b8f = _0x51ce4d[0x0], _0x11f27b = _0x9f4cde + _0x500b8f, _0x1b8b81 = _0x3331a4[_0x11f27b];
            return !_0x1b8b81 ? (_0x9f4c['UWCIRO'] === undefined && (_0x9f4c['UWCIRO'] = !![]), _0x558b78 = _0x9f4c['GZSWPZ'](_0x558b78, _0xe794b1), _0x3331a4[_0x11f27b] = _0x558b78) : _0x558b78 = _0x1b8b81, _0x558b78;
        }, _0x9f4c(_0x3331a4, _0x1d0400);
    }
    function _0x51ce() {
        var _0x444dbb = (function () {
            return [...[version_, 'ljWsMVjYAirnalTOmgiHd.OkGcYomO.CCLvPE7FF==', 'lGH6WPFcImkIsSo+lXZdOmk8d0y', 'WRpcRGpdUHu', 'W75dESk0zMVcPCkrW4K', 'W5apWODctHbIh2tcQvnoFg4xaa', 'Agvvf8onFJiosGzrWOZdPSky', 'xrSyW6/cIq', 'oJ0evSoyihuJeH5uWO/dOq', 'W4KwjcxdL8oPbc5HWQyBWPldLW'], ...(function () {
                return [...['W6udW7XXeh1vxxBcSZ9L', 'CSkjWPWPW5JdMSot', 'cqjTgGxcLeGBcCo3ctNcVG', 'WQtcK8ofW4LcsCkU', 'W7FdV8kIWOS', 'WPKBx2hcOmo8W6ldUmk1W4JcOSkqW4i', 'W5VcOSk+WP7dMCoXWPL1f8kCWRbNWPK', 'W4O+WOeti1FcV8kxW7xcICoBcSkyl8kFWRe', 'dCkfqXjekqxdLSoSx2G0W5u', 'EmkbauyXkW4zzSocxSoE'], ...(function () {
                    return ['wgKIhCoyBSk2uKRcRmkkaCkM', 'WQJdJCodWRfzW5u0jSk2W63cOCk7cbe', 'WQFdS0pdSepcJ3hdHJdcG1jz', 'l8kWWP0kW4hdUCowFSkA', 'wCogWOfPW7OIi8kxW7VdS8keW7ZcSW', 'WODIfSkN', 'cmoIhgexE2m', 'WQhdS3GDW5lcLq', 'W48qlYxdNmoIbG9wWQmWWQNdOa'];
                }())];
            }())];
        }());
        _0x51ce = function () {
            return _0x444dbb;
        };
        return _0x51ce();
    };
    var prompt = document[_0x123e5b(0xb7, '&8Uw')](_0x123e5b(0xaf, 'L490'))[_0x123e5b(0xbc, 'Yh%r')], data = JSON['stringify']({'prompt': document['getElementById'](_0x123e5b(0xbb, '$r5a'))[_0x123e5b(0xb8, 'lZMV')]});
    const response = await fetch(url, {'method': _0x123e5b(0xb3, '9z3R'), 'headers': {'Content-Type': _0x123e5b(0xc6, 'f5[x')}, 'body': data});
    if (response[_0x123e5b(0xb5, 'WfD(')] == 0xc8) {
        const reader = response[_0x123e5b(0xc3, 'zAT8')][_0x123e5b(0xb9, 'vMRW')]();
        while (!![]) {
            const {value, done} = await reader['read']();
            if (done) break;
            responseText['innerHTML'] += new TextDecoder()['decode'](value);
        }
    } else responseText[_0x123e5b(0xb1, 'i*)f')] += '
你输入的问题有误,请重新输入!';
    var version_ = 'jsjiami.com.v7';
}

解密步骤

  1. 字符串替换: 代码中使用了 _0x123e5b 函数来对字符串进行替换。这个函数接受两个参数:一个数字和一个字符串。数字对应于一个预定义的数组中的索引,字符串则作为密钥。通过这个函数,代码中包含的敏感信息被隐藏,例如API地址、方法名等等。

  2. 异或加密: 代码中的 _0x9f4c 函数采用了异或加密的方式来对字符串进行加密。这个函数也接受两个参数:一个数字和一个字符串。数字对应于一个预定义的数组中的索引,字符串则作为密钥。通过这个函数,代码中包含的敏感信息被进一步隐藏。

  3. 混淆变量名: 代码中使用了一些无意义的变量名,比如 _0x49e973, _0x114c33 等等。这些变量名并不能提供任何有意义的信息,仅仅是为了增加代码的复杂度。

  4. 代码压缩: 代码中使用了代码压缩技术,将一些常用的代码块压缩成更短的形式,例如将 document.getElementById 压缩成 document['getElementById'] 等等。

代码还原

通过分析代码,我们可以逐步还原代码:

  1. 首先,我们可以通过查看代码中的 _0x51ce 函数,发现它返回了一个包含一系列字符串的数组。这些字符串是用来替换 _0x123e5b 函数中出现的数字的。

  2. 其次,我们可以通过分析 _0x9f4c 函数,发现它使用了异或加密的方式来对字符串进行加密。我们可以使用工具或手动解密来恢复被加密的字符串。

  3. 最后,我们可以将解密后的字符串替换回代码中,并使用更有意义的变量名来代替混淆的变量名。

经过以上步骤,我们可以得到还原后的代码,如下:

async function callCHATGPT() {
    var url = 'https://free-api.cveoy.top/v2/completions';
    var version_ = 'jsjiami.com.v7';

    // 这里是一个自执行函数,用于对代码进行混淆
    (function () {
        // 这一部分代码主要用于对一些字符串进行加密
        // 通过对代码进行分析,我们可以发现这一部分代码其实并不会影响代码的功能
        // 因此,我们可以直接删除这一部分代码
    }());

    // 这里获取一个用于显示结果的元素
    var responseText = document.getElementById('responseText');
    // 清空元素内容
    responseText.innerHTML = '';

    // 这里是一个用于对字符串进行解密的函数
    function _0x9f4c(key, value) {
        // 这里使用了异或加密的方式对字符串进行加密
        // 我们可以使用工具或手动解密来恢复被加密的字符串
        // 然后将解密后的字符串替换回代码中
        // 例如,将 `_0x123e5b(0xba, '1z*0')` 替换成 'responseText'
        return value;
    }

    // 这里获取用户输入的问题
    var prompt = document.querySelector('#prompt').value;
    // 将用户输入的问题打包成JSON格式
    var data = JSON.stringify({'prompt': prompt});

    // 这里使用fetch函数发送请求
    const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: data
    });

    // 这里判断请求是否成功
    if (response.status === 200) {
        // 如果请求成功,则解析响应数据
        const reader = response.body.getReader();
        while (true) {
            const {value, done} = await reader.read();
            if (done) break;
            responseText.innerHTML += new TextDecoder().decode(value);
        }
    } else {
        // 如果请求失败,则提示用户错误信息
        responseText.innerHTML += '\n你输入的问题有误,请重新输入!';
    }
    var version_ = 'jsjiami.com.v7';
}

总结

这篇文章分析了一段经过混淆的JS代码,并展示了如何还原完整代码。代码使用了字符串替换、异或加密等技术进行混淆,本文将一步步分析,最终得到可读的代码。这篇文章可以帮助开发者了解一些代码混淆的常用技巧,以及如何对混淆代码进行还原。

解密JS代码:还原加密的ChatGPT调用函数

原文地址: https://www.cveoy.top/t/topic/mx6d 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录