Европол си търсят програмисти на Java

Както си се разхождах из нета днес, чудейки се с какво да запълня времето попаднах на един сайт за търсене на работа. Не, че си търся работа, но е добре човек да е ориентиран какво се търси в момента. Докато разглеждах разните обяви попаднах на обява от Европол. При това доста интересна.

Оказа се, че Европол си търсят и Java, и .NET програмист, и тест инженер. Интересното е, че тя съдържа точната сума на заплатата, която ще се получава. Точна в смисъл до цент. Заплатата е в зависимост от годините опит и най-ниската опция започва от 3145,45, предполага се Евро.

Всички обяви за работа можете да намерите на съответният сайт. А ето и обявата за работа за Java програмист, в случай, че тази от сайта е вече свалена.

Докато се рових на сайта, попадна и на следната „таблица – заплати“, съдържаща точните заплати за различните позиции. Оригинала, ако не е свален, ще намерите тук.

Posted in Новини, Разни | Tagged , | Коментарите са изключени за Европол си търсят програмисти на Java

Преброяване 2011

Преди малко успях да се преброя електронно. Този път съм приятно изненадан. За разлика от други подобни системи тази е направена на едно доста прилично ниво. Е не е без кусури, но това може да се очаква. Важното е, че, поне за мен, преживяването беше гладко и безпроблемно.

Ето и някой коментари и наблюдения, както от техническа така и от профанска гледна точка.

Още на 31ви посетих сайта на преброяването http://www.nsi.bg/census2011/. Исках да пробвам дали системата е „пусната“. Само дето не можах да видя система :). Всъщност може и просто да съм пропуснал връзката. Всъщност връзка няма. Има една картинка на която пише „Електронно Преброяване“. Като изключим факта, че в българският език се слага главна буква само на една от думите, картинката си е наред, даже си има alt текст. Разбира се, приятно зеленият цвят помага за скриването ѝ сред зеленият дизайн на сайта. В противовес на това, картинката за „Често задавани въпроси“ е с червен цвят и лесно се забелязва.

Секцията „Често задавани въпроси“ е доста смислена. Е един списък с въпросите най-отгоре щеше да дойде добре, но човек не може да има всичко. Освен чисто информативните въпроси секцията съдържа и инструкции за инсталация на сертификата ползван от сайта на който се извършва същинското преброяване. Сертификатът е издаден от GeoTrust и едва ли ще ви се наложи да го инсталирате, но все пак хората, които са писали въпросите и отговорите явно са помислили за това. Само дето изобщо не са се замислили какво са написали.

Ето какво са написали „Възможно е някои потребители с по-стари версии на операционната система Microsoft Windows или с версия, при която не е включена опцията “Automatic Updates” (Автоматично обновяване) да получат следното съобщение за грешка от системата“, последвано от екранна снимка на IE7 или IE8 (трудно ми е да преценя по картинката). Инструкциите и снимките след това определено не са от „по-стара“ версия на Windows. Информация за процедурата по инсталация на сертификата при браузъри различни от IE или други операционни системи липсва. Това показва една липса на заинтересованост (ако не и на професионализъм) от страна на писалите този текст. Бързо проучване намира следните данни в Wikipedia: IE – 44.53%; Firefox – 29.56%; Chrome – 12.34%; Safari – 5.80%; Opera – 2.15%; Mobile – 4.10% (остават 1.52% за други).

Малко по-подробно търсене (общо около 5 минути 😉 ), дава следните резултати:

Източник: StatCounter Global Stats – Browser Market Share
Ако изображението не се зарежда: CSV или JPG.

И за България:

Източник: StatCounter Global Stats – Browser Market Share
Ако изображението не се зарежда: CSV или JPG.

Данните могат да се проверят и от други източници, например http://www.ranking.bg/.

И тъй като все пак правим преброяване в България, ако вие имахте избор да включите инструкциите само за един браузър кой бихте избрали? Аз лично се колебая между Safari и Opera, но май клоня към Safari ;).

