如何解码混淆的javascript代码

示例:

eval(function (p, a, c, k, e, d) { e = function (c) { return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } } return p }('$(5(){4(r){$(\'#14\').J($(\'#N\'))}4(11 8==\'S\'){$.9(\'?b=H&y=\'+8);4(r){$(\'#x .10\').Z($(\'#x .Y\'))}}X()});5 G(3,7,8,W){12 c=U();4(c){a(1);$.9(\'/T.d?b=R&7=\'+7+\'&y=\'+8+\'&s=\'+c+\'&t=\'+j(),5(2){4(2.v==u){4(2.2.Q){$.9(\'/k.d?b=P&O=\'+8+\'&s=\'+c+\'&n=\'+2.2.n+\'&l=\'+2.2.l+\'&w=\'+2.2.w+\'&V=\'+13()+\'&t=\'+j(),5(2){a(0);4(2.v==u){1q(2.2.1p,2.2.1o)}6{E(2.D)}})}6{a(0);4(2.2.n==\'1n\'){1m({\'7\':\'1l\',\'1k\':\'您今天下载超限了\',\'1j\':\'您虽为月卡用户,但您每天最多只能下载 <A 1i="1h-1g-1f">\'+2.2.1e+\'</A> 个模板,您今天超限了,请明天再来!或补差价升级月卡套餐无限制下载模板!\',\'1d\':\'补差价升级套餐\',\'1c\':\'算了,不需要\'},5(){C.g(\'/B.d?7=k&p=\'+2.2.p+\'&o=\'+2.2.o+\'&19=\'+2.2.l)})}6{$.9(\'/k.d?b=B&t=\'+j(),5(2){$(\'#16\').17();$(\'18\').1a(2);C.1b=\'\'})}}}6{a(0);E(2.D)}})}6{15(\'G\')}}5 K(3){4($(3).f(\'.i\').L(\'h-m\')){$(3).f(\'.i\').M(\'h-m\');$(3).e(\'.g\').z();$(3).e(\'.q\').F()}6{$(3).f(\'.i\').I(\'h-m\');$(3).e(\'.g\').F();$(3).e(\'.q\').z()}}', 62, 89, '||data|obj|if|function|else|type|tplId|get|wait|act|cidStr|html|find|siblings|open||itemwp|getTime|tpl|time|30|reason|paymac|payfor|close|ISM|cidstr||200|state|mac|mainBtnWp|id|hide|span|buy|window|errorMsg|alert|show|downloadTpl|setViewNum|addClass|insertBefore|toggleMore|hasClass|removeClass|tplNavWp|tplid|getDownloadInfo|isAble|getTplDownloadInfo|number|customer|getCidStr|wechat|tplName|initFavorite|favoritebtn|insertAfter|downloadbtn|typeof|var|isWechat|tplSearchWp|getLoginPop|buyPopWp|remove|body|paytime|append|buyPaykey|noBtn|yesBtn|limitNum|500|blue|color|class|text|title|fail|mAlert|monthLimit|name|url|downloadFileAct'.split('|')))

要获取 eval 函数执行的 JavaScript 代码,你需要对混淆的代码进行解码。通常,这种混淆代码会使用某种编码或替换机制来隐藏实际的代码逻辑。以下是一个步骤指南,帮助你解码并获取 eval 后的 JavaScript 代码。

步骤 1: 分析混淆代码

首先,我们需要理解混淆代码的工作原理。典型的混淆代码通常包含以下几个部分:

  • 一个字符串,包含经过编码或混淆的 JavaScript 代码。
  • 一个函数,用于解码这个字符串。
  • 使用 eval 来执行解码后的字符串。

步骤 2: 解码函数

在你的例子中,解码函数是这样的:

function (p, a, c, k, e, d) {
    e = function (c) {
        return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));
    };
    while (c--) {
        if (k[c]) {
            p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
        }
    }
    return p;
}

这个函数的作用是将 p 字符串中的某些编码标识符替换为 k 数组中的实际值。

步骤 3: 提取参数

从你的代码片段中提取出 p, a, c, k 等参数:

  • p 是编码后的 JavaScript 代码字符串。
  • a 是基数,通常是 62。
  • ck 数组的长度。
  • k 是一个数组,包含了实际的变量名和字符串。

步骤 4: 手动解码

我们可以手动实现解码函数,并用它来解码 p 字符串。

// 混淆的参数
const p = '...'; // 你的编码后的 JavaScript 代码字符串
const a = 62; // 基数
const c = 89; // k 数组的长度
const k = '||data|obj|if|function|else|type|tplId|get|wait|act|cidStr|html|find|siblings|open||itemwp|getTime|tpl|time|30|reason|paymac|payfor|close|ISM|cidstr||200|state|mac|mainBtnWp|id|hide|span|buy|window|errorMsg|alert|show|downloadTpl|setViewNum|addClass|insertBefore|toggleMore|hasClass|removeClass|tplNavWp|tplid|getDownloadInfo|isAble|getTplDownloadInfo|number|customer|getCidStr|wechat|tplName|initFavorite|favoritebtn|insertAfter|downloadbtn|typeof|var|isWechat|tplSearchWp|getLoginPop|buyPopWp|remove|body|paytime|append|buyPaykey|noBtn|yesBtn|limitNum|500|blue|color|class|text|title|fail|mAlert|monthLimit|name|url|downloadFileAct'.split('|');

// 解码函数
function decode(p, a, c, k) {
    const e = (c) => {
        return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));
    };

    while (c--) {
        if (k[c]) {
            p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
        }
    }

    return p;
}

// 解码后的代码
const decodedCode = decode(p, a, c, k);
console.log(decodedCode);

步骤 5: 运行解码代码

将上述代码保存到一个 JavaScript 文件中(例如 decode.js),然后在 Node.js 环境中运行它:

node decode.js

或者直接在浏览器的控制台中运行这段代码。

结果

运行后,你应该会在控制台看到解码后的 JavaScript 代码。这就是 eval 函数将要执行的实际代码。

注意事项

  • 确保 p 字符串正确无误地复制了整个编码后的 JavaScript 代码。
  • 如果代码中有其他复杂的混淆机制,可能需要进一步分析和处理。

通过这种方式,你可以获取并查看 eval 后的 JavaScript 代码,从而更好地理解其功能和逻辑。

Was this helpful?

0 / 0

发表回复 0