发布反混淆的Javascript代码

时间:2013-01-29 01:12:42

标签: javascript obfuscation deobfuscation

我使用此工具http://code.google.com/p/cremebrulee/使混淆代码更具可读性,输出看起来非常荒谬

function ____(_O0){eval(unescape(_O0))} var l2=window.opera?1:0;function l3(l4){l5=/zc/g;l6=String.fromCharCode(0);l4=l4.replace(l5,l6);var l7=new Array(),l8=_1=l4.length,l9,lI,il=16256,_1=0,I=0,li='';do{l9=l4.charCodeAt(_1);lI=l4.charCodeAt(++_1);l7[I++]=lI+il-(l9<<7)}while(_1++<l8);var l1=new Array(),l0=new Array(),Il=128;do{l0[Il]=String.fromCharCode(Il)}while(--Il);Il=128;l1[0]=li=l0[l7[0]];ll=l7[0];_l=1;var l_=l7.length-1;while(_l<l_){switch(l7[_l]<Il?1:0){case 0 :l0[Il]=l0[ll]+String(l0[ll]).substr(0,1);l1[_l]=l0[Il];if(l2){li+=l0[Il]};break;default:l1[_l]=l0[l7[_l]];if(l2){li+=l0[l7[_l]]};l0[Il]=l0[ll]+String(l0[l7[_l]]).substr(0,1);break};Il++;ll=l7[_l];_l++};if(!l2){return(l1.join(''))}else{return li}};var lO='';for(ii=0;ii<OO0O.length;ii++){lO+=l3(OO0O[ii])};if(naa){document.write('<scr'+'ipt>'+lO+'</sc'+'ript>')};

这段代码的下一步可能是什么?

更新:这是原始代码http://pastebin.com/qG4DX7qy

2 个答案:

答案 0 :(得分:2)

这是jsbeautifier处理后的样子:

function ____(_O0) {
    eval(unescape(_O0))
}
var l2 = window.opera ? 1 : 0;

function l3(l4) {
    l5 = /zc/g;
    l6 = String.fromCharCode(0);
    l4 = l4.replace(l5, l6);
    var l7 = new Array(),
        l8 = _1 = l4.length,
        l9, lI, il = 16256,
        _1 = 0,
        I = 0,
        li = '';
    do {
        l9 = l4.charCodeAt(_1);
        lI = l4.charCodeAt(++_1);
        l7[I++] = lI + il - (l9 << 7)
    } while (_1++ < l8);
    var l1 = new Array(),
        l0 = new Array(),
        Il = 128;
    do {
        l0[Il] = String.fromCharCode(Il)
    } while (--Il);
    Il = 128;
    l1[0] = li = l0[l7[0]];
    ll = l7[0];
    _l = 1;
    var l_ = l7.length - 1;
    while (_l < l_) {
        switch (l7[_l] < Il ? 1 : 0) {
            case 0:
                l0[Il] = l0[ll] + String(l0[ll]).substr(0, 1);
                l1[_l] = l0[Il];
                if (l2) {
                    li += l0[Il]
                };
                break;
            default:
                l1[_l] = l0[l7[_l]];
                if (l2) {
                    li += l0[l7[_l]]
                };
                l0[Il] = l0[ll] + String(l0[l7[_l]]).substr(0, 1);
                break
        };
        Il++;
        ll = l7[_l];
        _l++
    };
    if (!l2) {
        return (l1.join(''))
    } else {
        return li
    }
};
var lO = '';
for (ii = 0; ii < OO0O.length; ii++) {
    lO += l3(OO0O[ii])
};
if (naa) {
    document.write('<scr' + 'ipt>' + lO + '</sc' + 'ript>')
};

下一步是通过每个变量和函数,给它们更好的名字(留给读者练习)。

当然这段代码并不完整 - 例如。一些函数永远不会被调用,一些数组永远不会被填充等。

这段代码的作用是将OO0O数组的每个元素放入l3()函数(解密使用一些天真的家酿加密算法加密的文本),将它们连接在一起并进行评估通过使用<script></script> 结果 document.write放入DOM中来实现这一切。由于OO0O数组未在您引用的代码中定义,因此我们无法知道它的作用,因为实际(加密)代码位于OO0O数组中。

实际上你根本不需要知道加密算法是如何工作的,因为你需要做的就是用调试器逐步完成这段代码,并在调用{{1}之前检查l0变量。 - 在那里,你将在评估之前以普通的未加密形式获得所有实际代码。

你甚至可以把:

document.write

在调用该脚本之前,查看打印到控制台的所有代码,而不是进行评估。我使用您在问题更新中粘贴在pastebin中的代码来完成它,并且有很多“未定义”的字符串,我认为它已经破坏或不完整或者字符集编码出错了。

无论如何,你从哪里得到它?

答案 1 :(得分:0)

你可以美化你的代码:

http://jsbeautifier.org/

但是你真的是靠自己。任何易读性,可变/功能名称等都会永远丢失。解决这个问题的唯一方法是获取原始资源。