Преди да продължа с моите преживявания. Искам да споделя някой технически наблюдения които направих. Когато се опитах да посетя http://www.nsi.bg/ бях веднага пренасочен към http://www.nsi.bg/census2011/. Опитите ми да вляза чрез http://nsi.bg/ се увенчаха с неуспех. Кешът на Google обаче я съдържа. Датата и часът, които кешът дава е „31 ян. 2011 05:38:54 GMT“, явно нещо се е объркало от тогава насам.

ДОПЪЛНЕНИЕ: След като написах предходният параграф на 1 Февруари сутринта се появиха доста разнопосочни съобщения. Според „24 часа“, (от 1 Февруари 2011, 8 стр., източник: http://pressboard.info/) сайта е блокирал на 31ви преди обед и е бил достъпен около 16:00 часа. След това е имало нови прекъсвания в работата. Официалните изявления твърдят, че това е било нарочна поддръжка, което звучи логично (но поне можеха да го обявят предварително). Освен това сайта не е бил напълно достъпен от 00:00 часа на 1ви за период между 20 и 40 минути (източник: електронното издание на СЕГА). Това е в противоречие с новините от http://www.vesti.bg, които твърдят, че първият регистрирал се, го е направил в 00:14 минути.

Опитът ми да валидирам някоя от страниците с HTML validator, също се увенчаха с неуспех. Резултатът беше 500 Can't connect to www.nsi.bg:80 (connect: timeout). Това е малко странно, тъй като аз нямам проблем да се свържа със сайта.

ДОПЪЛНЕНИЕ: Според СЕГА сайта на преброяването не е достъпен извън България, което обяснява горният резултат. Просто не ми се коментират такива „изумителни“ решения. Смисъл да се прави, едва ли може да се намери, а и ограничението може да се заобиколи без особени трудности.

И така нека минем към самият сайт на преброяването. Той се намира на https://iscensus2011.nsi.bg/. Връзката е само през HTTPS, за съжаление никой не се е сетил да направи пренасочване на HTTP към HTTPS. А предвид широката аудитория това е направо задължително.

На самият сайт ви приветства стандартна форма за вход/регистрация. Формата за вход (но не и тази за регистрация) изисква и разчитането на т.нар. CAPTCHA. Не съм специалист и не мога да коментирам доколко CAPTCHAта не може да бъде разбита (пробвах един онлайн инструмент и той не успя, но това не е никаква гаранция, все пак беше първият който Google намери). На мен лично ми беше лесно да прочета цифрите, но все пак, като изключим очилата, аз съм с нормално зрение. Това което определено липсва е аудио версия на картинката (нещо, което го има дори на моя блог), но кой ли в България мисли за хората с увреждания.

Регистрацията е бърза (при правилно въведение данни). Полетата имат валидация (макар че според СЕГА е имало случаи с грешни данни записани в системата). Нещата, за които успях да проверя, че има някаква валидация са ЕГН (въпреки че съставянето на валидно ЕГН не е особено трудно, даже по едно време имаше програма, която генерираше всички ЕГНта от дадена дата за даден град 🙂 ), номера на личната карта (по дължина) и електронната поща.

Тъй като валидацията на email ми е нещо като слабост (след писането на такава за административният интерфейс на email сървър), направих някой тестове в повече :). Първият ми тест беше със запетайка вместо точка в името на домейна (не беше нарочно), естествено това даде грешка. След това email-а ми се валидира успешно (а Facebook упорито отказа да го приеме, въпреки, че прие друг от същият домейн). След като валидацията мина успешно, станах оптимистичен и пробвах \@@domain.com и "dsadas@dsdas"@doman.com, за сведение и двете са валидни, но валидацията каза, че не са. След което се върнах на по прости неща от Wikipediadsdas+sdsa@domain.com и dssda=dsad@domain.com, макар и малко необичайни + и = са позволени символи, без значение кое RFC четете. Пробвах и "dsda dsadas"@test.com. И в трите случая валидацията каза, че адресите не са валидни.

