【问题标题】:How to "decode" some obfuscated JavaScript in HTML?如何在 HTML 中“解码”一些混淆的 JavaScript?
【发布时间】:2011-12-27 09:51:12
【问题描述】:

这是一个例子:

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))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4.h={H:9(d){T 7.F(9(){g 1=7;1.3={8:4(d.8,7),i:4(d.i,7),m:4.z.J(7),5:d.5,t:d.t,j:d.j,K:d.K,b:d.b,A:d.A};4.h.s(1,0);4(S).v(\'W\',9(){1.3.m=4.z.J(1);4.h.s(1,0);4.h.E(1)});4.h.E(1);1.3.8.v(\'O\',9(){4(1.3.t,7).l(0).a.I=\'P\'}).v(\'R\',9(){4(1.3.t,7).l(0).a.I=\'11\'});4(Z).v(\'10\',9(e){g p=4.z.Y(e);g c=0;k(1.3.b&&1.3.b==\'L\')g r=p.x-1.3.m.x-(1.w-1.3.5*1.3.8.n())/2-1.3.5/2;u k(1.3.b&&1.3.b==\'N\')g r=p.x-1.3.m.x-1.w+1.3.5*1.3.8.n();u g r=p.x-1.3.m.x;g M=B.G(p.y-1.3.m.y-1.X/2,2);1.3.8.F(9(q){6=B.Q(B.G(r-q*1.3.5,2)+M);6-=1.3.5/2;6=6<0?0:6;6=6>1.3.j?1.3.j:6;6=1.3.j-6;C=1.3.A*6/1.3.j;7.a.D=1.3.5+C+\'f\';7.a.o=1.3.5*q+c+\'f\';c+=C});4.h.s(1,c)})})},s:9(1,c){k(1.3.b)k(1.3.b==\'L\')1.3.i.l(0).a.o=(1.w-1.3.5*1.3.8.n())/2-c/2+\'f\';u k(1.3.b==\'o\')1.3.i.l(0).a.o=-c/1.3.8.n()+\'f\';u k(1.3.b==\'N\')1.3.i.l(0).a.o=(1.w-1.3.5*1.3.8.n())-c/2+\'f\';1.3.i.l(0).a.D=1.3.5*1.3.8.n()+c+\'f\'},E:9(1){1.3.8.F(9(q){7.a.D=1.3.5+\'f\';7.a.o=1.3.5*q+\'f\'})}};4.V.U=4.h.H;',62,64,'|el||fisheyeCfg|jQuery|itemWidth|distance|this|items|function|style|halign|toAdd|options||px|var|iFisheye|container|proximity|if|get|pos|size|left|pointer|nr|posx|positionContainer|itemsText|else|bind|offsetWidth|||iUtil|maxWidth|Math|extraWidth|width|positionItems|each|pow|build|display|getPosition|valign|center|posy|right|mouseover|block|sqrt|mouseout|window|return|Fisheye|fn|resize|offsetHeight|getPointer|document|mousemove|none'.split('|'),0,{}))

显然,这段代码是故意编写的,目的是为了迷惑其他人。我怎样才能理解它并用简单的代码重写它?

这项工作有什么工具吗?这在 HTML 中很常见。

【问题讨论】:

  • 你可以试试 Dean Edward 的解码器;这段代码是用他的工具编码的。

标签: javascript html obfuscation deobfuscation


【解决方案1】:

这不是“加密”的,只是被混淆了。

是的,有tools available to help,但这不是一个完美的过程。所有原来的变量名和 cmets 以及没有的东西都没有了,所以工具不能真正将这些东西重新添加回去。你必须自己弄清楚细节,但工具可以让它变得更容易。

【讨论】:

    【解决方案2】:

    我希望人们停止这样做。没有办法“加密” JavaScript。这是徒劳的练习(缩小是好的,但混淆是不好的和无用的)

    话虽如此,请尝试使用JSBeautifier。它给了我以下结果:

    jQuery.iFisheye = {
        build: function (options) {
            return this.each(function () {
                var el = this;
                el.fisheyeCfg = {
                    items: jQuery(options.items, this),
                    container: jQuery(options.container, this),
                    pos: jQuery.iUtil.getPosition(this),
                    itemWidth: options.itemWidth,
                    itemsText: options.itemsText,
                    proximity: options.proximity,
                    valign: options.valign,
                    halign: options.halign,
                    maxWidth: options.maxWidth
                };
                jQuery.iFisheye.positionContainer(el, 0);
                jQuery(window).bind('resize', function () {
                    el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el);
                    jQuery.iFisheye.positionContainer(el, 0);
                    jQuery.iFisheye.positionItems(el)
                });
                jQuery.iFisheye.positionItems(el);
                el.fisheyeCfg.items.bind('mouseover', function () {
                    jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block'
                }).bind('mouseout', function () {
                    jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none'
                });
                jQuery(document).bind('mousemove', function (e) {
                    var pointer = jQuery.iUtil.getPointer(e);
                    var toAdd = 0;
                    if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center') var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - el.fisheyeCfg.itemWidth / 2;
                    else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right') var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size();
                    else var posx = pointer.x - el.fisheyeCfg.pos.x;
                    var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight / 2, 2);
                    el.fisheyeCfg.items.each(function (nr) {
                        distance = Math.sqrt(Math.pow(posx - nr * el.fisheyeCfg.itemWidth, 2) + posy);
                        distance -= el.fisheyeCfg.itemWidth / 2;
                        distance = distance < 0 ? 0 : distance;
                        distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance;
                        distance = el.fisheyeCfg.proximity - distance;
                        extraWidth = el.fisheyeCfg.maxWidth * distance / el.fisheyeCfg.proximity;
                        this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';
                        this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';
                        toAdd += extraWidth
                    });
                    jQuery.iFisheye.positionContainer(el, toAdd)
                })
            })
        },
        positionContainer: function (el, toAdd) {
            if (el.fisheyeCfg.halign) if (el.fisheyeCfg.halign == 'center') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - toAdd / 2 + 'px';
            else if (el.fisheyeCfg.halign == 'left') el.fisheyeCfg.container.get(0).style.left = -toAdd / el.fisheyeCfg.items.size() + 'px';
            else if (el.fisheyeCfg.halign == 'right') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd / 2 + 'px';
            el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px'
        },
        positionItems: function (el) {
            el.fisheyeCfg.items.each(function (nr) {
                this.style.width = el.fisheyeCfg.itemWidth + 'px';
                this.style.left = el.fisheyeCfg.itemWidth * nr + 'px'
            })
        }
    };
    jQuery.fn.Fisheye = jQuery.iFisheye.build;
    

    其他链接(来自同一页面):

    【讨论】:

    • 缩小和混淆对于 JS 来说是可以互换的,你不觉得吗?
    • @Brad 不是。为了防止其他人窃取您的代码而混淆代码是愚蠢的。
    • @quantumSoup,同意,我只是说从 DocWiki 的角度来看,将代码恢复为有用的东西涉及相同的步骤。
    【解决方案3】:

    使用此问题中提到的解包器之一:

    你可以将打包好的javascript解包成如下代码:

    jQuery.iFisheye = {
        build: function (options) {
            return this.each(function () {
                var el = this;
                el.fisheyeCfg = {
                    items: jQuery(options.items, this),
                    container: jQuery(options.container, this),
                    pos: jQuery.iUtil.getPosition(this),
                    itemWidth: options.itemWidth,
                    itemsText: options.itemsText,
                    proximity: options.proximity,
                    valign: options.valign,
                    halign: options.halign,
                    maxWidth: options.maxWidth
                };
                jQuery.iFisheye.positionContainer(el, 0);
                jQuery(window).bind('resize', function () {
                    el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el);
                    jQuery.iFisheye.positionContainer(el, 0);
                    jQuery.iFisheye.positionItems(el)
                });
                jQuery.iFisheye.positionItems(el);
                el.fisheyeCfg.items.bind('mouseover', function () {
                    jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block'
                }).bind('mouseout', function () {
                    jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none'
                });
                jQuery(document).bind('mousemove', function (e) {
                    var pointer = jQuery.iUtil.getPointer(e);
                    var toAdd = 0;
                    if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center') var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - el.fisheyeCfg.itemWidth / 2;
                    else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right') var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size();
                    else var posx = pointer.x - el.fisheyeCfg.pos.x;
                    var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight / 2, 2);
                    el.fisheyeCfg.items.each(function (nr) {
                        distance = Math.sqrt(Math.pow(posx - nr * el.fisheyeCfg.itemWidth, 2) + posy);
                        distance -= el.fisheyeCfg.itemWidth / 2;
                        distance = distance < 0 ? 0 : distance;
                        distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance;
                        distance = el.fisheyeCfg.proximity - distance;
                        extraWidth = el.fisheyeCfg.maxWidth * distance / el.fisheyeCfg.proximity;
                        this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';
                        this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';
                        toAdd += extraWidth
                    });
                    jQuery.iFisheye.positionContainer(el, toAdd)
                })
            })
        },
        positionContainer: function (el, toAdd) {
            if (el.fisheyeCfg.halign) if (el.fisheyeCfg.halign == 'center') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) / 2 - toAdd / 2 + 'px';
            else if (el.fisheyeCfg.halign == 'left') el.fisheyeCfg.container.get(0).style.left = -toAdd / el.fisheyeCfg.items.size() + 'px';
            else if (el.fisheyeCfg.halign == 'right') el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd / 2 + 'px';
            el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px'
        },
        positionItems: function (el) {
            el.fisheyeCfg.items.each(function (nr) {
                this.style.width = el.fisheyeCfg.itemWidth + 'px';
                this.style.left = el.fisheyeCfg.itemWidth * nr + 'px'
            })
        }
    };
    jQuery.fn.Fisheye = jQuery.iFisheye.build;
    

    【讨论】:

    • 抓住一个男人到 iFisheye 与教一个男人到 iFisheye... 或类似的东西。 :-D +1 链接。
    【解决方案4】:

    在这种情况下,您可以在此处获取原始来源:http://interface.eyecon.ro/download。它并不是真正的“混淆”,因为目标并不是真正的混淆;相反,目标是“压缩”(缩小),而用于此目的的工具是压缩器/混淆器。

    (当然,大家提到的工具,这里少不了。我用jsbeautifier.org发现整个是给jQuery.iFisheye赋值的,然后告诉我用什么谷歌才能找到上面的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2012-03-27
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      相关资源
      最近更新 更多