Интересен факт, е че разработчиците са решили, че у нас няма човек над 111 години, който да ползва Интернет ;). Вероятно са прави, но все пак можеха да сложат още няколко години в списъка, с година на раждането.

След регистрацията, системата ми изпрати парола на електронната поща. Според СЕГА в момента паролите се дават директно на сайта. Това решение ми изглежда логично, предвид факта, че email системата изглежда е претоварена. Когато пробвах да си възстановя „забравената“ парола, на 2ри, пристигането на писмото се забави доста повече отколкото сутринта на предният ден.

Възстановяването на забравена парола е просто – посочвате email и дата на раждане и чакате да си получите новата парола. Неприятното е, че веднага след като цъкнете бутона старата ви парола спира да важи. В следствие ако някой роднина или приятел реши да ви прави гадни номерца, няма какво да му попречи.

Вътре в системата ви посреща доста обемисто обяснение с връзка към анкетната карта. Освен нея имате и „Профил“, „Смяна на паролата“ и естествено „Изход“. Профилът съдържа email-а ви, Трите имена и първите 6 цифри на ЕГНто (т.е. датата на раждането), и цялата информация е само за четене. Изходът е без потвърждение, което е леко неприятно, но се преживява.

Анкетната карта е почти същата като PDF образците на сайта на НСИ. Формата е изработена прилично и не изглежда грозно. Като изберете даден отговор, противоречащите му или тези свързани с другите възможно отговори стават неактивни. Например като си въведете ЕГНто автоматично се попълва пол. Единственият проблем, който аз срещнах, е че аз като домакинство от 1 човек, не съставлявам семейство, но въпреки това полето за семейство остана активно. Това обаче беше хванато при валидацията и след като изтрих данните всичко мина гладко. СЕГА съобщават за някой други проблеми, но аз няма как да ги проверя, тъй като вече приключих формата. Докато не приключите формата можете да се връщате назад и да редактирате данните (най-отдолу на страницата има връзка „Редакция“ или нещо подобно). След като стигнете края на формата има бутон за потвърждение, веднъж натиснат, данните стават окончателни и ви пращат писъмце с кода. Дори да загубите писмото, кода винаги е достъпен на страницата на преброяването.

Накрая остава да спомена някой думи за писмата които се изпращат. Писмата за регистрация и успешно преброяване пристигнаха от censusadmin7@nsi.bg. Това за сменената парола беше от censusadmin5@nsi.bg. Интересното е, че са изпратени от различни сървъри. Първите две изглеждат изпратени от Exchange сървър, докато третото изглежда изпратено от някакъв друг вид сървър. Всички писма са кодирани в UTF-8 и имат указан Content-Type. При първите две той е multipart/alternative; boundary="----_=_NextPart_001_01CBC1CB.87240E00" (разбира се стойността на boundary-то е различна 🙂 ). При третото писмо е text/html; charset=utf-8. Не съм специалист по въпроса и не мога да кажа дали multipart писмата ще се разчетат правилно навсякъде.

Всички писма са написани първо на кирилица и след това на шльокавица. Което е една добра предпазна мрежа. Единственият проблем който забелязах е в писмото за смяна на паролата. Там заглавието е следното: „Вашата парола за Прна. Vashata parola za Prebroyavane 2011 beshe smenena“. Очевидно на мястото на почерненият символ трябва да има множество символи. Разбира се проблемът може да е някъде по средата или в моя край.

В крайна сметка, въпреки критиките аз съм доволен. Моят път мина по „happy path“ или достатъчно близо до него за да не усетя никакви проблеми.

Ще се радвам на вашите коментари, за вашите преживявания. Всяка допълнителна информация също е добре дошла.

Posted in Разни | Tagged | Коментарите са изключени за Преброяване 2011

Интернет факти

Има един сайт http://www.speedtest.net, на който можете да тествате скоростта на вашата Интернет връзка. Ето и моите резултати:

Това е резултатът от едно от измерванията които направих докато пишех тази статия:
Резултати от теста

А това резултатът от най-доброто представяне на моята връзка:
Най-добрите резултати

А на http://www.pingtest.net можете да разберете качеството на Интернет връзката си. Подробно обяснение на резултатите са намира на http://www.pingtest.net/learn.php.

Резултатите от теста, който направих по време на тази статия са следните:
Резултати от теста

А най-доброто представяне е това:
Най-добрите резултати

Интересен сайт е и http://www.netindex.com/, на който има индекс на световният Интернет, чрез който можете да сравните къде се намирате вие спрямо останалата част от света.

Лесно ще забележите, че България сред водещите страни в света, що се отнася до скорост на Интернет връзката (14та при сваляне и 11та при качване), цената (1ва или 10та в зависимост от начина на изчисление) и индекса на обещаното (8ма – този индекс отразява разликата между обещаната от доставчика и реалната скорост на Интернет връзката). Изоставяме само по индекса на качеството (60ти).
Информацията на този сайт се генерира автоматично въз основата на данни от показаните по-горе два сайта и период от 30 дни преди момента на посещение.

Сега е ваш ред, чувствайте се свободни да споделите вашите резултати.

Posted in Мрежата | Tagged , | 4 коментара

Маркиране на хиляди коментари като спам

Нали знаете какво е убило котката – любопитството. При мен това доведе до над 53 000 спам коментара. Как? Ами цъкнах на една връзка, която ми се стори интересна, въпреки, че знаех, че има риск спамера да разбере, че сайта е активен. Просто бях твърде любопитен.

И така, няколко дни след като любопитството надделя над здравият разум, получих email от блога си, че има някакъв коментар за одобрение. Влязох в блога и какво да видя, Aksimet решил, че около 53500 коментара не са спам т.е. нуждаят се от одобрение (както съм настроил блога). Въпреки, че го обнових до последна версия, натискането на бутона „Провери опашката за спам“ не доведе до очакваният резултат. И така бях принуден да разчитам на стандартните инструменти на WordPress.

Но изтриването на над 2675 от WordPress трябва да стане страница по страница. Аз определено нямам толкова търпение, за това бързо се отказах. Все пак в категорията спам има бутон „Изтриване на спама“, който трие всички писма в нея. За това реших да направя следното:

UPDATE wp_comments SET comment_approved = "spam" 
WHERE comment_approved = "0"

По някаква причина заявката не мина от раз. Останаха около 13 000 коментара и се наложи да я пусна втори път.

И така стигнахме до бутона „Изтриване на спама“. За съжаление той не сработи според моите очаквания. След две натискания бройката на коментарите беше намаляла с една 300, а времето което отнемаше за зареждане на страницата след всяко натискане не беше в категорията приемливо (т.е. повече от секунда-две). Поради, което прибягнах до следната заявка

DELETE FROM wp_comments WHERE comment_approved = "spam"

Разбира се, можеше още от началото да направя, това което ме съветваха сайтовете:

DELETE FROM wp_comments WHERE comment_approved = "0"

Но нали ми е твърда главата.

Разбира се проблемите ми не свършиха до тук, защото базата ми реши да умре малко след това. Но какво да се прави – кофти конфигурация. Едно обаждане до поддръжката и проблема беше решен за секунди.

Posted in Администрация, Разни | Tagged , , | Коментарите са изключени за Маркиране на хиляди коментари като спам

Декодиране на PHP код обфускиран с NET-TEC PHP-ENCODER V1.0

Темата на тази статия е декодиране на PHP код обфускиран, с NET-TEC PHP-ENCODER V1.0. Причината да се занимавам с това е тема за WordPress на блога ми за фентъзи. Исках да добавя нещо в долният колонтитул на страницата (т.е. footer). И така отворих си съответният файл и какво да видя:

А ето и съкратена версия на горното (по-голяма част от низа е премахната за четимост):

<?php
/*
Encoder : NET-TEC PHP-ENCODER V 1.0
WEB : http://www.net-tec.biz/
WARNING: This file is protected by copyright law. To reverse engineer or decode this file is strictly prohibited.
*/
$Q16118B8947480F50A0A2FEDC99864231="DQovKg....Zm9vdGVyKCk7ID8+DQoNCjwvYm9keT4NCg0KPC9odG1sPg==";
eval(base64_decode($Q16118B8947480F50A0A2FEDC99864231));?>

И така видимо е че кодът не е четим с просто око. И така започваме с малко анализ. Няколко части са видими в кода:

  1. Отварящ PHP таг
  2. Коментар – който удобно посочва името, версията и сайта на производителят на инструмента използван за обфускиране
  3. PHP променлива – $Q16118B8947480F50A0A2FEDC99864231
  4. Стойност за тази променлива – ето отрязък от края на тази стойност – Zm9vdGVyKCk7ID8+DQoNCjwvYm9keT4NCg0KPC9odG1sPg==
  5. PHP eval() функция
  6. Затварящ PHP таг

Моля PHP и HTML гурутата да ме извинят ако има неточности в термините, които използвам.

Очевидно нито затварящият нито отварящият таг не ни носят никаква информация, която вече да не знаем, за сметка на това коментарът е пре-любопитен. Той съдържа името и версията на софтуера използван за обфускирането, сайта на софтуера а също така предупреждение, че декодирането на текста е забранено от законите за авторското право. Не съм специалист по Закона за авторското и сродните мъ права, но член 70 и член 71 ми изглеждат приложими с този случай. Разбира се първата ми работа беше да питам Google, но първите резултати бяха някакви форуми и тъй като ме мързеше да чета реших, че ще е по бързо да декодирам текста сам.

И така изправяме се пред декодирането на кода. В началото виждаме, че името на променливата не носи никаква полезна информация. След което забелязваме, че стойността на променливата подозрително прилича на base64 кодиран низ, особено с тия два знака за равно накрая. После няма как да пропуснем, че функцията eval() приема като аргумент върната стойност от функцията base64_decode(), на която, като параметър, е подадена дефинираната по-горе променлива. Решавайки, че низа „най-вероятно“ е base64 кодирана версия на (X)HTML кода, който ни интересува се насочваме към http://home2.paulschou.net/tools/xlate/, на който имам онлайн кодер/декодер за base64. Резултатът е следният:

А и компактната версия (отново с изрязан низ):

/*
Encoder : NET-TEC PHP-ENCODER V 1.0
WEB : http://www.net-tec.biz/
WARNING: This file is protected by copyright law. To reverse engineer or decode this file is strictly prohibited.
*/
?>
		<div class="clear"></div>
	</div>
	<!-- /Main -->
	<!-- Footer -->
	<div id="footer">
		Designed by <a href="http://bloggingzone.info">Custom WordPress Themes</a><br />
		Made free by <a href="http://www.wilsonfield.co.uk/corporate/cva-liquid-admin.htm">Insolvency</a> | <a href="http://www.ffxi-gil.info">FFXI Gil</a> | <?php /* v5 - WARNING: This file is protected by copyright law. To reverse engineer or decode this file is strictly prohibited. */
$o="QAAAOz...kNnMk1Da3VJajhpT3c9PSIpKTtldmFsKCRsbGxsbGxsbGwpOw=="));?>
	</div>
	<!-- Footer -->
</div>
<!-- /Page -->
<?php wp_footer(); ?>
</body>
</html>

И така ето какво откриваме:

  1. Коментар – същият като този по-горе
  2. Самотен затварящ таг – ?>
  3. Малко (X)HTML код – който изглежда като част от този който търсим
  4. Известно количество PHP код, който прилича изключително много на този с който започнахме
  5. Още (X)HTML – който явно случи за затваряне на страницата

С току що намереният (X)HTML можем да направим малък експеримент. Вземаме първата част, добавяме след нея втората и заменяме първоначалният код с така полученият. Подменяме файла на сървъра и voila, работи. ОК, бихме могли да спрем до дук, но аз лично се дразня много когато нещо, което се предполага да е колонтитул прави и други работи. Особено когато това не е документирано и е скрито в камара обфускиран код.

Но първо нека коментираме самотният затварящ се таг – ?>. За мен лично той няма смисъл, освен ако не е сложен там да затрудни инструменти занимаващи се с автоматичен анализ и декодиране на обфускиран код. Разбира се той може и да има друга функционалност, но след като получихме пълната функционалност на (X)HTML кода, не виждам за какво може да е.

И така, PHP кода започва с интересен коментар – v5, последван от нова предупреждение да не се декодира файла. За повече информация, по въпроса с декодирането, прочетете по-горе, където се говори за авторското право. Относно v5, според мен тук е използван друг инструмент или поне друга версия на същият инструмент. Версията най-вероятно има номер 5. Следва променлива $o. На пръв поглед изглежда, че тя не се използва. При опита ми да я декодирам, получих данни, които изглеждат случайна двоична информация. Всъщност тя се използва две нива на кодиране по-долу. При декодирането на низа подаден на eval() получих следното:

Поиграх си малко с форматирането и поличух следният код:

$lll=0;
eval(base64_decode("JGxsbGxsbGxsbGxsPSdiYXNlNjRfZGVjb2RlJzs="));
$ll=0;
eval($lllllllllll("JGxsbGxsbGxsbGw9J29yZCc7"));
$llll=0;
$lllll=3;
eval($lllllllllll("JGw9JGxsbGxsbGxsbGxsKCRvKTs="));
$lllllll=0;
$llllll=($llllllllll($l[1])<<8)+$llllllllll($l[2]);
eval($lllllllllll("JGxsbGxsbGxsbGxsbGw9J3N0cmxlbic7"));
$lllllllll=16;
$llllllll="";
for(;$lllll<$lllllllllllll($l);){
    if($lllllllll==0){
        $llllll=($llllllllll($l[$lllll++])<<8);
        $llllll+=$llllllllll($l[$lllll++]);
        $lllllllll=16;
    }
    if($llllll&0x8000){
        $lll=($llllllllll($l[$lllll++])<<4);
        $lll+=($llllllllll($l[$lllll])>>4);
        if($lll){
            $ll=($llllllllll($l[$lllll++])&0x0f)+3;
                for($llll=0;$llll<$ll;$llll++)
                    $llllllll[$lllllll+$llll]=$llllllll[$lllllll-$lll+$llll];
                $lllllll+=$ll;
        } else{
        $ll=($llllllllll($l[$lllll++])<<8);
        $ll+=$llllllllll($l[$lllll++])+16;
        for($llll=0;$llll<$ll;$llllllll[$lllllll+$llll++]=$llllllllll($l[$lllll]));
        $lllll++;
        $lllllll+=$ll;
        }
    }else
        $llllllll[$lllllll++]=$llllllllll($l[$lllll++]);
    $llllll<<=1;$lllllllll--;
}
eval($lllllllllll("JGxsbGxsbGxsbGxsbD0nY2hyJzs="));
$lllll=0;
eval($lllllllllll("JGxsbGxsbGxsbD0iPyIuJGxsbGxsbGxsbGxsbCg2Mik7"));
$llllllllll="";
for(;$lllll<$lllllll;){
    $llllllllll.=$llllllllllll($llllllll[$lllll++]^0x07);
}
eval($lllllllllll("JGxsbGxsbGxsbC49JGxsbGxsbGxsbGwuJGxsbGxsbGxsbGxsbCg2MCkuIj8iOw=="));
eval($lllllllll);

Разглеждайки внимателно кода, виждаме, че има няколко base64 низа, но по интересно, виждаме използването на променливи и функции, които не се дефинират в кода (например масива $l и функцията $llllllllllll). За това се насочваме към разкодирането на останалите низове:

$lll=0;
// eval(base64_decode("JGxsbGxsbGxsbGxsPSdiYXNlNjRfZGVjb2RlJzs="));
$lllllllllll='base64_decode'; // decoded
$ll=0;
//eval($lllllllllll("JGxsbGxsbGxsbGw9J29yZCc7"));
$llllllllll='ord'; // decoded
$llll=0;
$lllll=3;
//eval($lllllllllll("JGw9JGxsbGxsbGxsbGxsKCRvKTs="));
$l=$lllllllllll($o); // decoded
$lllllll=0;
$llllll=($llllllllll($l[1])<<8)+$llllllllll($l[2]);
//eval($lllllllllll("JGxsbGxsbGxsbGxsbGw9J3N0cmxlbic7"));
$lllllllllllll='strlen'; // decoded
$lllllllll=16;
$llllllll="";
for(;$lllll<$lllllllllllll($l);){
    if($lllllllll==0){
        $llllll=($llllllllll($l[$lllll++])<<8);
        $llllll+=$llllllllll($l[$lllll++]);
        $lllllllll=16;
    }
    if($llllll&0x8000){
        $lll=($llllllllll($l[$lllll++])<<4);
        $lll+=($llllllllll($l[$lllll])>>4);
        if($lll){
            $ll=($llllllllll($l[$lllll++])&0x0f)+3;
                for($llll=0;$llll<$ll;$llll++)
                    $llllllll[$lllllll+$llll]=$llllllll[$lllllll-$lll+$llll];
                $lllllll+=$ll;
        } else{
        $ll=($llllllllll($l[$lllll++])<<8);
        $ll+=$llllllllll($l[$lllll++])+16;
        for($llll=0;$llll<$ll;$llllllll[$lllllll+$llll++]=$llllllllll($l[$lllll]));
        $lllll++;
        $lllllll+=$ll;
        }
    }else
        $llllllll[$lllllll++]=$llllllllll($l[$lllll++]);
    $llllll<<=1;$lllllllll--;
}
//eval($lllllllllll("JGxsbGxsbGxsbGxsbD0nY2hyJzs="));
$llllllllllll='chr'; // decoded
$lllll=0;
//eval($lllllllllll("JGxsbGxsbGxsbD0iPyIuJGxsbGxsbGxsbGxsbCg2Mik7"));
$lllllllll="?".$llllllllllll(62); // decoded
$llllllllll="";
for(;$lllll<$lllllll;){
    $llllllllll.=$llllllllllll($llllllll[$lllll++]^0x07);
}
//eval($lllllllllll("JGxsbGxsbGxsbC49JGxsbGxsbGxsbGwuJGxsbGxsbGxsbGxsbCg2MCkuIj8iOw=="));
$lllllllll.=$llllllllll.$llllllllllll(60)."?"; // decoded
eval($lllllllll);

От горният код виждаме някой интересни декларации:

  • $llllllllll=’ord’;
  • $lllllllllll=’base64_decode’;
  • $llllllllllll=’chr’;
  • $lllllllllllll=’strlen’;

Всеки от стринговете отговаря на функция в PHP. Ето и какво правят те според документацията на езика:

  • int ord (string $string) – връща ASCII стойността на първият символ от даден низ
  • string base64_decode (string $data) – декодира base64 кодиран низ
  • string chr (int $ascii) – връща низ от еднин символ, чиято ASCII стойност е подадеna като параметър
  • int strlen (string $string) – връща дължината на даден низ

И така заместваме не четимите променливи със съответните им функции и получаваме:

$lll=0;
$ll=0;
$llll=0;
$lllll=3;
//eval(base64_decode("JGw9JGxsbGxsbGxsbGxsKCRvKTs="));
$l=base64_decode($o); // decoded
$lllllll=0;
$llllll=(ord($l[1])<<8)+ord($l[2]);
$lllllllll=16;
$llllllll="";
for(;$lllll<strlen($l);){
    if($lllllllll==0){
        $llllll=(ord($l[$lllll++])<<8);
        $llllll+=ord($l[$lllll++]);
        $lllllllll=16;
    }
    if($llllll&0x8000){
        $lll=(ord($l[$lllll++])<<4);
        $lll+=(ord($l[$lllll])>>4);
        if($lll){
            $ll=(ord($l[$lllll++])&0x0f)+3;
                for($llll=0;$llll<$ll;$llll++)
                    $llllllll[$lllllll+$llll]=$llllllll[$lllllll-$lll+$llll];
                $lllllll+=$ll;
        } else{
        $ll=(ord($l[$lllll++])<<8);
        $ll+=ord($l[$lllll++])+16;
        for($llll=0;$llll<$ll;$llllllll[$lllllll+$llll++]=ord($l[$lllll]));
        $lllll++;
        $lllllll+=$ll;
        }
    }else
        $llllllll[$lllllll++]=ord($l[$lllll++]);
    $llllll<<=1;$lllllllll--;
}
$lllll=0;
//eval(base64_decode("JGxsbGxsbGxsbD0iPyIuJGxsbGxsbGxsbGxsbCg2Mik7"));
$lllllllll="?".chr(62); // decoded
for(;$lllll<$lllllll;){
    "".=chr($llllllll[$lllll++]^0x07);
}
//eval(base64_decode("JGxsbGxsbGxsbC49JGxsbGxsbGxsbGwuJGxsbGxsbGxsbGxsbCg2MCkuIj8iOw=="));
$lllllllll.="".chr(60)."?"; // decoded
eval($lllllllll);

И така получаваме крайната версия на кода. Имената на променливите са доста подобни и бихме могли да продължим с тяхното преименуване за по-голяма четимост. Само че като разгледаме кода малко по внимателно можем да видим, че има поне един безсмислен цикъл. Последният for цикъл всъщност не прави нищо освен да конкатенира към празен низ. Първият цикъл от своя страна прави някакви обработки върху променливата , която беше намерена по-горе, която всъщност е масив. Обработките изглеждат доста безсмислени, тъй като променливите в които се съхраняват данните не се използват извън цикъла.

Ако инцидентно успеете да изпълните PHP кода (както ми се случи няколко пъти по време на писането на тази статия) ще забележите, че обработката на данните е изключително дълга и браузърът ви забива. След известно време Firefox ми даваше възможност да спра изпълнението на скрипта, тъй като не изглежда забил. Явно целта на този код е да направи така, че „хакерите“, които се опитат да го разкодират да си направят страницата не работеща. От моя гледна точка това е леко смешно, не е много трудно да се разбере кой е причинителя и да се премахне.

Аз лично се чудя какво прави първият от двата цикъла. Въпреки че той очевидно няма никакъв ефект върху страницата, може би има някой готин скрит ефект. Например възможно е в някоя от променливите буква по буква да се образува някакъв текст. Но усилието, което би ми коствало да разбера е прекалено голямо за да си струва. Така че вие сте на ход, ако сте по-любопитни от мен :).

P.S. Един доста полезен сайт: http://writecodeonline.com/php/ – с него можете да изпълнявате PHP код онлайн, без да е необходимо да имате сървър. Е има си някой ограничения, но няма как.

Posted in Програмиране | Tagged , , , , | Коментарите са изключени за Декодиране на PHP код обфускиран с NET-TEC PHP-ENCODER V1.0